gpt4 book ai didi

c# - 为什么在 Delphi 中循环比 C# 更快?

转载 作者:太空狗 更新时间:2023-10-29 22:02:23 28 4
gpt4 key购买 nike

德尔福:


procedure TForm1.Button1Click(Sender: TObject);
var I,Tick:Integer;
begin
Tick := GetTickCount();
for I := 0 to 1000000000 do
begin
end;
Button1.Caption := IntToStr(GetTickCount()-Tick)+' ms';
end;

C#:


private void button1_Click(object sender, EventArgs e)
{
int tick = System.Environment.TickCount;
for (int i = 0; i < 1000000000; ++i)
{
}
tick = System.Environment.TickCount - tick;
button1.Text = tick.ToString()+" ms";
}

Delphi 给出了大约 515 毫秒

C# 给出了大约 3775 毫秒

最佳答案

Delphi 被编译为 native 代码,而 C# 被编译为 CLR 代码,然后在运行时进行翻译。那就是说 C# 确实使用 JIT 编译,所以您可能希望时间更相似,但这不是给定的。

如果您能描述运行此程序的硬件(CPU、时钟速率),将会很有用。

我无法访问 Delphi 来重复您的实验,但使用 native C++ 与 C# 和以下代码:

VC++ 2008

#include <iostream>
#include <windows.h>

int main(void)
{
int tick = GetTickCount() ;
for (int i = 0; i < 1000000000; ++i)
{
}
tick = GetTickCount() - tick;
std::cout << tick << " ms" << std::endl ;
}

C#

using System;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int tick = System.Environment.TickCount;
for (int i = 0; i < 1000000000; ++i)
{
}
tick = System.Environment.TickCount - tick;
Console.Write( tick.ToString() + " ms" ) ;
}
}
}

我最初得到:

C++  2792ms
C# 2980ms

但是我随后在 C# 版本上执行了重建并在 <project>\bin\release 中运行了可执行文件和 <project>\bin\debug分别直接从命令行。这产生了:

C# (release):  720ms
C# (debug): 3105ms

所以我认为这才是真正的区别所在,您正在从 IDE 运行 C# 代码的调试版本。

如果您认为 C++ 特别慢,我将其作为优化发布版本运行并得到:

C++ (Optimised): 0ms

这并不奇怪,因为循环是空的,并且控制变量没有在循环外使用,所以优化器将其完全删除。为了避免这种情况,我声明了 i作为volatile结果如下:

C++ (volatile i): 2932ms

我的猜测是 C# 实现也删除了循环,720 毫秒来自其他东西;这可能解释了第一次测试中的大部分时间差异。

Delphi 是干什么的我说不清楚,你可以看看生成的汇编代码看看。

以上所有测试均在 AMD Athlon 双核 5000B 2.60GHz,Windows 7 32 位上进行。

关于c# - 为什么在 Delphi 中循环比 C# 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2662723/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com