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 msHier 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 msusing 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
)