Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi langsam (https://www.delphipraxis.net/171702-delphi-langsam.html)

Lyan 20. Nov 2012 20:05

Delphi-Version: 7

Delphi langsam
 
Hallo,

habe mit einem Kollegen mal einen kleinen Test durchgeführt. Wollte mal die performance von inttostr() testen im Vergleich zu itoa() von C++.

Delphi:

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  windows,
  sysutils;

var
  i,j : Integer;
  c, cbuf : DWORD;
  s : AnsiString;
begin
  c := GettickCount;
  for I := 0 to 5650 do begin
    for j := 0 to 9930 do begin
      s := Itoaj);
      s := IntToStr(j-i);
    end;
    cBuf := GetTickCount;
  end;
  cbuf := GetTickCount;
  writeln(cbuf-c);
  readln;
end.
C++

Code:
 int i,j;
 unsigned c, cbuf;
 char s[200];
 c = GetTickCount();
 for(i = 0; i <= 5650; i++){
  for(j = 0; j <= 9930; j++){
   _itoa(j,s,16);
   _itoa(j-i,s,16);
  }
  cbuf = GetTickCount();
 }
 cbuf = GetTickCount();
 printf("%u",cbuf-c);
 Sleep(1000000);
 return 0;

Ergenisses :

http://www0.xup.in/exec/ximg.php?fid=15400968

C++ ~ 9 Sekunden schneller??????

Wie geht das denn?^^

jfheins 20. Nov 2012 20:19

AW: Delphi langsam
 
Tja, das kann schon an kleinen Details liegen.
Ein Punkt ist z.B. dass du sehr oft GetTickCount aufrufst. Du misst also nicht nur die Performance von Inttostr() sondern auch wie schnell dieser API Aufruf geht.
Und dann könntest du es in Delphi auch nochmal mit einem Shortstring probieren. Bei dem Ansistring ist noch ein bisschen Compilermagic drin. :arrow:
Delphi-Quellcode:
String[200]

Ich habe das gerade mal auf die schnelle mit C# nachprogrammiert: In der VM: 15,3s ohne VM 13,3s - ja und?

Lyan 20. Nov 2012 20:26

AW: Delphi langsam
 
Zitat:

Zitat von jfheins (Beitrag 1192128)
Tja, das kann schon an kleinen Details liegen.
Ein Punkt ist z.B. dass du sehr oft GetTickCount aufrufst. Du misst also nicht nur die Performance von Inttostr() sondern auch wie schnell dieser API Aufruf geht.
Und dann könntest du es in Delphi auch nochmal mit einem Shortstring probieren. Bei dem Ansistring ist noch ein bisschen Compilermagic drin. :arrow:
Delphi-Quellcode:
String[200]

Ich habe das gerade mal auf die schnelle mit C# nachprogrammiert: In der VM: 15,3s ohne VM 13,3s - ja und?

hatte es anfangs auch mitnem shortstr.. naja wie auch immer, finds es nur komisch bzw. frage mich wi ich die effiziez steigern könnte.
GetTickcount wird ja auch in C++ aufgerufen..

Bernhard Geyer 20. Nov 2012 20:38

AW: Delphi langsam
 
Und hast du auch bei C++ einen 10 jahre alten Compiler verwendet?

Wenn du dein Delphi pimpen willst schau dir mal das FastCode-Projekt an

AFAIK haben auch Delphi-Versionen die nicht aus der Mittelalter der Entwicklung stammen einige Performance-Boosts bekommen (habe ich vor kurzen beim Performancevergleich Widestring (D6) mit (Unicode-)String von XE2 bemerkt.

himitsu 20. Nov 2012 21:06

AW: Delphi langsam
 
Ersteinmal darfst du keine Äpfel mit Birnen vergleichen :!:

itoa entspricht ja eher den Prozeduren Delphi-Referenz durchsuchenStr und Delphi-Referenz durchsuchenVal,
aber nicht den Funktionen IntToStr und StrToInt.

Eine Variable als VAR-Parameter zuübergeben und "nur" zu verändern ist was total Anderes, als eine zweite Variable komplett neu zu erzeugen und die Andere zu löschen/überschreiben.

Und ich empfehle dir dringend mal FastMM zu besorgen. (in "aktuellen" Delphis ist absichtlich, seit bestimmt schon über 8 Jahren, der alte DelphiMM dadurch ersetzt wurden)

Und Deine Aussage war so auch nicht aussagefähig, denn wenn das Ganze 2 Tage gebraucht hätte, dann wären 5 Seknden garnichts.
PS: Du weißt daß man die Zahlen abschreiben oder gar kopieren und sie "direkt" neben de 5 Sekunde-Bemerkung hätte schreiben können?
(Das Bild war eh nicht nötig, bei den wenigen Informationen)

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

var
  i, j : Integer;
  c, cbuf : DWORD;
  s : AnsiString;
  s2 : ShortString;
begin
  c := GetTickCount;
  for i := 0 to 5650 do
    for j := 0 to 9930 do begin
      s := IntToStr(j);
      s := IntToStr(j-i);
    end;
  cbuf := GetTickCount;
  WriteLn(cbuf-c);

  c := GetTickCount;
  for i := 0 to 5650 do
    for j := 0 to 9930 do begin
      Str(j, s);
      Str(j-i, s);
    end;
  cbuf := GetTickCount;
  WriteLn(cbuf-c);

  c := GetTickCount;
  for i := 0 to 5650 do
    for j := 0 to 9930 do begin
      Str(j, s2);
      Str(j-i, s2);
    end;
  cbuf := GetTickCount;
  WriteLn(cbuf-c);

  ReadLn;
end.

Lyan 21. Nov 2012 19:45

AW: Delphi langsam
 
Zitat:

Und hast du auch bei C++ einen 10 jahre alten Compiler verwendet?
Nunja, bedauerlicherweise war Delphi 2010 noch 3 Sekunden langsamer als D7.

@himitsu
Wieder was gelernt. Str() + ShortString ist dann sogar 1 Sekunde schneller als das C++ Programm..


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz