Delphi компилируется в собственный код, тогда как C # компилируется в код CLR, который затем транслируется во время выполнения. Тем не менее, C # использует JIT-компиляцию, поэтому вы можете ожидать, что время будет более похожим, но это не дано.
Было бы полезно, если бы вы могли описать оборудование, на котором вы его запускали (процессор, тактовая частота).
У меня нет доступа к Delphi, чтобы повторить ваш эксперимент, но я использую нативный 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
Поэтому я считаю, что именно в этом и заключается разница: вы запускали отладочную версию кода C # из IDE.
Если вы думаете, что C ++ особенно медленный, я запустил его как оптимизированную сборку релиза и получил:
C++ (Optimised): 0ms
Это неудивительно, поскольку цикл пуст, и переменная управления не используется вне цикла, поэтому оптимизатор удаляет его полностью. Чтобы избежать этого, я объявил i
как volatile
со следующим результатом:
C++ (volatile i): 2932ms
Я предполагаю, что реализация C # также удалила цикл и что 720 мс - это что-то еще; это может объяснить большую часть различий между таймингами в первом тесте.
Что делает Delphi, я не могу сказать, вы можете посмотреть на сгенерированный код сборки.
Все вышеперечисленные тесты на AMD Athlon Dual Core 5000B 2.60GHz, на Windows 7 32bit.