Søger du en specifik kategori?

 



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

arne_v
arne_v (1.015.464 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.717 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 (18.407 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 (50.345 point)
Interessant. Især konklusionen.

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

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

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

hermandsen (39.813 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.587 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.918 point)
Interessant læsning - og fik da punkteret nogle myter hos mig selv :-=)

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

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

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

skovenborg (55.377 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 (18.930 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 (13.365 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.869 point)
genial artikel !

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

borrisholt (73.899 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.816 point)
pussig lille sag.

Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
14 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

   

   



   




Tips & Tricks fra PC World

Teaser billede

Top 5: Virale YouTube-videoer fra Danmark

Lægger du mærke til de mere eller mindre skjulte reklamebudskaber, når du ser videoer på nettet? Vi har taget et kig på fem utrolige danske videoer, som er blevet virale hit.


Anmeldelser fra PC World

Teaser billede

Test: HTC One X er en fantastisk mobil

HTC leverer et gennemført comeback med One X, der er en Android-telefon med toptunede funktioner og en supersprød skærm. Der er dog også plads til forbedring.


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

Sådan fotograferer du blomster

Det er forår, og blomsterne løber om kap for at springe ud. Her er en række gode tips til, hvordan du tager smukkere blomsterbilleder.


Nyheder fra Computerworld

Teaser billede

Fup-app til Android: Sådan stjæler den penge fra dig

Snedige hackere snyder Android-brugere gennem populær app.


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