Was ist schneller - Java oder C # (oder gutes altes C)?
Ich bin derzeit die Entscheidung, auf eine Plattform zu bauen, eine wissenschaftliche rechnerische Produkt, und bin der Entscheidung, entweder C#, Java oder nur C mit dem Intel-compiler auf Core2-Quad-CPU. Es ist vor allem Ganzzahl-Arithmetik.
Meine benchmarks so weit zeigen, Java und C sind in etwa auf Augenhöhe mit einander, und .NET/C# - trails von über 5%- allerdings eine Anzahl meiner Kollegen behaupten, dass .NET mit den richtigen Optimierungen schlagen beide genug Zeit für die JIT-um seine Arbeit zu tun.
Ich immer davon ausgehen, dass der JIT-hätte seine Arbeit getan innerhalb ein paar Minuten von der app ab (Wahrscheinlich ein paar Sekunden in meinem Fall, da es meist engen Schleifen), so dass ich nicht sicher bin, ob Sie glauben, Sie
Kann jemand alle vergossen Licht auf die situation? Würde .NET schlagen Java? (Oder bin ich am besten, nur kleben mit C an dieser Stelle?).
Der code ist sehr stark Multithreading-und Daten-sets sind in mehreren Terabyte Größe.
Haskell/Erlang etc sind keine Option in diesem Fall, da es eine erhebliche Menge von vorhandenen legacy C-code portiert werden, um das neue system und die Portierung von C nach Java/C# ist viel einfacher als zu Haskell oder Erlang. (Es sei denn, diese bieten einen erheblichen speedup).
Edit: Wir werden in Erwägung ziehen, um C# oder Java, da Sie möglicherweise in der Theorie schneller sein. Jedes Prozent können wir rasieren unsere Bearbeitungszeit spart uns Zehntausende von Dollar pro Jahr. An diesem Punkt sind wir nur versuchen, zu beurteilen, ob C, Java oder c# wäre schneller.
InformationsquelleAutor der Frage Rexsung | 2009-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Schlüssel information, die Frage ist:
So müssen Sie überlegen wie viel es Kosten wird zu rasieren jedes Prozent ab. Wenn, Optimierung von Aufwand, Kosten Zehntausende von Dollar pro Jahr, dann es lohnt sich nicht tun. Sie könnten einen größeren speichern, indem er einen Programmierer.
Mit den richtigen Qualifikationen (die sind heute seltener und daher teurer), können Sie hand-Handwerk-assembler für die schnellstmögliche code. Mit etwas weniger seltenen (und teuren) Fähigkeiten, die Sie tun können, fast so gut mit einigen wirklich hässlich aussehenden C-code. Und so weiter. Je mehr Leistung Sie squeeze-out der es, desto mehr wird es Kosten, die Sie in Entwicklungs-Aufwand, und es werden abnehmende Erträge für immer mehr Aufwand. Wenn der Gewinn aus diesem Aufenthalte in "Zehntausende von Dollar pro Jahr", dann es wird ein Punkt kommen, wo es nicht mehr der Mühe Wert. In der Tat würde ich raten du bist bereits an diesem Punkt, weil "Zehntausende von Dollar pro Jahr" ist im Bereich von einem Gehalt, und wahrscheinlich nicht genug, um zu kaufen die notwendigen Fähigkeiten, um hand-Optimierung ein Komplexes Programm.
Ich würde vermuten, dass, wenn Sie code schon in C geschrieben, der Aufwand, schreiben Sie es alle als eine direkte übersetzung in eine andere Sprache werden 90% vergebliche Mühe. Es wird sehr wahrscheinlich langsamer, weil Sie nicht unter Ausnutzung der Funktionen der Plattform, sondern arbeiten gegen Sie, z.B., versucht die Java -, als ob es war C.
Auch innerhalb Ihres bestehenden code, gibt es Teile, die einen entscheidenden Beitrag zu der Laufenden Zeit (Sie Häufig), und andere Teile, die sind völlig irrelevant (Sie laufen selten). Also, wenn Sie eine Idee haben, für die Beschleunigung des Programms, es gibt keinen wirtschaftlichen Sinn, Zeit zu verschwenden Anwendung auf die Teile des Programms, die keinen Einfluss auf die laufende Zeit.
Also einen profiler verwenden, um zu finden, die hot spots, und sehen, wo die Zeit verschwendet wird, in den vorhandenen code.
Update, wenn ich bemerkte den Verweis auf den code "multithreaded"
In diesem Fall, wenn Sie konzentrieren Ihre Anstrengungen auf die Beseitigung von Engpässen, so dass Ihr Programm gut skaliert auf eine große Anzahl von Kernen, dann wird es automatisch von Jahr zu Jahr schneller mit einer rate, Zwerg sonstige-Optimierung, die Sie machen können. Diese Zeit im nächsten Jahr quad-cores zum standard auf Desktop-Computern. Das Jahr nach, dass 8 Kerne die werden immer billiger (habe ich gekauft vor über einem Jahr für ein paar tausend Dollar), und ich würde sagen, dass ein 32-core-Maschine kostet weniger als ein Entwickler.
InformationsquelleAutor der Antwort Daniel Earwicker
Tut mir Leid, aber das ist keine einfache Frage. Es kommt ein vielwas genau Los war. C# ist sicherlich nicht Lumpen, und Sie würden hart gedrückt, um zu sagen: "java ist schneller" oder "C# ist schneller". C ist ein ganz anderes Tier... vielleicht hat das Potenzial schneller zu sein - wenn Sie es richtig; aber in den meisten Fällen ist es ungefähr das gleiche, aber viel schwerer zu schreiben.
Es hängt auch wie Sie es tun - locking-Strategien, wie Sie tun, die Parallelisierung, die wichtigsten code-Körper usw.
Re JIT - man kann Sie nutzen, NGEN Sie zu glätten, aber ja; wenn Sie schlagen den gleichen code sollte JITted sehr früh auf.
Ein sehr nützliches feature von C#/Java (über C) ist, dass Sie das Potenzial haben, besser zu nutzen von der lokalen CPU (Optimierungen etc.), ohne dass Sie sich darum zu kümmern.
Auch - mit .NET, betrachten Sie Dinge wie "Parallel Extensions" (zu bündeln, 4.0), das gibt Ihnen eine viel stärkere threading-story (im Vergleich zu .NETTO ohne PFX).
InformationsquelleAutor der Antwort Marc Gravell
Mach dir keine sorgen über die Sprache; parallelisieren!
Wenn Sie ein sehr Multithread-data-intensive scientific code, dann glaube ich nicht, sich Gedanken über die Sprache ist das größte Problem für Sie. Ich denke, Sie sollten sich darauf konzentrieren, so dass Ihre Anwendung parallel, vor allem macht es Waage vorbei an einem einzelnen Knoten. Diese erhalten Sie weit mehr Leistung als nur der Sprachumschaltung.
Solange Sie beschränkt sich auf einen einzigen Knoten, Sie werden ausgehungert nach Rechenleistung und Bandbreite für Ihre app. Auf zukünftige many-core-Maschinen, es ist nicht klar, dass Sie die Bandbreite, die Sie tun müssen, um Daten-intensive computing auf allen Kernen. Sie tun können rechenintensive arbeiten (wie eine GPU), aber Sie möglicherweise nicht in der Lage zu ernähren, alle Kerne, wenn Sie brauchen, um Strom eine Menge von Daten zu jeder von Ihnen.
Ich denke, Sie sollten zwei Optionen:
MapReduce
Dein problem klingt wie eine gute Partie für so etwas wie Hadoop, die ausgelegt ist für sehr datenintensive jobs.
Hadoop skaliert hat, um 10.000 Knoten auf Linux, und Sie können shunt-Ihre arbeiten aus, die entweder jemand anderes (z.B. Amazon, Microsoft) oder Ihre eigenen compute cloud. Es ist in Java geschrieben, also so weit wie die Portierung geht, können Sie entweder rufen Sie Ihre vorhandenen C-code aus Java, oder Sie können den port, die ganze Sache zu Java.
MPI
Wenn Sie nicht wollen, um die Mühe der Portierung MapReduce, oder wenn aus irgendeinem Grund Ihre parallele Paradigma passt nicht die MapReduce-Modell, Sie könnte prüfen, die Anpassung Ihrer app zu verwenden MPI. Dies würde auch ermöglichen es Ihnen, zu skalieren (möglicherweise Tausende) von Kernen. MPI ist der de-facto-standard für rechenintensive, distributed-memory-Anwendungen, und ich glaube, es gibt Java-Bindungen, aber vor allem die Menschen verwenden MPI mit C, C++ und Fortran. So konnte Sie halten Ihren code in C und konzentrieren sich auf die Parallelisierung der performance-intensive Teile. Werfen Sie einen Blick auf OpenMPI für den Anfang wenn Sie interessiert sind.
InformationsquelleAutor der Antwort tgamblin
Ich bin ehrlich überrascht in den benchmarks.
In eine rechenintensive Produkt, würde ich eine große Wette auf C ausführen schneller. Könnten Sie code schreiben, der Lecks Gedächtnis wie ein Sieb, und hat interessante threading-bezogene Mängel, aber es sollte schneller sein.
Der einzige Grund, warum ich denken konnte, dass Java oder C# schneller ist durch einen kurzen Lauf Länge auf den Prüfstand. Wenn wenig oder kein GC passiert ist, werden Sie vermeiden, den Aufwand der tatsächlich freigeben von Speicher. Wenn der Prozess ist iterativ oder parallel, versuchen Sie kleben ein GC.Sammeln Sie, wo immer Sie denken, Sie fertig sind eine Reihe von Objekten(nach Einstellung Dinge zu null oder andernfalls entfernen der Referenzen).
Auch, wenn man sich mit terabytes von Daten, meiner Meinung nach bist du viel besser dran mit deterministische Zuweisung von Speicher, die Sie mit C. Wenn Sie deallocate etwa nahe, wenn Sie reservieren Sie Ihre heap bleiben weitgehend unfragmented. Mit einem GC-Umgebung können Sie sehr gut am Ende mit Ihrem Programm viel mehr Speicher nach einem ordentlichen run-length -, als man vermuten könnte, nur weil der Fragmentierung.
Das klingt für mich wie die Art von Projekt, wo C die geeignete Sprache, würde aber erfordern ein wenig mehr Aufmerksamkeit auf die memory allocation/deallocation. Meine Wette ist, dass C# oder Java schlägt fehl, wenn die Ausführung auf einem vollständigen Datensatz.
InformationsquelleAutor der Antwort Darren Clark
Schon vor einiger Zeit Raymond Chen und Rico Mariani hatte eine Reihe von blog-posts, schrittweise Optimierung ein Datei laden Sie in ein Wörterbuch-tool. Während .NET war schneller, früh (D. H. einfache, schnelle) C/Win32 Ansatz wurde schließlich deutlich schneller-aber zu hohe Komplexität (z.B. mithilfe von benutzerdefinierten allocators).
Am Ende die Antwort auf, welche schneller ist, wird stark davon abhängen, wie viel Zeit Sie bereit sind, verbrauchen Sie auf der Ekin jeder Mikrosekunde aus jedem Ansatz. Mühe, dass (vorausgesetzt, Sie tun es richtig, geleitet von echten profiler-Daten) macht einen weit größeren Unterschied als die Wahl der Sprache/Plattform.
Den ersten und den letzten performance blog-Einträge:
(Der Letzte link bietet eine Allgemeine Zusammenfassung der Ergebnisse und einige Analyse.)
InformationsquelleAutor der Antwort Richard
Es wird, hängt sehr viel auf, was Sie tun speziell. Ich habe einen Java-code, beats-C-code. Ich habe einen Java-code, ist viel langsamer als C++ - code (ich weiß nicht, mit C#/.NETTO also nicht zu jenen sprechen).
So, es hängt davon ab, was du machst, ich bin sicher, Sie können etwas finden, die schneller in die Sprache X als Sprache Y.
Haben Sie versucht mit der C# - code durch einen profiler, um zu sehen, wo es die meiste Zeit (gleiche mit Java und C, während Sie dabei sind). Vielleicht brauchen Sie etwas anderes zu tun.
Java HotSpot VM ist reifer (Wurzeln gehen zurück bis mindestens 1994) als die .NETTO ein, so kann es nach unten kommen, um die code-Generierung Fähigkeiten der beiden.
InformationsquelleAutor der Antwort TofuBeer
Sagen Sie: "der code ist multithreaded", was bedeutet, dass die algorithmen sind parallelisable. Auch, speichern Sie die "Daten-sets sind mehrere Terabyte groß".
Optimierung ist alles über die Suche nach und die Beseitigung von Engpässen.
Den offensichtlichen Flaschenhals ist die Bandbreite, um die Daten legt. Angesichts der Größe der Daten, ich vermute, dass die Daten auf einem server statt auf einem desktop-Rechner. Haben Sie noch nicht alle details der algorithmen, die Sie verwenden. Ist die Zeit, die der Algorithmus größer als die Zeit, die zum Lesen/schreiben der Daten/Ergebnisse? Sieht der Algorithmus auf Teilmengen der gesamten Daten?
Gehe ich davon aus, dass der Algorithmus arbeitet auf Blöcken von Daten, anstatt die gesamte dataset.
Haben Sie zwei Szenarien zu betrachten:
Der Algorithmus braucht mehr Zeit, um die Daten zu verarbeiten, als es tut, um die Daten zu erhalten. In diesem Fall müssen Sie zur Optimierung des Algorithmus.
Den Algorithmus weniger Zeit in Anspruch nimmt, die Daten zu verarbeiten, als es tut, um die Daten zu erhalten. In diesem Fall, die Sie benötigen, um die Bandbreite zu erhöhen, die zwischen dem Algorithmus und der Daten.
Im ersten Fall benötigen Sie einen Entwickler, der schreiben kann, gute assembler-code zu erhalten der beste aus der Prozessoren, die Sie verwenden, nutzt SIMD, GPUs und multicores, wenn Sie verfügbar sind. Was auch immer Sie tun, nicht nur Kurbel bis die Anzahl der threads, weil die, sobald die Anzahl der threads übersteigt die Anzahl der Kerne, code geht langsamer! Diese durch den zusätzlichen Aufwand für Wechsel-thread-Kontexten. Eine weitere option ist die Verwendung eines SETI-wie system für die verteilte Verarbeitung (wie viele PCs in Ihrer organisation verwendet werden, für admin-Zwecke - man denke an alle, die Freizeit Rechenleistung!). C#/Java, als bh213 erwähnt, kann eine Größenordnung langsamer, als gut geschriebene C/C++ unter Verwendung von SIMD -, etc. Aber das ist eine Nische Fertigkeiten in diesen Tagen.
Im letzteren Fall, wo Sie sind begrenzt durch die Bandbreite, dann müssen Sie verbessern die Netzwerk-Verbindung die Daten an den Prozessor. Hier, stellen Sie sicher, dass Sie über die neueste ethernet-Geräte - 1Gbps überall (PC-Karten, switches, Router, etc). Verwenden Sie nicht wireless, wie das ist, langsamer. Wenn es gibt viele andere, Verkehr, betrachten ein dediziertes Netzwerk, parallel mit der 'office' - Netzwerk. Betrachten Sie die Speicherung der Daten näher am Kunden - für jeden fünf oder so-clients verwenden Sie einen dedizierten server angeschlossen direkt zu jedem client, der Spiegel die Daten vom server.
Wenn sparen ein paar Prozent von der Verarbeitung Zeit spart "Zehntausende von Dollar", dann ernsthaft erwägen, einen Berater, zwei eigentlich - one-software, eine Netzwerk. Sie sollte einfach für sich selbst zahlen, in der Einsparungen aus. Ich bin sicher, es gibt viele hier, die entsprechend qualifiziert sind, zu helfen.
Aber wenn die Verringerung der Kosten ist das ultimative Ziel, dann erwägen, Google ' s Ansatz - code schreiben, der hält die CPU ticken unter 100%. Das spart Energie, die direkt und indirekt durch reduzierte Kühlung, somit kostet weniger. Möchten Sie mehr bang für Ihre buck, so ist es C/C++ wieder - Java/C# haben mehr overhead, overhead = mehr CPU-Last = mehr Energie/Wärme = mehr Kosten.
So, in Zusammenfassung, wenn es darum geht, Geld zu sparen, gibt es noch viel mehr zu bieten als das, was Sprache, die Sie gehen zu wählen.
InformationsquelleAutor der Antwort Skizz
Wenn es bereits eine erhebliche Menge von legacy C-code, wird dem system Hinzugefügt werden warum dann verschieben auf C# und Java?
In der Antwort auf Ihre Letzte Bearbeiten zu wollen, um die Vorteile der Verbesserungen in der Geschwindigkeit der Bearbeitung....dann Ihre beste Wette wäre, zu bleiben, um zu C wird näher auf die hardware-als C# und Java, die den overhead eines runtime-Umgebung zu behandeln. Die näher an der hardware, die Sie bekommen können, desto schneller werden Sie in der Lage sein sollten, zu laufen. Höheren Sprachen wie C# und Java wird in Folge schneller Entwicklung mal...aber C...oder noch besser: die Montage führt zu einer schnelleren Bearbeitungszeit...aber mehr Entwicklungszeit.
InformationsquelleAutor der Antwort mezoid
Nahm ich an ein paar TopCoder Marathon-matches, in denen die Leistung war der Schlüssel zum Sieg.
Meine Wahl war C#. Ich denke, dass C# - Lösungen gelegt, etwas über Java und waren etwas langsamer als C++... Bis jemand schrieb einen code in C++ - das war eine Größenordnung schneller. Sie wurden sind erlaubt, um die Intel-compiler und die Gewinner-code war voll von SIMD-insturctions, und Sie können zu replizieren, die in C# oder Java. Aber wenn SIMD ist keine option, C# und Java sollten gut genug sein, solange Sie kümmern sich um die Verwendung von im Speicher korrekt (z.B. Uhr für cache-misses und versuchen Sie zu begrenzen-Speicher zugreifen, um die Größe des L2-cache)
InformationsquelleAutor der Antwort bh213
Eigentlich ist es 'Assembler'.
InformationsquelleAutor der Antwort Dhana
Hängt davon ab, welche Art von Anwendung Sie schreiben.
Versuchen Sie Den Computer Language Benchmarks Game
http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=csharp&lang2=java&box=1
http://shootout.alioth.debian.org/u64/benchmark.php?test=all&lang=csharp&lang2=java&box=1
InformationsquelleAutor der Antwort J-16 SDiZ
Wiederholen, eine Bemerkung, Sie sollten mit der GPU, nicht die CPU, wenn Sie tun, Arithmetik wissenschaftliches rechnen. Matlab mit CUDA-plugins wäre viel mehr awesome als Java oder c#, wenn Matlab Lizenzierung ist nicht ein Problem. Die nVidia-Dokumentation zeigt, wie zu kompilieren CUDA-Funktion in eine mex-Datei. Wenn Sie brauchen, freie software, ich mag pycuda.
Wenn jedoch, GPUs sind nicht eine option, ich persönlich mag C für eine Menge von Routinen, weil die Optimierungen, die der compiler macht, sind nicht so kompliziert, wie JIT: Sie müssen sich nicht darum sorgen, ob eine "Klasse" wird wie ein "struct" oder nicht. In meiner Erfahrung, Probleme können in der Regel so gegliedert, dass die höhere Ebene die Dinge geschrieben werden können, in einer sehr ausdrucksstarken Sprache wie Python (rich primitive, dynamische Typen, unglaublich flexibel Reflexion) und Transformationen geschrieben werden können in so etwas wie C. darüber hinaus gibt es ordentlich compiler-software, wie PLUTO (automatische loop-Parallelisierung und OpenMP-code-Generierung), und Bibliotheken, wie Horten, tcmalloc, BLAS (CUBLAS für die gpu), etc. wenn Sie wählen zu gehen, die C/C++ - route.
InformationsquelleAutor der Antwort gatoatigrado
Eine Sache zu beachten ist, dass, WENN Sie Ihre Anwendung(en) würde profitieren von lazy evaluation einer funktionalen Programmiersprache wie Haskell darf Ertrag Beschleunigungen von einer völlig anderen Größenordnung als die theretically optimal strukturiert/OO-code, indem Sie nicht bewerten unnötige Zweige.
Auch, wenn man den monetären Vorteil, eine bessere Leistung, vergessen Sie nicht, fügen Sie die Kosten für maintaing Ihre software in die Gleichung.
InformationsquelleAutor der Antwort ymihere
Frage ist schlecht formuliert (oder zumindest den Titel), weil es impliziert dieser Unterschied ist endemisch und gilt für alle Instanzen von java/c#/c code.
Gott sei Dank sind die Körper, die Frage ist besser formuliert, denn es präsentiert eine halbwegs detaillierte Erklärung der Art, was dein code tut. Es nicht sagen, um welche Versionen (oder Anbieter) von c#/java runtimes, die Sie verwenden. Noch ist es den Zustand der Ziel-Architektur oder Maschine wird der code ausgeführt. Diese Dinge machen große Unterschiede.
Sie getan haben einige benchmarking, das ist gut. Einige Vorschlägewarum Sie sehen die Ergebnisse, die Sie tun:
Ohne ein Verständnis von dem, was Ihr code verbringt die meiste Zeit tun, ist es unmöglich, machen Sie konkrete Vorschläge. Ich kann ganz leicht code schreiben, das führt viel besser unter die CLR aufgrund der Nutzung von Strukturen über Objekte oder von targeting-runtime-spezifische Funktionen der CLR-wie non boxed Generika, ist dies kaum lehrreich als eine Allgemeine Aussage.
InformationsquelleAutor der Antwort ShuggyCoUk
Sicherlich die Antwort ist zu gehen und kaufen die neuesten PC-mit den meisten Kernen/Prozessoren, die Sie sich leisten können. Wenn Sie kaufen eine der neuesten 2x4 core-PCs finden Sie nicht nur, dass es doppelt so viele Kerne, wie ein quad core, aber auch Sie laufen 25-40% schneller als die Vorherige generation der Prozessoren/Maschinen.
Dieser wird Ihnen etwa eine 150% beschleunigen. Weit mehr als die Wahl von Java/C# oder C.
und was mehr ist, um das gleiche noch einmal alle 18 Monate, wenn Sie halten den Kauf in neue Boxen!
Kann man sich dort für Monate umschreiben Sie den code, oder ich könnte gehen Sie nach unten zu meinem lokalen PC-Geschäft an diesem Nachmittag und werden schneller laufen als alle Ihre Bemühungen gleichen Tag.
Verbesserung der code-Qualität/Effizienz ist gut, aber manchmal Implementierung Dollar sind besser ausgegeben an anderer Stelle.
InformationsquelleAutor der Antwort AnthonyLambert
Schreiben in einer Sprache oder einer anderen Ihnen nur kleine speed-ups für eine große Menge von Arbeit. Um wirklich die Dinge zu beschleunigen möchten Sie vielleicht zu betrachten, die folgenden:
InformationsquelleAutor der Antwort AnthonyLambert
Ich würde mit C# (oder Java), weil Ihre Entwicklung Zeit wahrscheinlich viel schneller als mit C. Wenn Sie am Ende brauchen mehr Geschwindigkeit, dann kann man immer umschreiben, dass ein Abschnitt in C und rufen Sie es als ein Modul.
InformationsquelleAutor der Antwort Nathan
Meine Präferenz wäre C oder C++ weil ich bin nicht getrennt von der Maschinensprache durch einen JIT-compiler.
Wollen Sie tun Intensive performance-tuning, und das bedeutet, daß wir über die hot spots eine Anweisung zu einem Zeitpunkt, zu sehen, was es tut, und dann Optimiere den Quellcode so um den optimalen assembler.
Wenn Sie nicht bekommen kann der compiler generiert, was für Sie gut genug assembler-code, dann schreiben Sie Ihre eigenen assembler für den hot-spot(s). Sie beschreiben eine situation, wo die Notwendigkeit, für die Leistung ist von größter Bedeutung.
Was ich NICHT auch tun würde, wenn ich in deine Schuhe (oder für immer) verlassen Sie sich auf anekdotische Verallgemeinerungen über eine Sprache, die schneller oder langsamer als die anderen. Was ich tun WÜRDE, ist mehrere Durchläufe der intensiven performance-tuning entlang der Linien von DIESE und DIESE und DIESE. Ich habe getan, diese Art der Sache mehrmals, und der Schlüssel ist, um die Iteration der Zyklus von Diagnose-und-Reparatur, weil jeder slug-fest macht die verbliebenen umso deutlicher, bis Sie buchstäblich können nicht squeeze einen neuen Zyklus aus, dass die Rübe.
Glück.
Hinzugefügt: Ist es der Fall, dass es gibt einige selten-ändern-Konfiguration Informationen, die bestimmt, wie der Großteil der Daten verarbeitet werden? Wenn ja, kann es sein, dass das Programm verbringt viel seiner Zeit re-Interpretation der Konfigurations-info, um herauszufinden, was als Nächstes zu tun ist. Wenn dem so ist, ist es in der Regel einen großen Gewinn zu schreiben - code-generator , liest die Konfigurations-info und generieren ad-hoc-Programm, das können Whiz durch die Daten, ohne ständig mit, um herauszufinden, was zu tun ist.
InformationsquelleAutor der Antwort Mike Dunlavey
Hängt davon ab, was Sie benchmark und auf welcher hardware. Ich vermute, es ist die Geschwindigkeit eher als Speicher-oder CPU-Auslastung.Aber....
Wenn Sie einen dedizierten Computer für eine app nur mit sehr großen Mengen an Speicher dann java vielleicht 5% schneller.
Wenn Sie nach unten gehen in der realen Welt mit begrenzten Speicher und mehr Anwendungen laufen auf der gleichen Maschine .net sieht besser aus bei Verwendung von computing-Ressourcen :siehe hier
Ob die hardware ist sehr beschränkt, C/C++ gewinnt die Hände nach unten.
InformationsquelleAutor der Antwort dmihailescu
Wenn Sie eine hoch multithreaded code, ich würde Ihnen empfehlen, nehmen Sie einen Blick auf die kommenden Task Parallel Library (TPL).NET und die Parallel Pattern Library (PPL) für native C++ - Anwendungen. Das spart Ihnen eine Menge Probleme mit thread/dead lockíng und alle anderen Fragen, die Sie verbringen viel Zeit zu Graben in und um die Lösung für dich.
Für mein selbst, ich glaube wirklich, dass das Speicher-management in der verwalteten Welt wird effizienter und schlagen der native code in der langfristig.
InformationsquelleAutor der Antwort Magnus Johansson
Wenn ein Großteil des Codes ist in C warum nicht behalten?
Im Prinzip und vom design ist es offensichtlich, dass C schneller ist. Sie können die Lücke schließen, die im Laufe der Zeit aber immer mehr auf Betriebssystem-Dereferenzierung und "Sicherheit". C ist schnell, weil es "unsicher". Man denke nur an bound checking. Die Anbindung an C unterstützt wird, in jeder Sprache. Und so kann ich nicht sehen, warum man nicht möchte, nur wickeln Sie das C-code, wenn es funktioniert immer noch und verwenden Sie es in was auch immer Sprache, die Sie wie
InformationsquelleAutor der Antwort Friedrich
Ich würde überlegen, was jeder andere auch benutzt werden - nicht die Leute auf dieser Website, aber die Leute, die schreiben, die die gleiche Art von Massiv-parallelen, oder super-high-performance-Anwendungen.
Ich finde Sie alle schreiben Ihren code in C/C++. Also, nur diese Tatsache allein (dh. unabhängig von jeder Geschwindigkeit-Probleme zwischen den Sprachen), würde ich mit C/C++. Die Werkzeuge, die Sie verwenden, und entwickelt haben, werden von viel mehr nutzen für Sie, wenn Sie schreiben in der gleichen Sprache.
Abgesehen davon, dass ich gefunden habe, die C# - apps, um etwas weniger als eine optimale Leistung in einigen Bereichen, multithreading ist. .NET wird versuchen, Sie sicher zu halten von thread-Probleme (wahrscheinlich eine gute Sache in den meisten Fällen), aber das wird die Ursache für Ihren speziellen Fall Probleme (test: schreiben Sie eine einfache Schleife, die auf ein gemeinsames Objekt mit vielen threads. Führen, dass auf einem single-core-PC und Sie erhalten eine bessere Leistung, als wenn Sie führen Sie es auf einem Multicore-box .net ist das hinzufügen Ihrer eigenen sperren, um sicherzustellen, dass Sie nicht muck it up)(ich habe Jon Skeet ist singleton benchmark. Die statische Sperre dauerte 1,5 Sek auf meinem alten laptop, 8.5 s auf meinem superschnellen desktop, die lock-version ist sogar noch schlimmer, es selbst zu versuchen)
Der nächste Punkt ist, dass mit C Sie neigen dazu, sich auf den Speicher zugreifen und Daten direkt - nichts in die Quere kommt, mit C#/Java verwenden Sie einige der vielen Klassen, die bereitgestellt werden. Diese werden gut im Allgemeinen Fall, aber du bist nach dem besten und effektivsten Weg, um auf diese zuzugreifen (die, für Ihren Fall ist ein big deal mit multi-Terabyte-Daten, die Klassen wurden nicht entwickelt, mit denen Datensätze in mind, Sie wurden entworfen für den häufigen Fällen jeder andere auch verwendet), also nochmal, Sie wäre sicherer mit C für diesen - du wirst nie die GC immer verstopft von einer Klasse, schafft neue Zeichenfolgen intern, wenn Sie Lesen, ein paar Terabyte an Daten, wenn Sie es schreiben in C!
So kann es scheinen, dass die C#/Java kann Ihnen Vorteile gegenüber einer nativen Anwendung, aber ich denke, Sie finden diese Vorteile werden nur realisiert, für die Art von line-of-business-Anwendungen, die Häufig geschrieben.
InformationsquelleAutor der Antwort gbjbaanb
Beachten Sie, dass für schwere Berechnungen es ist ein großer Vorteil in engen Schleifen, die passen in die CPU first level cache, wie es sich vermeiden, gehen langsameren Speicher immer wieder auf die Anweisungen.
Sogar für level zwei cache-ein großes Programm wie Quake IV bekommt eine 10% performance-Steigerung mit 4 Mb level 2-cache gegenüber 1 Mb level-2-cache - http://www.tomshardware.com/reviews/cache-size-matter,1709-5.html
Für diesen engen Schleifen C ist wahrscheinlich das beste, da haben Sie die größte Kontrolle über den erzeugten Maschinencode, aber für alles andere sollten Sie gehen für die Plattform mit der besten Bibliotheken für die jeweilige Aufgabe, die Sie tun müssen. Zum Beispiel die Netzwerkbibliothek Bibliotheken haben den Ruf, sehr gute Leistung für eine sehr große Menge von Problemen, und viele Schnittstellen zu anderen Sprachen sind verfügbar.
InformationsquelleAutor der Antwort Thorbjørn Ravn Andersen
Wenn jeder Prozentsatz wird wirklich sparen Sie Zehntausende von Dollar, dann sollten Sie in einem domain-Experten helfen mit dem Projekt. Gut gestaltet und geschrieben code mit der Leistung in der Anfangsphase kann eine Größenordnung schneller, sparen Sie 90% oder 900.000 US-Dollar. Vor kurzem fand ich einen subtilen Fehler im code, beschleunigt einen Prozess, durch über 100 mal. Ein Kollege von mir gefunden, der Algorithmus läuft in O(n^3), dass er wieder schrieb, um es O(N log n). Dies führt tendenziell zu sein, wo die großen performance-speichern sind.
Wenn das problem so einfach, dass Sie sicher sind, dass ein besserer Algorithmus nicht eingesetzt werden kann, wodurch Sie erhebliche Einsparungen, dann C ist wahrscheinlich Ihre beste Sprache.
InformationsquelleAutor der Antwort Stephen Nutt
Die wichtigsten Dinge sind bereits hier gesagt. Ich möchte hinzufügen:
Der Entwickler verwendet eine Sprache, die der compiler(N) nutzen(s) zur Erzeugung der Maschinenbefehle, die der Prozessor(en) nutzen(s) für die Verwendung von system-Ressourcen. Ein Programm "schnell", wenn ALLE Teile der Kette optimal durchführen.
Also für die "beste" Wahl der Sprache:
Wenn Sie nicht ein performance-Experte Sie haben eine harte Zeit zu erreichen "peak-performance" innerhalb JEDER Sprache. Möglicherweise C++ bietet immer noch die meisten Optionen zur Steuerung der Maschinen-Anweisungen (insbesondere SSE-Erweiterungen ein.s.o).
Schlage ich vor, sich zu orientieren auf die bekannte 80:20-Regel. Das ist ziemlich gut für alle wahr: die hardware, die Sprachen/Plattformen und die Entwickler Bemühungen.
Entwickler haben immer stützte sich auf die hardware zu beheben, alle performance-Probleme automatisch durch ein upgrade auf einen schnelleren Prozessor f.e.. Was vielleicht funktionierte in der Vergangenheit nicht in die (nächste) Zukunft. Der Entwickler hat nun die Verantwortung für die Struktur Ihrer Programme entsprechend für die parallelisierte Ausführung. Sprachen für virtuelle Maschinen und virtuelle Laufzeitumgebungen zeigen einige Vorteile hier. Und auch ohne massive Parallelisierung es gibt wenig bis keinen Grund, warum C# oder Java sollten nicht gelingt ähnlich gut wie C++.
@Edit: Siehe auch diesen Vergleich von C#, Matlab und FORTRANwo FORTRAN nicht gewinnt allein!
InformationsquelleAutor der Antwort user492238
Ref; "Meine benchmarks so weit zeigen, Java und C sind in etwa auf Augenhöhe mit jedem anderen"
Dann deine benchmarks sind stark fehlerhaft...
C wird IMMER Größenordnungen schneller ist als C# und Java, es sei denn, Sie tun etwas ernsthaft falsch...!
PS!
Beachten Sie, dass dies nicht ein Versuch, um zu versuchen, zu schikanieren, weder C# noch Java, ich mag beide, Java und C#, und es gibt andere Gründe, warum Sie für viele Probleme entweder Java oder C# statt C Aber weder Java noch C# würde in eine korrekte schriftliche tests NIE in der Lage sein, um Sie mit der gleichen Geschwindigkeit wie C...
Bearbeitet, weil die schiere Anzahl der Kommentare streiten gegen meine Rhetorik
Vergleichen Sie diese zwei Kerle...
C#
gegen diese (C)
Die C# - version benötigt vor allem zum speichern von array auf dem heap. Die C-version speichert das array auf dem stack. Zu store Sachen auf dem Stapel ist nur das ändern des Werts von einem integer-Wert, während zum speichern von Sachen auf dem heap bedeutet, herauszufinden, einen ausreichend großen Anteil des Speichers und potenziell bedeutet das Durchlaufen der Speicher für eine ziemlich lange Zeit.
Nun vor allem C# und Java reserviert riesige Brocken von Speicher, die Sie halten auf die Ausgaben, bis es aus ist, das macht diese Logik schneller ausführen. Aber auch dann vergleichen Sie diese gegen eine änderung der Wert ein integer ist wie eine F16 gegen ein öl-tanker speedwise...
Zweite in der C-version, da alle diese Objekte sind bereits auf dem Stapel ist, brauchen wir nicht explizit anlegen von neuen Objekten innerhalb der Schleife. Noch einmal für C# ist dies ein "suchen nach verfügbaren Speicher-Betrieb", während die C-version ist eine ZIP - (nichts tun Betrieb)
Dritte ist die Tatsache, dass die C-version wird automatisch löschen Sie alle diese Objekte, wenn Sie laufen out of scope. Doch auch dies ist eine operation, die ÄNDERT NUR DEN WERT VON EINEM INTEGER-WERT. Das würde auf den meisten CPU-Architekturen zwischen 1 und 3 CPU-Zyklen. Die C# - version tut das nicht, aber wenn der Garbage Collector aktiv wird, und Bedürfnisse zu erfassen, diese Elemente meine Vermutung ist, dass wir reden MILLIONEN von CPU-Zyklen...
Auch die C-version wird sofort x86-code (auf einem x86-CPU), während die C# - version würde sich zum ersten mal mit IL-code. Später dann ausgeführt, wenn es sein müsste, JIT-kompiliert werden, was wahrscheinlich allein nimmt Größenordnungen mehr Zeit, dann nur die Ausführung der C-version.
Nun einige wise guy könnte wahrscheinlich führen Sie den obigen code und Messen die CPU-Zyklen. Jedoch ist es im Grunde gar keinen Punkt zu tun, weil mathematisch ist es bewiesen, dass die Managed-Version würde wahrscheinlich mehrere Millionen mal die Anzahl der CPU-Zyklen als die C version. Also meine Vermutung ist, dass wir reden jetzt über 5-8 Größenordnungen langsamer als in diesem Beispiel. Und sicher, dies ist ein "rigged-test", dass ich "suchte etwas, um meinen Standpunkt zu beweisen", aber ich fordere diejenigen, die kommentierte schlecht gegen mich auf diesen Beitrag zu erstellen, eine Stichprobe, die NICHT schneller ausgeführt in C-und die auch nicht verwenden Konstrukte, die Sie normalerweise nie verwenden würde, in C durch "bessere alternativen" vorhanden.
Beachten Sie, dass C# und Java sind GROßE Sprachen. Ich bevorzuge diese über C zu JEDER ZEIT DES TAGES. Aber NICHT, weil Sie SCHNELLER sind. Denn das sind Sie NICHT. Sie sind IMMER langsamer als C und C++. Es sei denn, Sie haben kodiert, die Augen verbunden, die in C oder C++...
Bearbeiten;
C# natürlich haben die struct Schlüsselwort, das würde ernsthaft ändern Sie die Geschwindigkeit für die obigen C# - version, wenn änderten wir die C# - Klasse, um einen Wert geben, indem das Schlüsselwort struct statt Klasse. Das struct-Schlüsselwort bedeutet, dass C# - store neue Objekte für den gegebenen Typ auf dem stack, was für das obige Beispiel, würde die Geschwindigkeit erhöhen ernst. Immer noch die oben genannten Beispiel-passiert-Funktion auch ein array dieser Objekte.
Obwohl, wenn wir gingen durch und optimiert die C# - version, wie diese, würden wir noch am Ende mit etwas, das mehrere Größenordnungen langsamer als die C version...
Einen gute geschriebene Stück C-code IMMER schneller sein, dann C#, Java, Python und was auch immer-verwaltet-Sprache-Sie-wählen Sie...
Als ich sagte, ich Liebe C# und die meisten der Arbeit, die ich tun heute ist C# und nicht C. Jedoch glaube ich nicht, C#, weil es schneller ist als C. ich verwende C#, weil ich die Geschwindigkeit nicht braucht Verstärkung C gibt mir für die meisten meiner Probleme.
Sowohl in C# und Java, ist aber lächerlich langsamer als C und C++ für diese Angelegenheit...
InformationsquelleAutor der Antwort Thomas Hansen