关于性能,是不是我写错了,竟然差这么多

bamboo2000 2010-01-12 03:39:50
认为Delphi性能比C#好,于是打算做成DLL让C#调用,但只是"认为"没有数据,性能好多少,数据为准,于是有了下面的测试
C# 页面,分别用C#和调用Delphi的DLL和调用C++的DLL
======================================
int k = 999999999;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int i;
for (i = 0; i < k; i++) ;
sw.Stop();
Response.Write( "<br />#:" + i.ToString() + ":" + sw.ElapsedMilliseconds.ToString() );

System.Diagnostics.Stopwatch sw3 = new System.Diagnostics.Stopwatch();
sw3.Start();
i = VC_test(k);
sw3.Stop();
Response.Write("<br />C:" + i.ToString() + ":" + sw3.ElapsedMilliseconds.ToString());

System.Diagnostics.Stopwatch sw2 = new System.Diagnostics.Stopwatch();
sw2.Start();
i = Del_test(k);
sw2.Stop();
Response.Write("<br />D:" + i.ToString() + ":" + sw2.ElapsedMilliseconds.ToString());


Delphi代码如下:
================================
library Project2;

function Del_test(i: integer):integer;stdcall;
var
j: integer;
begin
for j:=0 to i do;
result:=j;
end;

exports
Del_test;

begin
end.

VC代码如下:
===================================
extern "C"__declspec(dllexport)int _stdcall VC_test(int init);
int _stdcall VC_test(int init){
int i;
for(i=0;i<=init;i++);
return i;
}

测试结果如下:
===================================
#:999999999:3747
C:1000000000:10
D:1000000000:485


C++ 跟 Delphi怎么差这么多啊??我一直钟爱Delphi的,哪个地方错了啊,太失望了!!
另外说一点,我是刷新了好几下,结果的数字都差不多,所以随便取了一组,没有求平均值
...全文
140 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bamboo2000 2010-01-12
  • 打赏
  • 举报
回复
谢谢朋友们!!
同时也对delphi的成绩非常满意. :)
starluck 2010-01-12
  • 打赏
  • 举报
回复
bamboo2000 2010-01-12
  • 打赏
  • 举报
回复
参考8楼,12楼的,重新写了Delphi和C的dll,这次应该是正常的结果了
C:999999999:947
D:999999999:908

delphi代码:
===================
function Del_test(count: integer):integer;stdcall;
var
i,j: integer;
begin
j:=0;
for i:=0 to count do j:=i;
result:=j;
end;

vc++代码
===============================
extern "C"__declspec(dllexport)int _stdcall VC_test(int count);
int _stdcall VC_test(int count){
int j=0;
for(int i=0;i<=count;i++)j=i;
return j;
}
Harryfin 2010-01-12
  • 打赏
  • 举报
回复
楼上好眼力... OTL
starluck 2010-01-12
  • 打赏
  • 举报
回复



extern "C"__declspec(dllexport)int _stdcall VC_test(int init);
int _stdcall VC_test(int init){
int i;
int Result ;
for(i=0;i <=init;i++);
Result = i;
return = Result ;
}


//如果你要反应真实情况,至少应该这样写. 虽然这样有可能出现部分编译器优化,结果与你上面的结果相同.

但你前面的写法根本就是错的.

starluck 2010-01-12
  • 打赏
  • 举报
回复
DELPHI的不是没有返回,而是返回0

你要想测试且有结果,那你的C的写法就不能在 for (;;) 中直接 return
bamboo2000 2010-01-12
  • 打赏
  • 举报
回复
8楼说的有一定可能性.
bamboo2000 2010-01-12
  • 打赏
  • 举报
回复
delphi的result语句改为exit后不能正常得到返回值,所以得到的结果如下:
#:999999999:3636
C:1000000000:0
D:220210:456
C++的,第一次运行显示47,以后刷新,都是显示0
haitao 2010-01-12
  • 打赏
  • 举报
回复
这种空循环,会不会不同的编译器,优化的程度不同,
有些编译器可能直接跳过了,所以特别快?
starluck 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bamboo2000 的回复:]
回楼上, 什么都没有做, 同样delphi的循环中, 也是什么都没有做!
[/Quote]

还没明白?
kfcoffe 2010-01-12
  • 打赏
  • 举报
回复
up
bamboo2000 2010-01-12
  • 打赏
  • 举报
回复
回楼上, 什么都没有做, 同样delphi的循环中, 也是什么都没有做!
starluck 2010-01-12
  • 打赏
  • 举报
回复


在 C里的 return 与 pascal 的 result 是不一样的. 后者你直接加个 Exit ;
starluck 2010-01-12
  • 打赏
  • 举报
回复
extern "C"__declspec(dllexport)int _stdcall VC_test(int init);
int _stdcall VC_test(int init){
int i;
for(i=0;i <=init;i++);
return i;
}


改成:
int _stdcall VC_test(int init){
int i;
for(i=0;i <=init;i++);
return i; // 你能告诉我这里做了什么?
}
bamboo2000 2010-01-12
  • 打赏
  • 举报
回复
我弄的这些没有调用API,就是一个循环
CCC的 2010-01-12
  • 打赏
  • 举报
回复
难道是因为delphi封装了的原因?delphi其实还是调用的windows的API,而API又是用C写的,所以要经过一些转换,我是这样认为的

16,749

社区成员

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

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