Avatar billede justincase1089 Nybegynder
23. december 2002 - 17:57 Der er 41 kommentarer og
1 løsning

Sammenligning af programmeringssprog

Hejsa

Er der nogen af jer der ved hvor der er en sammenligning af Delphi's + andre programmeringssprogs hastigheder til rå beregninger?

MVH Justin Case
Avatar billede zuperjmo Nybegynder
23. december 2002 - 18:19 #1
Mener du om der er en samligning mellem delphis og andre programmeringssprog som fx. php, dhtml osv ???
Avatar billede zuperjmo Nybegynder
23. december 2002 - 18:24 #2
eller om der bare er en samligning mellem delfhis og fx. c++, visualbasic ?
Avatar billede arne_v Ekspert
23. december 2002 - 19:25 #3
zuperimo> "rå beregninger" må betyde sammenligning med andre sprog som
C++ !
Avatar billede arne_v Ekspert
23. december 2002 - 19:32 #4
Jeg har faktisk aldrig lavet en benchmark med Delphi.

Men:
  - traditionelt har Borland prioriteret godt udviklings-miljø
    og hurtig compilering fremfor avanceret optimization
  - traditionelt har Pascal sproget aldrig været meget
    brugt til "rå beregninger" (Fortan og C har domineret
    dette område) og derfor har der heller ikke været
    den store grund til at forfine optimeringen

Jeg vil forvente Delphi kode at være 25-33% langsommere end de
bedste C/C++/Fortran compilere, 0-10% langsommere end de
mere jævne C/C++/Fortran compilere, 0-20% hurtigere end Java
og 50-100% hurtigere end VB.

Men er det vigtigt ?

Med den hastighed en 5000 kr. computer har idag, så er det
efterhånden ret sjældent at "Rå beregninger" er en flaskehals.

Det hænder indenfor visse videnskaber (kryptografi, simulationer
etc.), men 99% af computer brugere har ikke den slags behov.
Avatar billede borrisholt Novice
24. december 2002 - 11:56 #5
arne_v >> Der i har du ikke ret. Borland har altid lavet Super fin optimeres Sourcecode. ALLE tests viser at et super optimeret program i C++ er lige så hurtig som et Superoptimeret program i Delphi.

Dog vil jeg give dig ret i din antagelse om kring flaskehals problemer. Problet er som regl din algoritme frem for din kode.

Et meger godt eksempel her på er at Hvis du skal farve nogle pixels i en Bitmap fx. sort så kam nan bruge noget Alla det her :

for i := 0 to 100 do
  Bitmap.Canvas.Pixels[i,0] := clBLack;

Det er en meget langsom måde at gøre tingene på fordi den tegner hele skærmen op hver gang den har sat en pixel. Og ikke fordi en TCanvas er langsom :-)

I stedet for skal man bruge niget alla det her :

{$R-}
Type
  TScanline = array[0..0] of TRGBTriple;

var
  aScanline : TScanline;
begin
  aScanline := TScanline(Bitmap.Scanlines[0]);
  for i := 0 to 100 do
    aScanline[i].red := $FF; 
end;

Alle kode eksempler er skrevet frit fra leveren forvent ikke Delphi forstår det hele :-)

Men Det viser meget godt den der mel algoritmen !! Af indelysende grunde er det hurtigere at opdatere skærmen 1 gang i stedet for 100

Jens B
   
end;
Avatar billede justincase1089 Nybegynder
30. december 2002 - 09:52 #6
Der må være benchmarks på nettet. Alt hvad I har præsenteret indtil videre ved jeg i forvejen. Lad mig komme med et eksempel:

Delphi:

program SpeedTestDelphi;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

var A,B:Double;
    Time:Integer;
    DoubleResult1,DoubleResult0:Double;
    i:Integer;
begin
  A:=37;
  B:=71;

  Time:=GetTickCount;
  DoubleResult1:=0;
  for i:=0 to 1000000000 do
  begin
    DoubleResult0:=100 / Sqrt(A) / Sqrt(B) - (A / B) * (B / A);
    DoubleResult1:=DoubleResult1+DoubleResult0;
  end;
  Time:=GetTickCount-Time;

  Write(Floattostr(Time/1000));
end.

FORTRAN:

Program SpeedTest

  use DFPORT ! for calling RTC

    implicit none

    real*8:: RTCSeconds
    real*8 :: a,b,DoubleResult0,DoubleResult1,timevar0,timevar1
    integer:: i

  A=37
  B=71
  timevar0=RTC()

  DoubleResult1=0.
  do i=0,1000000000
    DoubleResult0=100.0d+0 / Sqrt(A) / Sqrt(B) - (A / B) * (B / A)
    DoubleResult1=DoubleResult1+DoubleResult0
  enddo

  timevar1=RTC()
  write(*,*)'timevar0,timevar1,diff : ',timevar0,timevar1,timevar1-timevar0
  write(*,*)doubleresult0,doubleresult1

end Program SpeedTest

På min computer tager Delphi programmet omkring 400 sekunder at udføre, mens FORTRAN programmet tager 3.5 sekund at udføre. Jeg er ikke i tvivl om, at det har noget at gøre med den måde compileren bygger det hele sammen på, hvor delphi måden nok er lidt mere slavisk og uintelligent end fortran der nok finder løsningen på en eller anden mere analytisk måde.

Eventuelle performance tests fra nettet skal derfor være så snedig opbygget, at intelligente compilere ikke kan snyde.

JEG KAN BARE IKKE FINDE SÅDANNE TESTS.

Vi taler her primært om Delphi, C#, C++, Fortran og VB
Avatar billede arne_v Ekspert
30. december 2002 - 10:38 #7
Øh.

De 2 stykker kode er da ikke identiske !

Delphi:
  DoubleResult0:=100 / Sqrt(A) / Sqrt(B) - (A / B) * (B / A);
                  ^^^

Fortran:
    DoubleResult0=100.0d+0 / Sqrt(A) / Sqrt(B) - (A / B) * (B / A)
                  ^^^^^^^^
Avatar billede arne_v Ekspert
30. december 2002 - 10:39 #8
Hvis Fortran compileren opdager at den kan space de 2 kvadrat-rods
beregninger, så kan det forklare dne store forskel.
Avatar billede arne_v Ekspert
30. december 2002 - 10:40 #9
For ganske vist er det at forvente, at Fortran klarer den slags
beregninger bedre end Delphi. Men ikke så meget !

PS: Hvilken Fortran comiler bruger du ?
Avatar billede justincase1089 Nybegynder
30. december 2002 - 10:40 #10
Der er vel forskel på syntax

Ja, det kan være forklaringen
Avatar billede arne_v Ekspert
30. december 2002 - 10:42 #11
Der er forskel på meningen !

100/sqrt(a)/sqrt(b) skal beregnes

100 + 0/sqrt(A)/sqrt(B) er altid 100
Avatar billede justincase1089 Nybegynder
30. december 2002 - 10:44 #12
100.0d+0 betyder så vidt jeg ved 100 * 10 i nutle, hvilket svarer til 100. Det er bare en syntax ting. Reaultatet af de to beregninger er det samme
Avatar billede borrisholt Novice
30. december 2002 - 10:45 #13
http://www.optimalcode.com/

De laver den slags heledage :-)
Avatar billede justincase1089 Nybegynder
30. december 2002 - 10:47 #14
borrisholt -> Kender godt siden, der står nogle rimelig fede ting derpå. Men der er så vidt jeg ved ikke sammenligninger af sprog ... eller tager jeg fejl
Avatar billede arne_v Ekspert
30. december 2002 - 10:59 #15
Du har ret.

100d+0 bliver opfattet som 100d0.

Jeg troede at det ville blive opfattet som 100.0+0.
Avatar billede justincase1089 Nybegynder
30. december 2002 - 11:00 #16
Jeg ved faktisk ikke hvad fortran compileren hedder andet end noget med compaq. Det var en kollega der lavede programmet for mig.
Avatar billede arne_v Ekspert
30. december 2002 - 11:02 #17
Så er det Compaq Visual Fortran.

Meget god compiler. Compaq arvede Digital Fortran compiler
folk og har derfor 30 års erfaring med Fortran compilere !
Avatar billede borrisholt Novice
30. december 2002 - 11:03 #18
just>> De sammenligner vist ikke .... Jeg skal lige tænke for jeg synes jeg har set sådan noget et sted. Men de der OptimalCode dudes de er næsten lige så dygtig som mig ! ...Nå ja måske de er lidt bedere end mig, men jeg har flere heste !

Jens B
Avatar billede arne_v Ekspert
30. december 2002 - 11:10 #19
Men et godt gæt på årsagen til forskellen vil være at Fortran beregner
sqrt(A) og sqrt(B) udenfor do løkken.
Avatar billede justincase1089 Nybegynder
30. december 2002 - 11:10 #20
Det kan du have ret i
Avatar billede arne_v Ekspert
30. december 2002 - 11:12 #21
Du kunne jo prøve selv at flytte dem udenfor i både Delphi og Fortran koden og
så sammenligne resultaterne.

Hvis de er indenfor +-25% så er det det !
Avatar billede justincase1089 Nybegynder
30. december 2002 - 11:22 #22
Ja, det vil jeg gøre, men jeg har desværre ikke selv fortran compileren installeret, så jeg har ændret i delphi koden:

...
  A:=Sqrt(37);
  B:=Sqrt(71);
...
    DoubleResult0:=100 / A / B - (A / B) * (B / A);
...

Fortran : 3.53499996 sekunder
Delphi : 247.345 sekunder

P.S. Jeg er helt enig i, at rå beregningskraft normalt ikke er et issue. Jeg arbejder med numeriske modeller.
Avatar billede borrisholt Novice
30. december 2002 - 11:46 #23
Just >> Jeg har ikke lige testet din kode nærmer men du MÅ have jokket i noget ... Delphi er ikke 100 X langsommere !

Jens B
Avatar billede justincase1089 Nybegynder
30. december 2002 - 12:01 #24
Jeg gentager lige den kode der svarer til ovenstående og med antagelse af, at Fortran beregner Sqrt udenfor løkken.

Delphi :
243,71 Sek
DoubleResult0: 0,951057027596422
DoubleResult1: 951057045,465043

Fortran:
3.56499993801117 Sek
DoubleResult0: 0.951057027596422       
DoubleResult1: 951057024.626963

Delphi Kode:
program SpeedTestDelphi2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

var A,B:Double;
    Time:Integer;
    DoubleResult1,DoubleResult0:Double;
    i:Integer;
begin
  A:=Sqrt(37);
  B:=Sqrt(71);

  Time:=GetTickCount;
  DoubleResult1:=0;
  for i:=0 to 1000000000 do
  begin
    DoubleResult0:=100 / A / B - (A / B) * (B / A);
    DoubleResult1:=DoubleResult1+DoubleResult0;
  end;
  Time:=GetTickCount-Time;

  WriteLn(Floattostr(Time/1000));
  WriteLn(Floattostr(DoubleResult0));
  WriteLn(Floattostr(DoubleResult1));
end.

Fortran Kode:
Program SpeedTest

  use DFPORT ! for calling RTC

    implicit none

    real*8:: RTCSeconds
    real*8 :: a,b,DoubleResult0,DoubleResult1,timevar0,timevar1
    integer:: i

  A=37
  B=71
  timevar0=RTC()

  DoubleResult1=0.
  do i=0,1000000000
    DoubleResult0=100.0d+0 / Sqrt(A) / Sqrt(B) - (A / B) * (B / A)
    DoubleResult1=DoubleResult1+DoubleResult0
  enddo

  timevar1=RTC()
  write(*,*)'timevar0,timevar1,diff : ',timevar0,timevar1,timevar1-timevar0
  write(*,*)doubleresult0,doubleresult1

end Program SpeedTest

Jeg mener ikke selv, at jeg har jogget i det.
Avatar billede arne_v Ekspert
30. december 2002 - 12:59 #25
På min PC får jeg 51 sek. og hvsi jeg flytter:
DoubleResult0:=100 / A / B - (A / B) * (B / A);
udenfor løkken så får jeg 7.4 sek. !
Avatar billede justincase1089 Nybegynder
30. december 2002 - 13:17 #26
Lad mig sende fortran programmet, så du kan lave en sammenligning.
Avatar billede justincase1089 Nybegynder
30. december 2002 - 13:18 #27
Din computer er formentlig også hurtigere end min laptop
Avatar billede arne_v Ekspert
30. december 2002 - 15:17 #28
Athlon XP 2000 (1667 MHz)
Avatar billede justincase1089 Nybegynder
30. december 2002 - 15:47 #29
p3 600
Avatar billede arne_v Ekspert
30. december 2002 - 15:50 #30
Det passer jo meget godt 2000/600 og 243/51 er ikke så langt
fra hinanden.
Avatar billede justincase1089 Nybegynder
30. december 2002 - 15:51 #31
Enig, men det ændrer ikke på det underlige i den store hastighedsforskel på Delphi og Fortran
Avatar billede arne_v Ekspert
30. december 2002 - 15:55 #32
Nope.

Men jeg ved ikke rigtigt, hvad der kan gøres ved det.
Avatar billede justincase1089 Nybegynder
30. december 2002 - 15:57 #33
Ikke nødvendigvis noget. Jeg var bare nysgerrig efter steder på nettet, hvor der var udført grundige tests af de forskellige programmeringsmiljøer med vægt på performance.
Avatar billede arne_v Ekspert
30. december 2002 - 15:57 #34
Lige netop det stykke kode er Delphi tilsyndeladende ret dårlig til
at optimere (det for ike flyttet konstant delene af udtrykket udenfor
lykken).

Og vi kan jo ikke lave en Delphi 8 her og nu.

Men søger du efter en bedre benchmark end dit eget program ?
Avatar billede justincase1089 Nybegynder
30. december 2002 - 16:00 #35
Jeg søger efter sammenligninger, hvor compilerne ikke snyder undervejs.

I princippet kunne jeg bare smide en Sqrt(Sin(i)) og Sqrt(Cos(i)) ind i stedet for Sqrt(A) og Sqrt(B).

Aligevel kan man jo se af løkken, at bare oveaheadet ved at køre igennem løkken er betydelig større end i Fortran, også selvom Fortran gør noget i løkken.
Avatar billede arne_v Ekspert
30. december 2002 - 16:05 #36
Der er jo alle de klassiske benchmarks fra før SPEC: dhrystone,
whetstone, livermoore, linpack.

Men den eneste jeg kan finde i Pascal er dhrystone og hvis jeg
husker rigtigt (det er 10-15 år siden) så er dhrystone integer
performance og ikke FP performance.

Så du kan nok ligeså godt prøve at forbedre dit eget program.
Avatar billede justincase1089 Nybegynder
30. december 2002 - 16:07 #37
At jeg forbedrer mit program er ikke løsningen på mit spørgsmål.

Jeg var nysgerrig efter steder på nettet, hvor der var udført tests af de forskellige programmeringsmiljøer med vægt på performance.
Avatar billede arne_v Ekspert
30. december 2002 - 16:12 #38
Jeg lavede engang en sammenligning Fortran-C-Pascal-assembler
på nogle floating point beregninger.

På VMS platform - ikke PC.

Du kan se resultater på:
  http://80.199.19.48/anonymous/bm/result.dat
Avatar billede arne_v Ekspert
30. december 2002 - 16:13 #39
Du kan også hente kilde-koden:
  http://80.199.19.48/anonymous/bm/bm.zip
og rette den til så den kører på PC.

Men min kode er jo ikke mere "rigtig" end din kode.
Avatar billede arne_v Ekspert
30. december 2002 - 16:30 #40
Det er hverken Delphi eller FP men:
  http://www.eksperten.dk/spm/295601
Avatar billede justincase1089 Nybegynder
30. december 2002 - 16:36 #41
Hmm ... tak for oplysningerne. Det er interessant at se, men som du selv siger er det ikke så delphi relateret. Selvom du gør dit bedste for at svare vil jeg ikke give dig pointene. For jeg må ikke oprette spørgsmålet igen.
Avatar billede justincase1089 Nybegynder
08. april 2003 - 15:24 #42
Tjaa .. det var det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester