Primzahlen berechnen in C, C# und JAVA
Hier mal wieder ein Benchmark um die Geschwindigkeit von C, C# und Java zu vergleichen. Das Programm berechnet Primzahlen einmal mit dem Sieb des Eratosthenes und einmal nach einer Brute-Force Methode.
Die verwendeten Compiler und Parameter:
Java HotSpot(TM) Server VM (build 1.5.0_04-b05, mixed mode) Microsoft (R) Visual C# .NET-Compilerversion 7.10.3052.4 gcc (GCC) 3.4.2 (mingw-special) gcj (GCC) 3.4.2 (mingw-special) javac PrimeSieve.java csc PrimeSieve.cs /o gcc primesieve.c -o primesieve.exe -O3 -march=pentium4 -std=c99 gcj PrimeSieve.java -o PrimeSieve.exe -O3 -march=pentium4 --main=PrimeSieve
Ergebnisse
Der Test wurde auf einem Notebook mit Pentium4 Mobile Prozessor 1.8 GHz
                        durchgeführt, mit primesieve wurden 50.000.000 Primzahlen
                        berechnet, mit isprime 5.000.000, die Werte in der Tabelle
                        entsprechen der Laufzeit in Sekunden. Die Ergebnisse liegen dabei erstaunlich
                        dicht zusammen. Moderne JIT Compiler sind also bei solchen einfachen Benchmarks
                        den Herkömmlichen Compilern mindestens ebenbürtig.
                        
                     
| primesieve | isprime | |
|---|---|---|
| java | 5,598 | 10,846 | 
| c# | 5,628 | 11,436 | 
| gcc | 5,650 | 11,436 | 
| gcj | 5,729 | 11,175 | 
Quellcode
Hier der Quellcode der Java Version, die anderen Version sind nahezu identisch.
public class PrimeSieve {
    public static final int SIZE  = 50000000;
    public static final int SIZE2 = 5000000;
    public static boolean isprime(int n) {
        if (n < 2) {
            return false;
        }
        else if (n == 2) {
            return true;
        }
        else if (n % 2 == 0) {
            return false;
        }
        else {
            for (int i=3; i*i<=n; i+=2) {
                if (n%i==0) {
                    return false;
                }
            }
            return true;
        }
    }
    public static void primesieve(boolean[] arr) {
        int len = arr.length;
        java.util.Arrays.fill(arr, true);
        if (len > 0) arr[0] = false;
        if (len > 1) arr[1] = false;
        for (int i=4; i<len; i+=2) {
            arr[i] = false;
        }
        for (int i=3; i*i<=len; i+=2) {
            if (arr[i]) {
                for (int j=i<<1; j<len; j+=i) {
                    arr[j] = false;
                }
            }
        }
    }
    public static void main(String[] args) {
        boolean[] arr;
        long t1,t2;
        // warm up and test
        arr = new boolean[10000];
        primesieve(arr);
        for (int i=0; i<10000; i++) {
            if (isprime(i) != arr[i]) {
                throw new RuntimeException("Error in primesieve/isprime at " + i);
            }
        }
        // benchmark primesieve
        arr = new boolean[SIZE];
        t1 = System.currentTimeMillis();
        primesieve(arr);
        t2 = System.currentTimeMillis();
        System.out.println((double)(t2-t1)/1000.0);
        // benchmark isprime
        t1 = System.currentTimeMillis();
        for (int i=0; i<SIZE2; i++) {
            boolean b = isprime(i);
        }
        t2 = System.currentTimeMillis();
        System.out.println((double)(t2-t1)/1000.0);
    }
}
                     
                     