?
-
Hi!
Also ich programmiere momentan C++, habe aber schon mal mit C# angefangen (es aber aus zeitgründen unterbrochen). Mir gefällt es sehr gut. Frühere Fehler die oft bei Programmen in C++ vorkamen bzw. vorkommen sind in C# gar nicht mehr möglich da gar nicht erst kompiliert wird. Z.B. muss man in jeder Case-Anweisung ein break setzen, wenn man allerdings doch will das auf jedenfall das die nächste Case-Anweisung ausgeführt werden soll, so muss man ein goto setzen. Sowas ist zwar manchmal störend, aber es ist bei weitem nicht mehr so fehleranfällig.
Allerdings ist C# nicht wirlklich sehr schnell. Außerdem unterstützt es kein Inline-Assembler und auch keine Assembler-Module wie C++, was für mich einer der Gründe war C++ zu nehmen. Also man muss sich sein Bild da selbst machen und selbst entscheiden was einem besser gefällt. Natürlich ist das mit dieser Fehleranfälligkeit die verringert wird ein großes plus für C#, dennoch mag ich C++ lieber, allein wegen der Programmierung mit der MFC die ich sobald ich die Grundlagen richtig habe noch lernen will. Auf jedenfall kann es nicht schaden mit C# Erfahrungen zu haben, was imho bei keiner Sprache ein Fehler sein kann (außer vllt. bei COMAL).
IMHO kann man wenn man die ein Sprache hat sehr leicht die andere erlernen, was auch der Grund ist das ich C++ erstmal können will, bevor ich C# mache. Ganz egal welche man zuerst lernt, so kann man die andere auf jedenfall als "Erweiterung" der anderen benutzen. Da C# sehr viel von C++ hat ist es imho auch sehr mächtig und es wird sicher immer öfter eingesetzt werden. Es hat aber nicht nur was von C++, sondern auch viel von Java, wodurch man mit Kenntnissen darauf C# sehr leicht lernen kann.Ich würde sagen, bevor ihr weiter meckert, seht es euch an z.B. mit dem C#-Builder von Borland, schnappt euch ein Tutorial und schaut es euch einmal genau an. Danach könnt ihr immer noch sagen das ihr es doof findet oder vielleicht sogar gut findet.
Erst informieren (in diesem Fall probieren) und dann schreiben.
Code-Hacker
-
Da C# sehr viel von C++ hat ist es imho auch sehr mächtig und es wird sicher immer öfter eingesetzt werden. Es hat aber nicht nur was von C++, sondern auch viel von Java, wodurch man mit Kenntnissen darauf C# sehr leicht lernen kann.
C# soll ein schlechter Versuch gewesen sein, Java zu immitieren.
wenn man allerdings doch will das auf jedenfall das die nächste Case-Anweisung ausgeführt werden soll, so muss man ein goto setzen.
goto zeugt von schlechtem Stil.
Cu
André
-
C# ist dafür aber schneller als Java und dank der C-Ähnlichkeit sehr mächtig. Und es hat zuviel von C++ als das man es als Java Imitat ansehen könnte, IMHO.
Das goto von schlechtem Stil zeugt, habe ich nie bestritten, das weiß ich auch selbst, progge schließlich C++. Habe mich dazu aber erst in einem Thread im C++-Forum geäußert. aber für dich, hier die Erklärung warum sich das goto nicht vermeiden lässt, falls du es nicht verstanden hast:
Das break kann nur mit einem goto beseitigt werden. Case ohne break wäre implizites durchfallen zur nächsten Case-Anweisung, da das in C# nicht erlaubt ist, wodurch die Fehleranfälligkeit verringert wurde, muss man dies explizit mit goto geschehen lassen. Deswegen ist das goto da auf jedenfall "legal", also überhaupt nicht schlimm, da es einfach nicht anders geht um zur nächsten Case-Marke z gelangen.
Der einzige Grund warum goto so verpöhnt ist, ist der das es das Programm unübersichtlich macht. Man benutzt es deswegen in C++ auch nur um aus tief verschachtelten Schleifen direkt raus zu springen.
Einen Vorteil hat Switch-Case aus C#, aber gegenüber Switch-Case aus C++, nämlich den das man in C# auch mit Strings vergleichen kann und nicht nur mit Zahlen.Aber wie gesagt, bevor man meckert, sollte man sich C# genau angucken und nicht nur mit seinem Wissen aus C++ prahlen, das hat überhaupt keinen Sinn.
Code-Hacker
-
Code-Hacker schrieb:
C# ist dafür aber schneller als Java
Ist das so? Zeig mal, wo du das her hast. Ich halte das für eine Marketing-Lüge.
Zeig doch zum Beispiel mal, wieviel schneller folgendes Javaprogramm wäre, wenn es in C# geschrieben wäre:
public class TestPrime { public TestPrime () { } public static void main (String[] args) { int end = 100000000; long time = System.currentTimeMillis (); 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; } System.out.println ("Zwischen 0 und " + end + " liegen " + primes + " Primzahlen."); System.out.println ("GesamtZeit : " + (System.currentTimeMillis () - time) + " Millisekunden"); } }
-
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....