?
-
Ich werde den Code nicht nach C# übersetzen. Ich weiß ja nicht, ob du es überlesen hast, aber ich beschäftige mich momentan nicht mit C#, soll heißen ich Programmiere momentan auch nichts dadrin! Ich habe mich lediglich einmal kurz mit den Grundlagen auseinander gesetzt, das war es aber auch schon. Zudem müsste ich auch noch Java mir ansehen um das übersetzen zu können, wozu ich im Moment weder Zeit noch Just habe.
Aber woher ich habe das C# schneller ist?
Hier
http://www.coding-board.de/board/showthread.php?s=ad33b49a9150653d1e51d2a8b68aaf2a&threadid=2096
und hier:
http://whichlang.junoland.de./?status=registered#cisBei letzerem Link musst du auf C# klicken und dann runter bis zum Speed-Test scrollen.
Aber von der Geschwindigkeit unabhängig gefällt mir C#, da es viel von C++ "geerbt" hat. Und es wird denke ich immer ein Streit geben ob Java oder C# besser ist. Soll jeder das nehmen was ihm am besten gefällt. Und einen thread zu Java vs. C# gibt es schon. Aber manche werden eine Sprache wohl immer nur schlecht machen können ohne sich mit ihr wirklich beschäftigt zu haben. Danach kann man Urteilen. Ich muss mich eh noch in 1 Jahr mit Java auseinander setzen und momentan habe ich andere Sachen zu tun, als mich darum zu kümmern java zu lernen. Mir gefällt c# und dabei bleibts! Und ich habe es auch vor zu programmieren. Und Gründe habe ich schon genannt warum mir C# gefällt, warum ich aber dennoch bei C++ bleibe.
Code-Hacker
-
Hübsch, du hast also einen Mikrobenchmark, in dem Java angeblich langsamer als C# sein soll und behauptest deshalb, dass "C# ist schneller als Java".
Ich habe auch einen:
Hier schafft Java einige Aufgaben schneller als C#. Was ist also mit dieser Aussage, dass C# schneller als Java ist? Sie ist allein schon deshalb falsch, weil sie allgeimeingültig ist und ich ein Gegenbeispiel gebracht habe. Abgesehen davon haben Mikrobenchmarks eigentlich keine Aussagekraft für real existierende Programme.
BTW: Meine Resultate des ersten Benchmarks, den du gebracht hast (ohne C#, ich werde mir nicht dafür Mono installieren, man muss sich also an C++ orientieren, wenn man Vergleichen will):
C++ (gcc):
Square Root: 37724 ms for 18 iterations; 2096 ms per iteration
Vector: 150 ms for 100000000 iterations; 2 ns per iteration
List: 176 ms for 25000000 iterations; 7 ns per iteration
Blur: 218 ms for 4940180 iterations; 44 ns per iteration
Runge-Kutta: 191 ms for 500000 iterations; 382 ns per iteration
Memory: 145 ms for 20000 iterations; 7250 ns per iterationJava 1.4.2 Server-VM:
Square Root: 44275 ms for 18 iterations; 2460 ms per iteration
Vector: 409 ms for 100000000 iterations; 4 ns per iteration
List: 740 ms for 25000000 iterations; 30 ns per iteration
Blur: 1284 ms for 4940180 iterations; 260 ns per iteration
Runge-Kutta: 917 ms for 500000 iterations; 1834 ns per iteration
Memory: 646 ms for 20000 iterations; 32300 ns per iteration
-
Also ich habe den code von Gregor nach C++ und C# portiert und dabei habe ich folgendes rausgetestet: Die Zahlen sind die Anzahl der Prozessor Ticks für die Berechnung
C# C++ ----------------------- 6000 5937 5954 5922 5953 5922 5937 5969 5937 5937 5954 5953 5938 5938 5969 5938 5953 6000 ---------------------- 5955 5946
Die Tests sind natürlich nicht 100% aussagekräftig, aber immerhin kann man sehen das C# in diesem konktreten Fall gar nicht so langsam ist, wie hier behauptet wird.
C++ Code dazu: habe mit Borland C++Builder compiliert
//--------------------------------------------------------------------------- #pragma hdrstop #include <math.h> #include <Windows.h> #include <iostream.h> //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { int end = 100000000; long time = GetTickCount(); int *sieve = new int [(end >> 5) + 1]; int x, y, i; int primes = 1; int isqrt = (int)sqrt((double)end); x = 3; while (x <= isqrt) { if ((sieve[x >> 5] & (0x1 << (x & 0x1f))) == 0) { y = x * x; i = x << 1; ++primes; while (end > y) { sieve[y >> 5] |= (0x1 << (y & 0x1f)); y += i; } } x += 2; } while (x <= end) { if ((sieve[x >> 5] & (0x1 << (x & 0x1f))) == 0) ++primes; x += 2; } cout << "Zwischen 0 und " << end << " liegen " << primes << " Primzahlen." << endl; cout << "GesamtZeit : " << (GetTickCount() - time) << " Ticks"; char c; cin >> c; return 0; } //---------------------------------------------------------------------------
C# Code
using System; using System.Runtime.InteropServices; namespace PrimaTest { public class TestPrime { [DllImport("kernel32.dll", EntryPoint="GetTickCount")] public static extern uint GetTickCount(); [STAThread] static void Main(string[] args) { int end = 100000000; uint time = GetTickCount(); int [] sieve = new int [(end >> 5) + 1]; int x, y, i; int primes = 1; int sqrt = (int)Math.Sqrt((double)end); x = 3; while (x <= sqrt) { if ((sieve[x >> 5] & (0x1 << (x & 0x1f))) == 0) { y = x * x; i = x << 1; ++primes; while (end > y) { sieve[y >> 5] |= (0x1 << (y & 0x1f)); y += i; } } x += 2; } while (x <= end) { if ((sieve[x >> 5] & (0x1 << (x & 0x1f))) == 0) ++primes; x += 2; } Console.WriteLine("Zwischen 0 und " + end + " liegen " + primes + " Primzahlen."); uint timef = GetTickCount() - time; Console.WriteLine("GesamtZeit : " + timef.ToString() + " Ticks"); Console.ReadLine(); } } }
Es wäre auch interressant, wenn jemand das in C machen würde.
und @Gregor kannst du vielleicht auch so ein vergleich zwischen Java und C++ herschafen?
Es ist immer traurig, wenn einige Läute aussage über etwas machen, wovon sie nur eine ganz geringe Ahnung haben.
...na ja, ich habe zwar selbst noch nix gemacht, aber ich habe mal gelesen und gehört... ausserdem mein Bäcker sagt das auch ...
-
Xqgene schrieb:
und @Gregor kannst du vielleicht auch so ein vergleich zwischen Java und C++ herschafen?
Habe ich schon. Allerdings ist bei mir die Obergrenze etwas weiter oben:
http://forum.javacore.de/viewtopic.php?t=208&start=15
(und die vorhergehende Seite).
-
So ich habe jetzt auch mal das C++-Programm in etwa so geschrieben, wie du es gemacht hast ("const" weggelassen und array auf Heap angelegt). Resultat (Primzahlsuche bis 1.000.000.000):
(C++-Programme mit GCC und "-O3" kompiliert)
Dein C++-Programm : 66 Sekunden
Mein C++-Programm : 54 Sekunden
Java mit Client-VM : 59 Sekunden
Java mit Server-VM : 56 SekundenNach deinem Test scheint das C#-Programm ja etwa so schnell zu sein, wie dein C++-Programm. Es ist also etwa mit 66 Sekunden anzugeben (vorausgesetzt, dein C++-Compiler ist ähnlich gut/schlecht, wie meiner).
-
Xqgene schrieb:
Die Tests sind natürlich nicht 100% aussagekräftig, aber immerhin kann man sehen das C# in diesem konktreten Fall gar nicht so langsam ist, wie hier behauptet wird.
Ich behaupte nicht, dass C# langsam ist. Aber ich behaupte, dass es auch nicht besonders schnell im Vergleich zu Java oder C++ ist. Ich denke, diese Sprachen spielen in der gleichen Liga, C++ ist vielleicht etwas schneller als C# und Java. Die Geschwindigkeitsunterschiede halten sich IMHO aber sehr in Grenzen.
-
--- (Doppelpost) ---
-
Gregor schrieb:
Ich denke, diese Sprachen spielen in der gleichen Liga, C++ ist vielleicht etwas schneller als C# und Java. Die Geschwindigkeitsunterschiede halten sich IMHO aber sehr in Grenzen.
stimmt wohl
-
OK, wenn das so ist.
Ansonsten habe ich nur diese Tests gefunden und sonst auch nur gelesen so
sachen wie "wir haben tests gemacht und C# war besser". Toll, das bringt noch
weniger.
Aber wie diese Tests zeigen scheint der Unterschied ja gar nicht so riesig zu sein. Naja, wie gesagt, es ist mir egal. Dennoch bringt es nichts eine Sprache schlecht zu machen wie oben, ohne das man sich wirklich mit ihr auseinander gesetzt hat (zumindest mal mit den Grundlagen).Code-Hacker
-
also ich habe mich bissher immer aus solchen threads rausgehalten.
ich wollte nur anmerken, dass ihr gruendlich ueber alle aspekte einer
sprache nachdenken solltet, bevor ihr sagt, dass sie langsamer oder schneller
als eine andere ist.
die nackte prozessor-ausfuehrungszeit ist nich ausschlaggebend.diese "benchmarks" sind doch nicht korrekt.
gerade wenn ich schon sehe, dass in einigen dieser "benchmarks" ueber
zeitdifferenzen (endzeit-startzeit) gemessen wird....