用了好久的D7,刚装了个XE7,为什么运算速度还是D7上快

shuaialang 2015-01-15 01:07:37
最近XE7挺火的,刚吃得空
在D7跟XE7里都执行了一下如下代码


procedure TForm1.Button1Click(Sender: TObject);
var
i,j:longint;
ta,tb:TTimeStamp;
begin
ta:=DateTimeToTimeStamp(now);
j:=0;
for i := 0 to 1000000000 do
j:=j+1;
tb:=DateTimeToTimeStamp(now);
ShowMessage(IntToStr(j));
ShowMessage(inttostr(tb.Time-ta.Time));
end;


XE7的结果为


D7下的结果为


是我代码有问题还是XE7有啥新特性我不晓得。
为毛XE7这么慢。
...全文
743 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2015-01-18
  • 打赏
  • 举报
回复
上贴(11楼)有误,及时更正: Debug 和 Release 的区别: 1、Release和Debug版本的区别在于是否存在调试信息。 2、Release实行优化省略;而Debug严格执行代码,并加入相关调试信息。 因而它们生成的文件尺寸区别较大。 经上机测试,下述代码: while i<100000000 do begin end; Release执行省略;Debug严格执行代码,即使空循环,也执行无误。 XE7在Release执行优化省略,执行时间990毫秒; Debug下严格执行代码,执行时间3000毫秒。
lyhoo163 2015-01-18
  • 打赏
  • 举报
回复
Debug 和 Release 的最大区别,Release和Debug版本的区别在于是否存在调试信息,因而它们生成的文件尺寸区别较大。 至于上面讲的循环代码是否省略,与Release和Debug版本无关。 while i<100000000 do begin i:=J; end; 不管Release和Debug,省略优化,只执行一步i:=j。
lyhoo163 2015-01-18
  • 打赏
  • 举报
回复
感谢9楼的提醒。 我的观点: 1、Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。 2、Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。 3、Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。 4、Release和Debug版本的区别在于是否存在调试信息。 5、本贴讲的优化,有点特殊,不是我们通常说的Release优化。而是“优化”到省略执行代码。象循环代码,只要循环内部执行代码不是空(有效的),执行循环的步数是不会被省略的。只有内部执行代码无效才能省略(优化)。 如: while i<100000000 do // 省略优化,只执行一步i:=j begin i:=J; end; 如: while i<100000000 do // 不能被省略优化每步都执行 begin i:=i+1; j:=j+1; end;
FlashDance 2015-01-16
  • 打赏
  • 举报
回复
@lyhoo163 6楼用D7测试一下4楼的代码,看看“Caption:='OK';”以上的部分能否被D7优化掉
lyhoo163 2015-01-16
  • 打赏
  • 举报
回复
  for i:=0 to 100000000*10 do
    j:=j+1;
改成For循环: 在D7编译显示1073,由XE7编译显示4038。
lyhoo163 2015-01-16
  • 打赏
  • 举报
回复
VAR i,j:integer;
    ta,tb:TTimeStamp;
begin
  ta:=DateTimeToTimeStamp(now);
  i:=0;
  j:=0;
  while i<100000000 do
  begin
    i:=i+1;
    j:=j+1;
  end;
  Edit1.Text:=inttostr(j);
  tb:=DateTimeToTimeStamp(now);
  Edit2.Text:=inttostr(tb.Time-ta.Time);
上述代码在D7编译显示178,由XE7编译显示425。 while i<100000000*10 do D7编译显示1103,由XE7编译显示4083。
pathletboy 2015-01-16
  • 打赏
  • 举报
回复
引用 5 楼 lyhoo163 的回复:
VAR i,j:integer;
    ta,tb:TTimeStamp;
begin
  ta:=DateTimeToTimeStamp(now);
  i:=0;
  j:=0;
  while i<100000000 do
  begin
    i:=i+1;
    j:=j+1;
  end;
  Edit1.Text:=inttostr(j);
  tb:=DateTimeToTimeStamp(now);
  Edit2.Text:=inttostr(tb.Time-ta.Time);
上述代码在D7编译显示178,由XE7编译显示425。 while i<100000000*10 do D7编译显示1103,由XE7编译显示4083。
Release版本结果一样的,XE7默认是DEBUG配置,代码没优化的,你自己改成release再编译试试就知道了。
lyhoo163 2015-01-16
  • 打赏
  • 举报
回复
经D7测试,不被优化。
FlashDance 2015-01-15
  • 打赏
  • 举报
回复


D7的编译器优化好像能把“Caption:='OK';”上面的代码全忽视掉
xe7的不能了

现在没有D7,楼主试一下告诉我们结果吧
武稀松 2015-01-15
  • 打赏
  • 举报
回复
D7默认优化. XE7默认关闭优化.可以在选项里面打开,也可以选Release编译
shuaialang 2015-01-15
  • 打赏
  • 举报
回复
引用 1 楼 FlashDance 的回复:
D7开编译优化了,XE7没开编译优化 for循环中没有实际使用值,开了编译优化后for循环根本不会执行,而是直接得到结果
谢谢
FlashDance 2015-01-15
  • 打赏
  • 举报
回复
D7开编译优化了,XE7没开编译优化 for循环中没有实际使用值,开了编译优化后for循环根本不会执行,而是直接得到结果

829

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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