问个基础的问题。

miky 2004-07-04 10:40:21
代码1:

var
a,b,c:single;
begin
a := 0.05 * pi;
b := 10 + a;
c := 10 - a;
end;

代码2:
var
b,c:single;
begin
b := 10 + 0.05 * pi;
c := 10 - 0.05 * pi;
end;

以上哪个代码好?速度快?1只用计算一次0.05*pi,但多了参数,分配空间,寻址也需要时间的吧,也不知道Delphi如何来优化代码,说不定他也自动给你弄个临时变量。
...全文
163 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eastunfail 2004-07-07
  • 打赏
  • 举报
回复
那你自己设一个断点,执行到那里的时候掉出CPU窗口自己看指令数目不久可以了
miky 2004-07-06
  • 打赏
  • 举报
回复
对,我给的例子不对,假设0。05是变量。
SGP 2004-07-06
  • 打赏
  • 举报
回复
如果pi是常量,那么a := 0.05 * pi是不是应该在编译期就被优化掉了?那么两段代码有什么区别?
关注...
caoguanlei520 2004-07-06
  • 打赏
  • 举报
回复
你好 你能帮我吗?我是delphi的爱好者,可以告诉我string 和stringlist的区别?怎么用吗?还有:if语句 怎么用?
graycarl 2004-07-06
  • 打赏
  • 举报
回复
var
Form1: TForm1;
b1,c1:single;
implementation

{$R *.dfm}
procedure proc1;
var
a,b,c:single;
begin
a := 0.05 * pi;
b := 10 + a;
c := 10 - a;
b1:=b;
c1:=c;
end;
procedure proc2;
var
b,c:single;
begin
b := 10 + 0.05 * pi;
c := 10 - 0.05 * pi;
b1:=b;
c1:=c;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var c,i:DWORD;
begin
c := GetTickCount;
for i:=0 to 100000000 do
begin
proc1;
end;
ListBox1.Items.Add(IntToStr(GetTickCount-c));
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var c,i:DWORD;
begin
c := GetTickCount;
for i:=0 to 100000000 do
begin
proc2;
end;
ListBox1.Items.Add(IntToStr(GetTickCount-c));
end;

第一个大概1200 第二个大概800
fj218 2004-07-06
  • 打赏
  • 举报
回复
第二种
Eastunfail 2004-07-06
  • 打赏
  • 举报
回复
个人认为是第二个。
编译器在给你编译的时候应该将0.05 * pi直接计算出来,那么第二个代码只需要2次访问内存(直接付值),而第一个则至少3次。
miky 2004-07-06
  • 打赏
  • 举报
回复
用GetTickCount函数测试一下不就知道了吗?

不知道原理不爽啊。GetTickCount只能计算经过了多少时间,太不准确,一两行语句测不出来,多了受系统影响,如果系统忙,结果很不精确。
WuChenCan 2004-07-06
  • 打赏
  • 举报
回复
用GetTickCount函数测试一下不就知道了吗?
miky 2004-07-06
  • 打赏
  • 举报
回复
顶一顶
zousoft 2004-07-04
  • 打赏
  • 举报
回复
代码1一共执行了1+4+4=9条汇编指令;代码2只执行了2条汇编指令。
估计代码2效率高。
cronuz 2004-07-04
  • 打赏
  • 举报
回复
作两个线程,分別装入上述两種代码、執行一下就知道了。
aiirii 2004-07-04
  • 打赏
  • 举报
回复
http://dunit.sourceforge.net/README_CHT.html
aiirii 2004-07-04
  • 打赏
  • 举报
回复
我估计,在delphi优化后,你给的两段代码,汇编代码是一样的
aiirii 2004-07-04
  • 打赏
  • 举报
回复
写了段duint的代码测试下,几乎没有区别

type
TTestCaseFirst = class(TTestCase)
private

protected
// procedure SetUp; override;
// procedure TearDown; override;
published
// Test methods
procedure TestSingle1;
procedure TestSingle2;
end;

implementation

{ TResourceItemTests }

procedure TTestCaseFirst.TestSingle1;
var
a,b,c:single;
begin
a := 0.05 * pi;
b := 10 + a;
c := 10 - a;
Check(b=20-c, 'TestSingle1 failure!');
end;

procedure TTestCaseFirst.TestSingle2;
var
b,c:single;
begin
b := 10 + 0.05 * pi;
c := 10 - 0.05 * pi;
Check(b=20-c, 'TestSingle1 failure!');
end;

initialization
TestFramework.RegisterTest(TTestCaseFirst.Suite);

end.

两个函数,用时:
0:00:00.025
0:00:00.024

duint 的介绍在这里
miky 2004-07-04
  • 打赏
  • 举报
回复
看来大家对细节没什么兴趣啊,大处别人都帮我们做好了,不研究一下细节吗?
miky 2004-07-04
  • 打赏
  • 举报
回复
to yq3woaini(hahhajing(一星奋斗中...))
纳秒级都不够。

to aiirii(ari-爱的眼睛)
duint 是什么,麻烦指点?


但测试没什么意义,只是想了解原因。
aiirii 2004-07-04
  • 打赏
  • 举报
回复
用 duint 测试下就可知性能
飞天揽月 2004-07-04
  • 打赏
  • 举报
回复

●procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute,

ASecond, AMilliSecond: Word);

描述:
DecodeDateTime 方法根据TDateTime类型参数AValue 得到相应的年份、月份、日子、小时、分、秒、毫秒。

判断毫秒级的速度
飞天揽月 2004-07-04
  • 打赏
  • 举报
回复
你可以用得到时间测试一下呀
加载更多回复(3)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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