Moin zusammen,
Hauptsächlich programmier ich zwar nur noch mit C#,
Aber weil ich dort wegen nem Performance-Problem, einige Basic Tests gemacht habe,
hat mich auch interessiert, wie die Performance im Vergleich zu Delphi aussieht.
Und es hat mich doch sehr verwundert
Vorne Weg:
Für den Test bei C# hab ich die neueste(last patch) VS2019
Ide genommen,
Target App: Standard 4.7.2, Konsole, x86, Release (kein debugging...)
(Zeit messen per Stopwatch)
Für den Test unter Delphi:
XE10.1(Berlin) Konsole, X86, Kein Debugging, Optimierung Aktiv
(Zeit messen per JclCounter)
Zusatzttest:
Auch unter Delphi7 gemacht.
Der Test der mich interessiert hat, ist anfür sich recht simple:
Delphi-Quellcode:
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF
program BenchmarkCallSpeed;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, JclCounter;
var
s:
string;
tc:TJclCounter;
i:integer;
itotal:integer;
x:integer;
totalSecs:double;
const Iterations=1000000000;
const TestTarget=100;
function foo(x:integer):integer;
begin
result:=x*3;
end;
function fooInline(x:integer):integer;
inline;
begin
result:=x*3;
end;
begin
try
totalSecs:=0;
tc:=TJclCounter.Create(true);
Writeln('
Start');
for itotal := 1
to TestTarget
do
begin
x:=3;
tc.Stop;
tc.Start;
for i := 0
to Iterations-1
do
begin
x:=foo(x);
//x:=fooInline(x);
end;
tc.Stop;
totalSecs:=totalSecs+tc.ElapsedTime;
Writeln('
Step: '+itotal.ToString()+'
= '+tc.ElapsedTime.ToString()+ '
sec X: '+IntToStr(x));
end;
Writeln('
TOTAL~: '+(totalSecs/TestTarget).ToString());
tc.Free;
Writeln('
ENDE');
Readln(s);
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
end.
Ich glaub das ganze ist ja so simpel, dass es jeder verstehen sollte
Ergebnis ist jetzt folgendes:
EDIT!!!!! Die Zeiten angepasst, nachdem X auch noch benutzt wird!
DELPHI XE10.1:
100 Tests
Durchschnitt : 2,360 sekunden
CPU auslastung : 35%~
DELPHI 7:
100 Tests
Durchschnitt : (neuer kommt noch) sekunden
CPU auslastung : 35%~
C#
100 Tests
Durchschnitt : 0,7227 sekunden
CPU auslastung : 35-50%~
C# .Net Core 3.0
100 Tests :
Durchschnitt : (neuer kommt noch) sekunden
CPU auslastung : 35-50%~
Ich finde das extrem krass!
Ich hätte ja gesagt, wegen JIT Code vs Native, wäre da Delphi wahrscheinlich schneller, bzw gleichauf.
aber 4x langsamer?
Was meint ihr dazu?
EDIT:
Falls es jemand selber mit C# vergleichen will...
Wichtig ist aber! Auf Release Testen! das macht nen gewaltigen Unterschied aus.
Code:
public static int Foo(int x)
{
return x * 3;
}
static void Main(string[] args)
{
//Dauertest von Normal
const int Iterations = 1000000000;
int x = 0;
int testtarget = 100;
double timeges = 0;
System.Diagnostics.Stopwatch sw;
Console.WriteLine($"Start:");
Console.WriteLine($"init: {Foo(3)}"); //JIT init, erste ergebnis sonst evtl verfälscht
for (int itotal = 1; itotal <= testtarget; itotal++)
{
x = 3;
sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < Iterations; i++)
{
x = Foo(x);
}
sw.Stop();
timeges = timeges + sw.ElapsedMilliseconds;
Console.WriteLine($"Step: {itotal} = {sw.ElapsedMilliseconds/1000d} X: {x}" );
}
Console.WriteLine($"TOTAL: {timeges / testtarget/1000d} ms~");
}
Edits:
-.Net Core 3.0 hinzugefügt
-Stevie hat darauf hingewiesen, das ja wegen optimierung, die X variable wenigstens 1x benutzt werden muss, daher angepasst, fürs archiv XD