45 Stimmen

Warum ist dieser Java-Code 6x schneller als der identische C#-Code?

Ich habe ein paar verschiedene Lösungen für Projekt Euler-Problem 5 aber der Unterschied in der Ausführungszeit zwischen den beiden Sprachen/Plattformen bei dieser speziellen Implementierung macht mich neugierig. Ich habe keine Optimierung mit Compiler-Flags vorgenommen, sondern einfach nur javac (über die Befehlszeile) und csc (über Visual Studio).

Hier ist der Java-Code. Er wird in 55ms beendet.

public class Problem005b
{
    public static void main(String[] args)
    {
        long begin = System.currentTimeMillis();
        int i = 20;
        while (true)
        {
            if (
                    (i % 19 == 0) &&
                    (i % 18 == 0) &&
                    (i % 17 == 0) &&
                    (i % 16 == 0) &&
                    (i % 15 == 0) &&
                    (i % 14 == 0) &&
                    (i % 13 == 0) &&
                    (i % 12 == 0) &&
                    (i % 11 == 0)
                )
            {
                break;
            }
            i += 20;
        }
        long end = System.currentTimeMillis();
        System.out.println(i);
        System.out.println(end-begin + "ms");
    }   
}

Hier ist der identische C#-Code. Er wird in 320ms beendet

using System;

namespace ProjectEuler05
{
    class Problem005
    {
        static void Main(String[] args)
        {
            DateTime begin = DateTime.Now;
            int i = 20;
            while (true)
            {
                if (
                        (i % 19 == 0) &&
                        (i % 18 == 0) &&
                        (i % 17 == 0) &&
                        (i % 16 == 0) &&
                        (i % 15 == 0) &&
                        (i % 14 == 0) &&
                        (i % 13 == 0) &&
                        (i % 12 == 0) &&
                        (i % 11 == 0)
                    )
                    {
                        break;
                    }
                i += 20;
            }
            DateTime end = DateTime.Now;
            TimeSpan elapsed = end - begin;
            Console.WriteLine(i);
            Console.WriteLine(elapsed.TotalMilliseconds + "ms");
        }
    }
}

1voto

BertNase Punkte 2354

Vielleicht weil die Konstruktion des DateTime Objekte ist viel teurer als die System.currentTimeMillis .

1voto

Peter Lawrey Punkte 511323

In Java würde ich System.nanoTime() verwenden. Jeder Test, der weniger als 2 Sekunden dauert, sollte länger ausgeführt werden. Es ist erwähnenswert, dass Java ziemlich gut darin ist, ineffizienten Code oder Code, der nichts tut, zu optimieren. Ein interessanterer Test wäre, wenn Sie den Code optimieren würden.

Sie versuchen, eine Lösung zu finden, die Sie ohne eine Schleife ermitteln können, d. h. ein Problem, das auf andere Weise besser gelöst werden kann.

Du willst das Produkt der Faktoren von 11 bis 20, also 2,2,2,2,3,3,5,7,11,13,17,19. Multipliziere diese miteinander und du hast die Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X