Søger du en specifik kategori?

 



Oprettet tor. d. 05. februar 2009 kl. 15:31

arne_v
arne_v (1.005.398 point)
Guidens karaktér
1
2
3
4
5

Hvilket sprog er hurtigst

Denne artikel forsøger at aflive forskellige myter om hvilke sprog der er hurtigst. Den forudsætter ikke noget særligt.
Historie:
V1.0 - 14/01/2004 - original
V1.1 - 31/01/2004 - forbedret formatering
V1.2 - 07/04/2004 - lave gruppering for at tydeliggøre resultaterne
Påstande og fakta
Et ofte stille spørgsmål blandt programmører er
"hvilket sprog er hurtigst?".

Og mange har meget bestemte meninger:
  - C++ er hurtigere end Delphi
  - Java er langsomt i forhold til native
  - .NET er ligeså langsomt som Java
  - gratis compilere er meget langsommere end kommercielle
  etc.etc.

Jeg har lavet et lille eksempel til at undersøge sagen.

Der er både en integer og en floating point version.

Det er ikke nogen perfekt bencmark. Det er et meget
meget lille program.

Men:
  - det er så nemt at man kan kode en version i
    ethvert sprog som måtte mangle hvis man vil
    sammenligne
  - det er godt nok til faktisk at give forskelle

Lad os se nogen resultater.

Testene er lavet på en Athlon XP 2000+ (1667 MHz) med
512 MB RAM og Windows 2000 Professional.

Integer test:

  SUN JVM 1.3.1 = 30 seconds
  SUN JVM 1.4.2 = 5 seconds
  BEA JRockIt JVM 8.0 = 7 seconds
  IBM JVM 1.3.0 = 3 seconds
  G++ 2.95 = 5 seconds
  G++ 3.1 = 8 seconds
  G++ 3.2 = 7 seconds
  G77 2.95 = 3 seconds
  G77 3.1 = 7 seconds
  G77 3.2 = 7 seconds
  MS VC++ 6 standard = 6 seconds
  MS VC++ 6 /Ox /G5 = 4 seconds
  MS .NET 1.1 SDK C# = 3 seconds
  Borland C++ Builder 5.5 = 3 seconds
  Borland Delphi 6 = 3 seconds


Hvilket indenfor den usikkerhed der nu er må kunne opsummeres som:
  gruppe 1 (3-4 sekunder) : IBM Java, MS VC++, C#, C++ Builder, Delphi
  gruppe 2 (5-8 sekunder) : SUN Java, BEA Java, GCC

Floating point test:

  SUN JVM 1.3.1 = 23 seconds
  SUN JVM 1.4.2 = 19 seconds
  BEA JRockIt JVM 8.0 = 24 seconds
  IBM JVM 1.3.0 = 10 seconds
  G++ 2.95 = 25 seconds
  G++ 3.1 = 20 seconds
  G++ 3.2 = 20.5 seconds
  G77 2.95 = 24.5 seconds
  G77 3.1 = 20 seconds
  G77 3.2 = 19 seconds
  MS VC++ 6 standard = 20 seconds
  MS VC++ 6 /Ox /G5 = 9.5 seconds
  MS .NET 1.1 SDK C# = 18 seconds
  Borland C++ Builder 5.5 = 21 seconds
  Borland Delphi 6 = 19 seconds


Hvilket indenfor den usikkerhed der nu er må kunne opsummeres som:
  gruppe 1 (9-10 sekunder) : IBM Java, MS VC++
  gruppe 2 (18-25 sekunder) : SUN Java, BEA Java, GCC, C#, C++ Builder, Delphi

Vi konkluderer udefra kombinationen af integer og floating point resultaterne at:
  * Delphi er ligeså hurtigt som C++
  * de bedste JVM er ligeså hurtige som native kode
  * .NET er ligeså hurtigt som native kode
  * gratis compilere er sommetider ligeså hurtige som kommercielle

Husk at det kun er en enkelt simpel test. Så dem med bestemte
meninger kan naturligvis fortsat have dem.

Nogle vil påpege, at der ikke indgår objekter, så at Java og C# ikke
skal garbage collecte. Det er rigtigt, men eksemplet er et arithmetik
eksempel og arithmetik bruger ikke garbage collection. Iøvrigt viser
test normalt at garbage collection ikke forringer overall
performance markant, men at den kun giver dårligere real time
egenskaber.

Reelt er sprogene rimeligt ens i hastighed. Men det er der heller ikke
noget overraskende i. Fordi:
  * de kører på samme CPU
  * compilere udviklerne studerer naturligvis hinandens arbejde
    og låner gode ideer til forbedring
  * compiler teknologi har udviklet sig rigtigt meget de sidste
    30 år med hensyn til optimering
  * compilere fra samme levandør vil ofte dele compiler backend
    (compiler frontend = source code parsning, compiler
    backend = kode generering)

Den største forskel i compiler teknologi er nok mellem Java og .NET,
hvor optimeringen foregår runtime, og de native, hvor optimeringen
foregår på compile tidspunkt.

Og så lige en lille efternote: betydningen af sprogs hastighed
er kun relevant for en meget lille del af de applikationer
som skrives idag.

Det er normalt den fremmede kode (operativ system, database etc.)
som bruger langt størstedelen af resourcerne idag, mens ens
egen kode med high level logik betyder meget mindre. Og så betyder
et sprogs hastighed ikke ret meget.

CPU kraft er billigt. Får 5000 kr. får man en superhurtig PC.
Software udvikling er dyrt - rigtigt dyrt - et sted mellem 500
og 1500 kr. i timen. Hvis en applikation kun skal køre på en
eller ihvertfald få PC'ere, så skal man vælge sprog efter
hvad der giver kort udviklings tid og billig vedligehold
fremfor efter hastighed.

Koden
Her komme kilde teksten, så kan folk selv compile og teste deres
compilere på deres egen PC.

Java

public class Test {
    private static final int N = 1000000000;
    public static void main(String[] args) throws Exception {
        long t1 = System.currentTimeMillis();
        int sum = 0;
        for(int i = 0; i < N; i++) {
            sum = ((sum + 1) * 2 + 1) / 2;
        }
        long t2 = System.currentTimeMillis();
        if(sum != N) {
            System.out.println("Error");
        } else {
            System.out.println(N + " operations in " + ((t2 - t1) / 1000) + " seconds");
        }
    }
}

C++

#include <iostream>

#include <time.h>

using namespace std;

const int N = 1000000000;

int main()
{
  time_t t1 = time(NULL);
  int sum = 0;
  for(int i = 0; i < N; i++) {
      sum = ((sum + 1) * 2 + 1) / 2;
  }
  time_t t2 = time(NULL);
  if(sum != N) {
      cout << "Error" << endl;
  } else {
      cout << N << " operations in " << (t2 - t1) << " seconds" << endl;
  }
}

Fortran

      PROGRAM TEST
      INTEGER N, I, SUM, T1, T2, SCALE
      PARAMETER (N = 1000000000)
      CALL SYSTEM_CLOCK(T1, SCALE)
      SUM = 0
      DO 100 I = 0,(N - 1)
        SUM = ((SUM + 1) * 2 + 1) / 2;
100  CONTINUE
      CALL SYSTEM_CLOCK(T2, SCALE)
      IF(SUM.NE.N) THEN
        WRITE(*,*) 'Error'
      ELSE
        WRITe(*,*) N, ' operations in ', (T2 - T1) / SCALE, ' seconds'
      ENDIF
      END

C#

using System;

class SpeedTest
{
    private const int N = 1000000000;
    public static int Main() {
        long t1 = DateTime.Now.Ticks;
        int sum = 0;
        for(int i = 0; i < N; i++) {
            sum = ((sum + 1) * 2 + 1) / 2;
        }
        long t2 = DateTime.Now.Ticks;
        if(sum != N) {
            Console.WriteLine("Error");
        } else {
            Console.WriteLine(N + " operations in " + ((t2 - t1) / 10000000) + " seconds");
        }
        return 0;
    }
}

Delphi

program Test;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

const
  N = 1000000000;

var
  t1, t2, sum, i : integer;

begin
  t1 := GetTickCount;
  sum := 0;
  for i := 0 to (N - 1) do begin
    sum := ((sum + 1) * 2 + 1) div 2;
  end;
  t2 := GetTickCount;
  if(sum <> N) then begin
      writeln('Error');
  end else begin
      writeln(N:1, ' operations in ', ((t2 - t1) div 1000):1, ' seconds');
  end;
end.

Java

public class TestFP {
    private static final int N = 1000000000;
    public static void main(String[] args) throws Exception {
        long t1 = System.currentTimeMillis();
        double sum = 0;
        for(int i = 0; i < N; i++) {
            sum = ((sum + 1) * 2 + 1) / 2;
        }
        long t2 = System.currentTimeMillis();
        if(Math.abs(sum-1.5*N) > 1) {
            System.out.println("Error");
        } else {
            System.out.println(N + " operations in " + ((t2 - t1) / 1000) + " seconds");
        }
    }
}

C++

#include <iostream>

#include <time.h>
#include <math.h>

using namespace std;

const int N = 1000000000;

int main()
{
  time_t t1 = time(NULL);
  double sum = 0;
  for(int i = 0; i < N; i++) {
      sum = ((sum + 1) * 2 + 1) / 2;
  }
  time_t t2 = time(NULL);
  if(fabs(sum-1.5*N) > 1) {
      cout << "Error" << endl;
  } else {
      cout << N << " operations in " << (t2 - t1) << " seconds" << endl;
  }
}

Fortran

      PROGRAM TEST
      INTEGER N, I, T1, T2, SCALE
      DOUBLE PRECISION SUM
      PARAMETER (N = 1000000000)
      CALL SYSTEM_CLOCK(T1, SCALE)
      SUM = 0
      DO 100 I = 0,(N - 1)
        SUM = ((SUM + 1) * 2 + 1) / 2;
100  CONTINUE
      CALL SYSTEM_CLOCK(T2, SCALE)
      IF(ABS(SUM-1.5*N).GT.1) THEN
        WRITE(*,*) 'Error'
      ELSE
        WRITe(*,*) N, ' operations in ', (T2 - T1) / SCALE, ' seconds'
      ENDIF
      END

C#

using System;

class SpeedTest
{
    private const int N = 1000000000;
    public static int Main() {
        long t1 = DateTime.Now.Ticks;
        double sum = 0;
        for(int i = 0; i < N; i++) {
            sum = ((sum + 1) * 2 + 1) / 2;
        }
        long t2 = DateTime.Now.Ticks;
        if(Math.Abs(sum - 1.5*N) > 1) {
            Console.WriteLine("Error");
        } else {
            Console.WriteLine(N + " operations in " + ((t2 - t1) / 10000000) + " seconds");
        }
        return 0;
    }
}

Delphi

program Test;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

const
  N = 1000000000;

var
  t1, t2, i : integer;
  sum : double;

begin
  t1 := GetTickCount;
  sum := 0;
  for i := 0 to (N - 1) do begin
    sum := ((sum + 1) * 2 + 1) / 2;
  end;
  t2 := GetTickCount;
  if(abs(sum - 1.5*N) > 1) then begin
      writeln('Error');
  end else begin
      writeln(N:1, ' operations in ', ((t2 - t1) div 1000):1, ' seconds');
  end;
end.

Skrevet tor. d. 15. januar 2004 kl. 00:36| #1

mikkelbm (39.207 point)
Fint lille eksempel til at illustrere forskellene.

Skrevet tor. d. 15. januar 2004 kl. 00:50| #2


Skrevet tor. d. 15. januar 2004 kl. 12:00| #3

xodeus (17.747 point)
xodeus.dk
Meget interessant artikel.
men eftersom man skriver mindst kilde i java og C# så er de da forholdsvis lige hurtige?

Skrevet tor. d. 15. januar 2004 kl. 13:30| #4

sandbox (49.775 point)
Interessant. Især konklusionen.

Skrevet tor. d. 15. januar 2004 kl. 14:46| #5

athlon-pascal (18.908 point)
God artikel :o)
Spændende resultat.

Skrevet tor. d. 22. januar 2004 kl. 08:23| #6

hermandsen (39.303 point)
secoya.dk/
God artikel med en interessant konklusion! Helt sikkert værd at læse!

Skrevet lør. d. 24. januar 2004 kl. 12:47| #7

trer (32.077 point)
Fin artikel, savner dog en sammenligning på strengoperationer og med varianttyper.

Skrevet lør. d. 24. januar 2004 kl. 15:08| #8

bearhugx (34.408 point)
Interessant læsning - og fik da punkteret nogle myter hos mig selv :-=)

Skrevet tir. d. 03. februar 2004 kl. 13:12| #9

cronck (11.582 point)
Så er du ikke i tvivl længere

Skrevet ons. d. 04. februar 2004 kl. 23:23| #10

skovenborg (54.807 point)
Ja, så fik man det slået på plads. Meget interesant må man sige ;-)

Skrevet tor. d. 19. februar 2004 kl. 12:27| #11

ib-rene-cairo (17.940 point)
Overskriften "Hvilket sprog er hurtigst" er misvisende.
Testen viser jo tydeligt at det er valget af compiler, der er afgørende for hastigheden og IKKE hvilket programmeringssprog man vælger.
Konklusionen "Delphi er ligeså hurtigt som C++" er noget vrøvl. Det er kun sandt, hvis begge compilere er fra firmaet Borland. Oversigten viser klart at de fleste C++ compilere er langsommere end Borlands Delphi.

Skrevet fre. d. 02. juli 2004 kl. 11:43| #12


Skrevet tir. d. 24. august 2004 kl. 19:12| #13


Skrevet fre. d. 15. april 2005 kl. 10:29| #14

asgerm (12.855 point)
"Hvilket sprog er hurtigst" ja men mangler der ikke nogle sprog for det her gælder jo KUN for Java, C++, Fortran, C# og Delphi, hvor er ASM, Pascal, VB og Python m.m.??

Skrevet søn. d. 08. maj 2005 kl. 21:05| #15


Skrevet man. d. 15. august 2005 kl. 19:38| #16

visualdeveloper (20.359 point)
genial artikel !

Skrevet tir. d. 16. august 2005 kl. 08:51| #17

borrisholt (73.389 point)
Alle de test jeg har deltaget i viser at optimeret kode er lige hurtig i c++ og i Delphi. Jeg synes du laver en fin gennemgang.

Do glemmer du en vigtig detalje : Borland er dygtigere til at skrive Compilere !!! Det ultimative bevis for dette findes i at Microsoft forud for stører sastsninger på deres compiler har de altid købt en mand fra Borland.

I øvrigt har Borland uden sammenligning den laveste compile tid !!

Skrevet man. d. 31. oktober 2005 kl. 11:15| #18

skwat (25.306 point)
pussig lille sag.

Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
12 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger