JAVA schneller als C++ ? Stimmt das???



  • Hallo kann jemand diese Aussage aus dem Beitrag http://www.java-forum.org/de/viewtopic.php?t=32723&start=15 wiederlegen?

    In der c't war schon vor 3 oder 4 Jahren zu lesen, dass C++ von Java im Bereich der Konsolenprogramme locker an die Wand gedrückt wird.

    ----
    Hab' jetzt mal das "schneller wie" in "schneller als" geändert, da kriegt man ja Augenkrebs. Marc++us.



  • ja es stimmt.



  • Troll.

    Thread closed.



  • der test der ct war scheiße. schlecht programmiert für c++



  • Gibt es die Test-Sourcen online?



  • Hatten wir so nen Thread nicht erst vor kurzem?



  • ja, wie.



  • Für jede Programmiersprache wirst Du Fälle finden, die in der jeweiligen Sprache schneller sind als in anderen.
    So ist z.B. C# beim allokieren viel schneller...

    Aber hat das irgendwas mit "real-world" Applikationen zu tun?
    In 99,999999% der Fälle nicht.



  • So ist z.B. C# beim allokieren viel schneller...

    In C++ kann man es aber genauso schnell nachbilden.



  • Jochen Kalmbach schrieb:

    So ist z.B. C# beim allokieren viel schneller...

    viel schneller als was?

    topic: natürlich ist java nicht schneller. ausserdem heiist es *als* nicht 'wie'



  • heisst es nicht "als wie" 🙂

    Ausserdem: Solange es keine 3d-Shooter, Video Codecs oder sonstiges Performance-Kritisches Zeug gibt das in Java geschrieben ist, würde ich diesen Schwachfug nicht glauben...



  • basic ist schneller wie turbo pascal. nur mal so als beispiel.



  • pfffffff schrieb:

    So ist z.B. C# beim allokieren viel schneller...

    In C++ kann man es aber genauso schnell nachbilden.

    Nein. Aber das ist eine andere Geschichte...

    @net: als C++



  • Jochen Kalmbach schrieb:

    @net: als C++

    als c++ ??
    man kann doch 'n memory allocator leicht austauschen in c++. da kann man doch nicht pauschal behaupten dass .NET immer schneller ist als c++. hast du irgendwelche links wo das steht?



  • frenki schrieb:

    heisst es nicht "als wie" 🙂

    nur bei Goethe. der derf das 😉



  • Der Grund ist ganz simpel: C# hat einen GC und brauch beim allokieren einfach einen Index erhöhen; schon ist der Speicher allokiert (also fast i++).
    C++ hat keinen GC und muss somit beim allokieren zuerst mal eine Liste mit Speicherblöcken durchwandern, bis einer gefunden wurde, welcher eine passende Größe hat.
    Also ganz grob:

    class Foo
    {
      int B;
      int a;
      int r;
    };
    
    test()
    {
      Foo arrayOfFoo[10000000];
      for(int i=0; i<10000000; i++)
      {
        arrayOfFoo[i] = new Foo();
      }
    }
    

    ist in C# um Faktoren schneller als in C++

    PS: Aber was hat so ein Test mit einer "Real-World-App" zu tun????



  • Jochen Kalmbach schrieb:

    Der Grund ist ganz simpel: C# hat einen GC und brauch beim allokieren einfach einen Index erhöhen; schon ist der Speicher allokiert (also fast i++).

    heisst das, dass die zeile:

    Foo arrayOfFoo[10000000];
    

    schonmal alle objekte alloziert und das 'new' nur noch einen index hochzählt und konstruktoren aufruft?
    oder wie soll man das verstehen?



  • net schrieb:

    heisst das, dass die zeile:

    Foo arrayOfFoo[10000000];
    

    schonmal alle objekte alloziert und das 'new' nur noch einen index hochzählt und konstruktoren aufruft?

    Nein. Hier wird nix alloziert (nur der Pointer-Speicher für die Klasse; nicht aber die Klasse selber).

    Um das im Tiefen zu verstehen, muss Du wissen wie ein GC funktioniert.
    Hier wird es erklärt:
    http://msdn.microsoft.com/msdnmag/issues/1100/gci/
    http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

    Der Hauptunterschied (der für den Test relevant ist) ist, dass ein allokieren in dem GC-Heap nur ein verschieben eines Zeigers um die Größer des zu allokierenden Objektes darstellt (also NextObjPtr = NextObjPtr + SizeOfObject).
    Das ist nun mal eine sehr simple Operation. In C++ wird dagegen eine verkettete Liste nach passenden Einträgen durchsucht.

    Ein kurzer Test ergab:
    C++: 3672 ms
    C#: 2203 ms

    Hier der Code:

    #include <windows.h>
    #include <tchar.h>
    #include <vector>
    
    class Foo
    {
      int B;
      int a;
      int r;
    };
    int _tmain()
    {
      Foo **arr = new Foo*[10000000];
      DWORD dwStart = GetTickCount();
      for(int i=0; i<10000000; i++)
      {
        arr[i] = new Foo();
      }
      DWORD dwEnd = GetTickCount();
      _tprintf(_T("%d ms"), dwEnd - dwStart);
    }
    

    C#:

    using System;
    namespace ConsoleApplication
    {
      class Foo
      {
        int B;
        int a;
        int r;
        static void Main(string[] args)
        {
          Foo [] al = new Foo[10000000];
          DateTime start = DateTime.Now;
          for(int i=0; i<10000000; i++)
          {
            al[i] = new Foo();
          }
          DateTime stop = DateTime.Now;
          TimeSpan ts = stop-start;
          Console.WriteLine("{0} ms", ts.TotalMilliseconds);
        }
      }
    }
    

    PS: Ich hatte mal ein Beispiel, wo der Unterschied noch größer war... müsste ich jetzt aber zuerst mal suchen...
    PPS: Ok, im Release sind es nur noch C++: 2016 ms und C#: 1687 ms (immerhin ist C++ noch ca. 20% langsamer als C#)



  • okay, danke für die links.
    demnach ist es mit .NET tatsächlich schneller objekte zu erzeugen als mit einem 'linked-list' heap. allerdings, wenn der garbage collector zuschlägt geht wieder etwas zeit verloren, die .NET im vergleich zu einem c++ -new gewonnen hat. aber über einen grösseren zeitraum, schätze ich, wird die .NET methodik etwas schneller sein... aber zum glück kann man ja 'new' in c++ austauschen und einen ähnlich schnellen memory allocator nehmen 🙂



  • Hi,

    also ich hab mal den C++ Code in Managed C++ (CLI) umgeschrieben, sodass man beide Programme am Framework vergleichen kann:

    C++: 2093 ms
    C#: 2171 ms

    using namespace System;
    
    ref class Foo
    {
        int B;
        int a;
        int r;
    };
    
    int main()
    {
        array<Foo^ > ^al = gcnew array<Foo^ >(10000000);
        DateTime start = DateTime::Now;
        for (int i = 0; i < 10000000; i++)
        {
            al[i] = gcnew Foo();
        }
        DateTime stop = DateTime::Now;
        TimeSpan ts = stop - start;
        Console::WriteLine("{0} ms", ts.TotalMilliseconds);
        Console::ReadLine();
    
        return 0;
    }
    

    Könnte daran liegen, dass der C++ Compiler/Linker besser Optimiert ist (da es den ja länger gibt 😉 )


Anmelden zum Antworten