如何编译出快速的程序

bobogg 2014-09-23 05:37:05
var
G: double ;
TT: Longint ;
begin

TT := GetTickCount;
G:=1;
for i := 1 to 10000000 do begin
G := G * 0.999;
end;

edit2.Text := FormatFloat('0.00',GetTickCount -TT ) ;

end;

1000 万转 = 2 秒 ( 使用 Run -> Run Without Debugging )

同样的 Code 用 VB6 1000 万转 = 0.018 秒

delphi 不可能这么慢啊

我要如何编译才能加快呢 (如何设定编译选项呢)
...全文
158 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobogg 2014-09-26
  • 打赏
  • 举报
回复
引用 7 楼 wr960204 的回复:
另外整数运算VB则完全不是Delphi的对手.
Private Declare Function GetTickCount Lib "kernel32" () As Long


Private Sub Command1_Click()

Dim G As Long
Dim TT As Long
Dim i As Long

TT = GetTickCount()
G = 1
For i = 1 To 10000000 Step 1
   If G < &HFFFFFF Then
     G = G * 2
   Else
     G = G / 2
   End If
Next

Me.Caption = "G=" + Str(G) + "  耗时:" + Str(GetTickCount - TT)


End Sub

var
  G: Integer;
  TT: Longint;
  i: Integer;
begin

  TT := GetTickCount;
  G := 1;
  for i := 1 to 10000000 do
  begin
    if G< $FFFFFF then
      G := G * 2
    else
      G := G div 2;
  end;

  Caption := 'G='+ FloatToStr(G)  + ' 耗时: '+ Inttostr(GetTickCount - TT);

end;
但是Delphi64反而比Delphi32慢一些.... Delphi32 Delphi64 VB6 15 45 171
迟了一步 我结帖了, 无法分给你分数 感谢您的测试 整数先前我有测试过, 输 delphi 很多 内存 Array 读写, Call Sub vb 也输 delphi 很多
bobogg 2014-09-26
  • 打赏
  • 举报
回复
引用 8 楼 DelphiGuy 的回复:
如果编译器能自动优化成 G := Power(0.999, 10000000); 那就太流弊...
迟了一步 我结帖了, 无法分给你分数 感谢您的测试 整数先前我有测试过, 输 delphi 很多 内存 Array 读写, Call Sub vb 也输 delphi 很多
  • 打赏
  • 举报
回复
如果编译器能自动优化成 G := Power(0.999, 10000000); 那就太流弊...
武稀松 2014-09-23
  • 打赏
  • 举报
回复
另外整数运算VB则完全不是Delphi的对手.
Private Declare Function GetTickCount Lib "kernel32" () As Long


Private Sub Command1_Click()

Dim G As Long
Dim TT As Long
Dim i As Long

TT = GetTickCount()
G = 1
For i = 1 To 10000000 Step 1
   If G < &HFFFFFF Then
     G = G * 2
   Else
     G = G / 2
   End If
Next

Me.Caption = "G=" + Str(G) + "  耗时:" + Str(GetTickCount - TT)


End Sub

var
  G: Integer;
  TT: Longint;
  i: Integer;
begin

  TT := GetTickCount;
  G := 1;
  for i := 1 to 10000000 do
  begin
    if G< $FFFFFF then
      G := G * 2
    else
      G := G div 2;
  end;

  Caption := 'G='+ FloatToStr(G)  + ' 耗时: '+ Inttostr(GetTickCount - TT);

end;
但是Delphi64反而比Delphi32慢一些.... Delphi32 Delphi64 VB6 15 45 171
武稀松 2014-09-23
  • 打赏
  • 举报
回复
代码我试验了,确实比VB慢一点.Delphi是1.9秒.VB是1.6秒. 这个是没法子的事情Delphi的编译器对浮点运算完全没有优化,怎么写就怎么编译.从Delphi1到现在都是不优化浮点的. 而VB6和VC6是共享编译后端的.在浮点方面有优化. 如果你用高版本的VC,优化全部开这个简单循环更夸张,VC编译器会直接帮你把简单循环的结果计算出来.这样就一行指令赋值结果给G. 虽然Delphi的编译浮点一直是不优化的,但是Delphi64位编译器是重写的,后端使用了LLVM优化.LLVM可以说是目前最强的编译器优化. 这个算法我同样试了一下 Delphi32 VB6 Delphi64 1.9s 1.6s 0.3s

Private Declare Function GetTickCount Lib "kernel32" () As Long


Private Sub Command1_Click()

Dim G As Double
Dim TT As Long
Dim i As Long

TT = GetTickCount()
G = 1
For i = 1 To 10000000 Step 1
   G = G * 0.999
Next

Me.Caption = "G=" + Str(G) + "  耗时:" + Str(GetTickCount - TT)


End Sub

var
  G: double;
  TT: Longint;
  i: Integer;
begin

  TT := GetTickCount;
  G := 1;
  for i := 1 to 10000000 do
  begin
    G := G * 0.999;
  end;

  Caption := 'G='+ FloatToStr(G)  + ' 耗时: '+ Inttostr(GetTickCount - TT);

end;
  • 打赏
  • 举报
回复
1. 开优化,{$O+} {$D-} {$L-} 2. 不要在IDE里运行,编译成exe后单独运行这个exe.。 2秒得多慢哪,你的什么电脑?不会是中毒了吧。我用农企的廉价APU电脑测试,0.015秒,显然是GetTickCount的精度不够了,改用QueryPerformancePfrquency、QueryPerformanceCounter计时间,0.005秒。没有VB,所以无法对比。
bobogg 2014-09-23
  • 打赏
  • 举报
回复
引用 3 楼 DelphiGuy 的回复:
edit2.Text := FormatFloat('0.00',(GetTickCount -TT ) / 1000.0) ;
hi ~ 除以 1000 这个我知道 edit2.Text 显示的值 = 2016 我写在这里时, 我已经把它除以 1000 了 也就是我上面写ˇ的 2.016 秒 这部分是我不好, 让你误解以为没有除以 1000 我写的 2秒, 2.016秒 已经除以过1000 了
  • 打赏
  • 举报
回复
edit2.Text := FormatFloat('0.00',(GetTickCount -TT ) / 1000.0) ;
bobogg 2014-09-23
  • 打赏
  • 举报
回复
引用 1 楼 pathletboy 的回复:
Set8087CW($027F); 运行前加上这句试试看
thank you ~ 没有任何改变, 还是2.016 秒
pathletboy 2014-09-23
  • 打赏
  • 举报
回复
Set8087CW($027F); 运行前加上这句试试看

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧