Ich habe eine Klasse in C und ich habe ein bisschen davon alleine gelernt und ich denke, Im an der Stelle, wo ich ein paar einfache Programme machen konnte (mehr als nur ein paar hundert Zeilen Code wie Buchbeispiele), aber ich nicht Haben gute Ideen für das Programm. Ich habe angefangen, Code für ein Text basiertes RPG zu schreiben, aber ich möchte versuchen, etwas mehr zu schreiben, wie die Programmierer, die für einen lebenden Code programmieren. Wer auf dem Feld arbeitet, hat irgendwelche Vorschläge Im Lounge-Forum gibt es einige Ideen. Hier sind einige: hrm. Ich könnte vorschlagen, einen Abschnitt hinzugefügt für Projektideen. Eines der Dinge, die ich immer mit dem Lernen einer neuen Sprache gekämpft habe, ist das Finden von Projekten, die mein Wissen testen würden, ohne vorzugehen, was ich gelesen oder verstanden habe. (Die ganze Zeit ist etwas Spaß und Unterhaltsames, um zu üben. Etwas, das mir irgendeine Belohnung gab, wie das Schreiben eines Programms, für das ich eigentlich einen Gebrauch finden konnte.) Ein Abschnitt, in dem die Projekte zusammen mit Schwierigkeiten eingereicht werden konnten Irgendeine Art zu wissen, in welcher Reihenfolge am besten zu tun ist, wäre eine gute Idee. Ich weiß, das ist wahrscheinlich nicht viel Hilfe für dich icemanfan. Aber es hilft wahrscheinlich Leute wie ich, die gerade angefangen haben. Das ist meine Liste, die ich gemacht habe. Hehe Ich stecke auf Nummer 22. lolz. Könnte nicht die dumme Blase sortieren Klasse zu arbeiten für wie 2 Nächte jetzt. Seufzt Anfänger 1. Schreiben Sie ein Programm, das die Fakultät einer vom Benutzer eingegebenen Nummer findet. (Auf alle Bedingungen prüfen) (Anfänger). 2. Entwickeln Sie ein Programm, um die Währung X in die Währung Y und umgekehrt (Anfänger) umzuwandeln. 3. Schreiben Sie ein Programm, das den folgenden ausdruckt, wird der Benutzer die oberste Zahl eingeben: 4. Schreiben Sie ein Programm, das den folgenden ausdruckt, wird der Benutzer die untere Zahl eingeben: 5. Schreiben Sie ein Programm, das das folgende Dreieck ausgibt, den Benutzer Wird die untere Zahl eingeben: 6. Entwickeln Sie ein Programm, das eine zufällig generierte Zahl verwendet, um 1 von 3 (oder mehr) Funktionen auszuwählen, um den Benutzer anzuzeigen. (Anfänger) 7. Raten Spiel. Schreiben Sie ein c-Spiel, das den Benutzer bittet, eine Zahl zwischen 1 und 100 zu erraten. Wenn Sie richtig erraten haben, wird es sagen, dass Sie gewinnen. Wenn Sie zu hoch oder zu niedrig sind, werden Sie es auch wissen lassen. (Anfänger) 8. Erstellen Sie ein Programm, das Fibonacci-Serien erzeugt, bis eine Zahl n, wo n vom Benutzer eingegeben wird. Zum Beispiel. Wenn der Benutzer 10 eingibt, dann wäre die Ausgabe: 1 1 2 3 5 8 (Anfänger) 9. Bestimmen Sie, wie viele der Charaktere Vokale sind und wieviele Konsonanten in einer bestimmten Textzeile sind. Beenden Sie auch die Zeichenfolge, wenn das eingegebene Zeichen anders als die Alphabete ist. (Anfänger). 10. Finde die Fünfte Wurzel der Summe der Quadrate der ersten 100 ODD-Zahlen nur. (Anfänger) 11. Führen Sie 4-Buchstaben-WORD UNSCRAMBLING aus, d. h. Alle möglichen Kombinationen von 4-Buchstaben in einem Wort auflisten. Beispiel: Das Wort TEST kann als TEST, TETS, TSET, TSTE, TTSE, TTES usw. (Anfänger) 12. Machen Sie ein Programm, das dem Benutzer erlaubt, entweder den Radius, den Durchmesser oder den Bereich des Kreises einzugeben. Das Programm sollte dann das andere 2 basierend auf dem Eingang berechnen. (Anfänger) 13. LESEN Sie eine Textzeile und verteilen Sie es mit der RECURSIVE-Funktion auf BACKWARDS. (Anfänger) 14. Schreiben Sie ein Programm an SWAP den Inhalt von 3 Variablen, ohne die temporären (oder extra) Variablen zu verwenden. (Anfänger) 15. Schreiben Sie ein Programm, das die Ziffern in einer Ganzzahl umkehrt, dh 326 wird 623 usw. (Anfänger) 16. Das Programm wird dem Benutzer jedes Mal sagen, ob er hoch oder niedrig erraten hat. Der Benutzer gewinnt das Spiel, wenn die Nummer erraten ist die gleiche wie zufällig generierte Zahl. (Anfänger) 17. Schreiben Sie ein Programm, um einen einfachen Rechner zu simulieren. Es sollte zwei Nummern vom Benutzer akzeptieren, zusammen mit dem erforderlichen Vorgang. Addition, Subtraktion, Division und Multiplikation sind die Grundoperationen, die implementiert werden sollen. Fühlen Sie sich frei, die anderen Operationen zu implementieren (Anfänger) 18. Bestimmen Sie, wie viel Geld in einer Sparschwein ist, die mehrere 50 Pais Münzen, 25 Pais Münzen, 20 Pais Münzen, 10 Pais Münzen und 5 Pais Münzen enthält. Verwenden Sie die folgenden Werte, um Ihr Programm zu testen. Fünf 50 paise Münzen, Drei 25 Pais Münzen, Zwei 20 Paise Münzen, Eine 10 Paise Münze und Fünfzehn 5 Paise Münzen. (Anfänger) 19. Erstellen Sie ein einfaches Palindrome Checker Programm. Das Programm sollte dem Benutzer erlauben, einen String einzugeben und zu prüfen, ob der angegebene String ein Palindrom ist oder nicht. Bei der Überprüfung von Palindromen sollten nur Ziffern und Alphabete berücksichtigt werden - alle anderen Charaktere werden ignoriert. (Anfänger) 20. Schreiben Sie ein Programm, das Ihnen erlaubt, Schüler Scores und Gewichte eingeben. Das Programm sollte dann einen gewichteten Durchschnitt berechnen und auf der Grundlage der vom Benutzer eingegebenen Daten bewerten. (Anfänger) Zwischenstufe 21. Schreiben Sie ein Programm, das alle Paare von Primzahlen ausdruckt, deren Summe gleich der vom Benutzer eingegebenen Nummer ist. (Vorgeschlagen von Aniseed) (Mittelstufe) 22. Entwickeln Sie eine Tierklassifizierungsprogrammbasis für das Tierreich. (Für die Praxis der Verwendung von Einwohnerklassen). 23. Schreiben Sie ein Quizprogramm, das die Frage abruft und aus einer Datei antwortet. Dann erlauben Sie dem Benutzer, den Quizcount-Punkt zu nehmen und die Punktzahl zurückzugeben. (Zwischenstufe) 24. Schreiben Sie ein Programm, das XHTML akzeptiert, analysiert und die Tags entfernt. Dann druckt es den verbleibenden Text aus. (Zwischenstufe) 25. Schreiben Sie ein Programm, das Addition, Subtraktion, Multiplikation von Matrizen durchführt. Die Dimensionen der beiden Matrizen würden vom Benutzer vorgegeben (dynamische Speicherzuteilung erforderlich). Verwendung von Struktur oder eine Klasse, um die Matrix zu definieren wäre eine gute Idee. (Zwischenstufe) 26. Schreiben Sie ein Programm, das den Auftrag ausführt, die Datei von einem Ort zum anderen zu verschieben. Der Quell - und Zielpfad wird vom Benutzer eingegeben. Führen Sie die erforderliche Fehlerprüfung durch und behandeln Sie die Ausnahmen entsprechend. (Zwischenstufe) 27. Erstellen Sie eine anspruchsvolle verknüpfte List-Klasse. Sie sollten in der Lage sein, Knoten irgendwo in der Liste einzufügen und zu löschen, und die Knoten sollten Zeiger auf Knoten sowohl vor als auch hinter ihnen haben. (Zwischenstufe) 28. Erstellen Sie ein Programm, das eine Datenbank in C implementiert. Die Felder sind hartcodiert und die Daten werden in einer Binärdatei gespeichert. Obwohl dies nicht wirklich Flexibilität, Sie arent verlassen sich auf alle externen Bibliotheken oder Funktionen. (Mittelstufe) Expert 1. Implementieren Sie Ihre eigene strstr. 2. Schreiben Sie ein Programm, das wie ein persönlicher Planer gehandelt hat. In dem ein Benutzer in Ereignis eingeben kann, Notiz von Ding zu tun, zu bestimmten Datum. 3. Tic Tac Toe Programm. 4. Einfache Dateiverschlüsselung (mit etwas einfachem wie ROT13. 5. Schreiben Sie ein Telefonadressen-Buch-Programm, mit Daten speichern in Binärdateien. Die Benutzer sollten in der Lage, adddelete die Daten hinzuzufügen 6. Schreiben Sie ein einfaches Abrechnungsprogramm, das würde zahlen Tarife , Und Stunden arbeiten für die Mitarbeiter 7. Erstellen Sie ein paar Klassen, die Spielkarten zu modellieren. Wenden Sie dann dieses Framework, um Ihre Lieblings-Kartenspiel zu erstellen. Schmuck .. etc (Experte) 8. Erstellen Sie ein paar Klassen, die Schachfiguren Modell Echtes Schachspiel (Experte) 9. Erstellen Sie einen Binärbaum, der Such - und Sortierfunktionen hat (Experte) 10. Erstellen Sie einen Quine, dh ein Programm, das seinen eigenen Quellcode ausdruckt (Experte) 11. Implementieren Sie Ihre eigenen Version des Standard Template Library (Expert) Grafik 1. Schreiben Sie ein Programm, um ein Rechteck, eine Ellipse, ein Quadrat, einen Kreis, einen Punkt und eine Linie basierend auf Benutzereingaben zu zeichnen. (Anfänger) 2. Schreiben Sie ein Programm, um Microsoft Paint zu emulieren Zwischen verschiedenen Werkzeugen (Kreis, Rechteck, Radiergummi) mit vordefinierten Tastenanschlägen umschalten. Zwischenstufe 3. Schreiben Sie ein Programm, um ein einfaches x-y-Diagramm für eine harcodierte Funktion (z. B. ycos (x)) zu zeichnen. Es sollte möglich sein, einen beliebigen Teil des Graphen zu vergrößern. - Mittlere. 4. Schreiben Sie ein Programm, um ein Diagramm der gegebenen Gleichung der Form yf (x) und eines Bereichs für x als Befehlszeilenargumente darzustellen. (Z. B. mygraphplotter - eqyxx - xmin-10, - xmax10) - Experte. (PS: mehr mit Gleichungslösung als Grafik zu tun) 5. Schreiben Sie das klassische Brick-Break-Out Spiel. Z. B. Siehe DX Ball. Experte. Zuletzt bearbeitet am 11.08.2008 um 03:04 Uhr UTCGenerally, C und Java können genauso schnell oder schneller sein, denn der JIT-Compiler - ein Compiler, der dein IL beim ersten Mal kompiliert - kann Optimierungen machen, dass ein C-kompiliertes Programm ist Kann nicht, weil es die Maschine abfragen kann. Es kann feststellen, ob die Maschine Intel oder AMD Pentium 4, Core Solo oder Core Duo ist oder wenn SSE4 unterstützt wird. AC Programm muss vorher mit gemischten Optimierungen kompiliert werden, damit es an allen Maschinen anständig läuft, aber nicht Optimiert so viel wie es für eine einzelne Konfiguration (dh Prozessor, Befehlssatz, andere Hardware) sein könnte. Zusätzlich können bestimmte Sprachfunktionen dem Compiler in C und Java erlauben, Annahmen über Ihren Code zu machen, der es erlaubt, bestimmte Teile zu optimieren, die nur für den CC-Compiler sicher sind. Wenn Sie Zugang zu Zeigern haben, gibt es viele Optimierungen, die einfach nur sicher sind. Auch Java und C können Heap-Zuweisungen effizienter machen als C, weil die Abstraktionsschicht zwischen dem Garbage Collector und Ihrem Code es erlaubt, alle seine Heap-Kompression sofort zu machen (eine ziemlich teure Bedienung). Jetzt kann ich nicht für Java auf diesem nächsten Punkt sprechen, aber ich weiß, dass C zum Beispiel tatsächlich Methoden und Methodenaufrufe entfernen wird, wenn es weiß, dass der Körper der Methode leer ist. Und es wird diese Art von Logik in Ihrem Code verwenden. So wie Sie sehen können, gibt es viele Gründe, warum bestimmte C - oder Java-Implementierungen schneller sein werden. Nun, das alles gesagt, können spezifische Optimierungen in C gemacht werden, die alles wegblasen wird, was man mit C machen könnte, vor allem im Grafikbereich und jederzeit in der Nähe der Hardware. Zeiger machen hier Wunder Also, je nachdem, was du schreibst, würde ich mit dem einen oder anderen gehen. Aber wenn du etwas schreibst, das nicht hardwareabhängig ist (Fahrer, Videospiel, etc.), würde ich mich nicht um die Aufführung von C sorgen (nochmal nicht über Java sprechen). Es geht mir gut Einer der Java-Seite, Swati weist auf einen guten Artikel hin: JIT vs. Static Compiler Wie bereits in den vorherigen Beiträgen gesagt, kann JIT ILbytecode zur Laufzeit in nativen Code kompilieren. Die Kosten dafür wurden erwähnt, aber nicht zu seinem Abschluss: JIT hat ein massives Problem ist, dass es nicht alles kompilieren kann: JIT Kompilieren braucht Zeit, so dass der JIT nur einige Teile des Codes kompilieren wird, während ein statischer Compiler eine volle Leistung produzieren wird Native binary: Für irgendeine Art von Programmen, wird der statische Compiler einfach einfach übertreffen die JIT. Natürlich ist C (oder Java oder VB) in der Regel schneller, um eine lebensfähige und robuste Lösung zu produzieren, als C (wenn nur, weil C komplexe Semantik hat und C-Standardbibliothek, während interessant und leistungsstark, im Vergleich zum vollen ziemlich schlecht ist Umfang der Standardbibliothek von oder Java), also in der Regel der Unterschied zwischen C und Java JIT wird nicht für die meisten Benutzer sichtbar sein, und für die Binärdateien, die kritisch sind, können Sie immer noch C Verarbeitung von C oder Java (sogar Wenn diese Art von einheimischen Anrufen in sich selbst kostspielig sein kann). C-Metaprogramm Beachten Sie, dass Sie in der Regel C-Laufzeitcode mit seinem Äquivalent in C oder Java vergleichen. Aber C hat eine Funktion, die JavaC aus der Box übertreffen kann, das ist die Vorlagen-Metaprogrammierung: Die Code-Verarbeitung wird zum Zeitpunkt der Kompilierung durchgeführt und damit eine umfangreiche Kompilierungszeit erhöht, was zu einer Laufzeit von Null (oder fast Null) führt. Ich habe noch so einen wirklichen Lebenseffekt auf diesem (ich spielte nur mit Konzepten, aber bis dahin war der Unterschied Sekunden Sekunden für die Ausführung für JIT und null für C), aber das ist erwähnenswert, neben der Tatsache Vorlage Metaprogramme ist nicht trivial. Bearbeiten 2011-06-10: In C wird das Spielen mit Typen zum Zeitpunkt der Kompilierung durchgeführt, was bedeutet, generischen Code zu erzeugen, der nicht generischen Code anruft (zB ein generischer Parser von String zu Typ T, Aufruf der Standard-Bibliotheks-API für Typen T erkennt es, Und macht den Parser leicht von seinem Benutzer erweiterbar) ist sehr einfach und sehr effizient, während das Äquivalent in Java oder C ist schmerzlich am besten zu schreiben, und wird immer langsamer und gelöst zur Laufzeit, auch wenn die Typen zum Zeitpunkt der Kompilierung bekannt sind, Bedeutet, dass Ihre einzige Hoffnung für das JIT ist, das Ganze inline zu setzen. Bearbeiten 2011-09-20: Das Team hinter Blitz (Homepage Wikipedia) ging so, und anscheinend ist es ihr Ziel, FORTRANs Leistung auf wissenschaftlichen Berechnungen zu erreichen, indem man so weit wie möglich von der Laufzeitausführung zur Kompilierungszeit über C-Template-Metaprogrammierung bewegt . Also habe ich noch so einen wirklichen Lebenseffekt auf diesem Teil gesehen, den ich oben geschrieben habe, scheinbar im wirklichen Leben existiert. Native C Speicherverwendung C hat einen Speicherverbrauch, der sich von JavaC unterscheidet und somit unterschiedliche Vorteile hat. Egal wie die JIT-Optimierung, nichts wird schnell gehen, da der direkte Zeiger auf den Speicher zugreifen kann (läßt für einen Moment Prozessor-Caches usw. ignorieren). Also, wenn Sie zusammenhängende Daten im Gedächtnis haben, greifen Sie auf sie durch C-Zeiger zu (d. h. C-Zeiger. Lets geben Caesar seine fällig) geht mal schneller als in JavaC. Und C hat RAII, was viel Verarbeitung viel einfacher macht als in C oder sogar in Java. C braucht es nicht zu verwenden, um die Existenz seiner Objekte zu berechnen. Und C hat keine endgültige Klausel. Das ist kein Fehler. Und trotz C primitiv-artigen Strukturen, C auf den Stapelobjekten kostet nichts bei Zuteilung und Zerstörung, und wird kein GC brauchen, um in einem unabhängigen Faden zu arbeiten, um die Reinigung zu machen. Wie bei der Speicherfragmentierung sind die Speicherzuweisungen im Jahr 2008 nicht die alten Speicherzuweisungen aus dem Jahr 1980, die in der Regel mit einem GC verglichen werden: C-Zuordnung kann nicht im Speicher verschoben werden, wahr, aber dann, wie auf einem Linux-Dateisystem: Wer benötigt Festplatte Defragmentierung wann Fragmentierung nicht passieren Mit dem richtigen Zuweiser für die richtige Aufgabe sollte ein Teil des C-Entwickler-Toolkits sein. Jetzt ist das Schreiben von Zuweisern nicht einfach, und dann haben die meisten von uns bessere Dinge zu tun, und für die meisten von Gebrauch ist RAII oder GC mehr als gut genug. Edit 2011-10-04: Beispiele für effiziente Allokatoren: Auf Windows-Plattformen, seit Vista, ist die Low Fragmentation Heap standardmäßig aktiviert. Bei früheren Versionen kann der LFH durch Aufruf der WinAPI-Funktion HeapSetInformation aktiviert werden). Auf anderen Systemen werden alternative Zuweiser bereitgestellt (siehe secure. wikimedia. orgwikipediaenwikiMalloc für eine Liste) Jetzt wird das Speichermodell etwas komplizierter mit dem Aufstieg der Multicore - und Multithreading-Technologie. In diesem Bereich habe ich den Vorteil, und Java, wurde mir gesagt, hielt den Oberboden. Es ist einfach für einige auf dem nackten Metall-Hacker zu loben seine in der Nähe der Maschine Code. Aber jetzt ist es ziemlich schwieriger, eine bessere Montage von Hand zu produzieren, als den Compiler zu seinem Job zu lassen. Für C wurde der Compiler in der Regel besser als der Hacker seit einem Jahrzehnt. Für C und Java ist das noch einfacher. Dennoch wird der neue Standard C0x ein einfaches Speichermodell für C-Compiler auferlegen, die den effektiven Multiprozess-Parallel-Render-Code in C standardisieren und vereinfachen und Optimierungen für Compiler einfacher und sicherer machen. Aber dann, sehen Sie in einigen paar Jahren, wenn seine Versprechen wahr gehalten werden. CCLI vs. CVB Hinweis: In diesem Abschnitt spreche ich über CCLI, das heißt, die C gehostet von, nicht die native C. Letzte Woche hatte ich ein Training zur Optimierung und entdeckte, dass der statische Compiler sowieso sehr wichtig ist. So wichtig wie JIT. Der gleiche Code, der in CCLI (oder seinem Vorfahren, Managed C) kompiliert wurde, könnte mal schneller sein als der gleiche Code, der in C (oder VB, dessen Compiler das gleiche IL erzeugt als C) erzeugt. Weil der C-statische Compiler viel besser war, um bereits optimierten Code als Cs zu produzieren. Beispielsweise ist die Funktionseinblendung auf Funktionen beschränkt, deren Bytecode kleiner oder gleich 32 Bytes lang ist. Also, einige Code in C wird ein 40-Byte-Accessor, die nicht immer inlineed durch die JIT. Der gleiche Code in CCLI wird einen 20-Byte-Accessor erzeugen, der vom JIT inlineiert wird. Ein anderes Beispiel sind temporäre Variablen, die einfach vom C-Compiler kompiliert werden, während noch in der von dem C-Compiler erzeugten IL erwähnt wird. C statische Kompilierungsoptimierung führt zu weniger Code, so dass eine aggressivere JIT-Optimierung wieder aktiviert wird. Der Grund dafür wurde spekuliert, um die Tatsache zu sein, dass CCLI-Compiler von den umfangreichen Optimierungstechniken von C native Compiler profitierte. Fazit Aber so weit ich es sehe, sind C oder Java alles in allem eine bessere Wette. Nicht weil sie schneller als C sind, sondern weil sie, wenn sie ihre Qualitäten addieren, am Ende produktiver sind und weniger Training benötigen und mehr komplette Standardbibliotheken als C. haben. Und für die meisten Programme sind ihre Geschwindigkeitsunterschiede (in einem Weg oder andere) ist vernachlässigbar. Bearbeiten (2011-06-06) Meine Erfahrung auf C Ich habe jetzt 5 Monate fast exklusive professionelle C-Codierung (die bis zu meinem CV bereits voll von C und Java, und ein Hauch von CCLI). Ich habe mit WinForms (Ahem.) Und WCF (cool) gespielt und WPF (Cool. Beide durch XAML und Roh C. WPF ist so einfach ich glaube Swing kann einfach nicht damit vergleichen) und C 4.0. Die Schlussfolgerung ist, dass, während sein einfacherfester, einen Code zu produzieren, der in CJava als in C arbeitet, ist es viel schwieriger, einen starken, sicheren und robusten Code in C (und noch härter in Java) als in C zu produzieren. Gründe im Überfluss, aber es Kann zusammengefasst werden durch: Generika sind nicht so mächtig wie Vorlagen (versuchen Sie, eine effiziente generische Parse-Methode (von String zu T) zu schreiben, oder ein effizientes Äquivalent von boost :: lexicalcast in C, um das Problem zu verstehen) RAII bleibt unübertroffen (GC noch Ich kann es nicht lecken (ja, ich musste mit diesem Problem umgehen) und wird nur mit dem Gedächtnis umgehen. Auch Cs-Nutzung ist nicht so einfach und leistungsstark, weil das Schreiben einer korrekten Dispose-Implementierung schwierig ist) C readonly und Java final sind nirgends so nützlich wie Cs const (Theres Auf keinen Fall könntest du in engen, aber auch unkomplizierten Daten eine interessante Lösung finden, aber nicht alles kann unveränderlich gemacht werden Nicht einmal genug, bei weitem). Also, C bleibt eine angenehme Sprache, solange du etwas willst, was funktioniert, aber eine frustrierende Sprache, wenn du etwas willst, was immer und sicher arbeitet. Java ist noch frustrierender, da es die gleichen Probleme hat wie C, und mehr: Das Äquivalent von Cs mit Keyword, ein sehr erfahrener Kollege von mir verbrachte zu viel Zeit, um sicherzustellen, dass seine Ressourcen, wo richtig befreit, während das Äquivalent in C würde War einfach (mit destruktoren und smart pointers). Also schätze ich, dass CJavas Produktivitätsgewinn für den meisten Code sichtbar ist. Bis der Tag, den Sie brauchen, um den Code so perfekt wie möglich zu sein. An diesem Tag weißt du Schmerzen. (Sie werden nicht glauben, was von unserem Server und GUI Apps gefragt wird.). Über Server-Seite Java und C hielt ich Kontakt zu den Server-Teams (ich arbeitete 2 Jahre unter ihnen, bevor ich zurück zum GUI-Team kam), auf der anderen Seite des Gebäudes, und ich lernte etwas Interessantes. In den vergangenen Jahren war der Trend, dass die Java-Server-Apps dazu bestimmt sind, die alten C-Server-Apps zu ersetzen, da Java viele Frameworkstools hat und einfach zu warten, zu implementieren usw. usw. ist. Bis zum Problem der geringen Latenzzeit Erntete seinen hässlichen Kopf in den letzten Monaten. Dann haben die Java-Server-Apps, egal die Optimierung, die von unserem erfahrenen Java-Team versucht wurde, einfach und sauber das Rennen gegen den alten, nicht wirklich optimierten C-Server verloren. Derzeit ist die Entscheidung, die Java-Server für die gemeinsame Nutzung zu halten, wo die Leistung immer noch wichtig ist, ist nicht von der Low-Latency-Ziel betroffen und aggressiv optimieren die bereits schnellere C-Server-Anwendungen für Low-Latency und Ultra-Low-Latency-Anforderungen. Fazit Nichts ist so einfach wie erwartet Java, und noch mehr C, sind coole Sprachen, mit umfangreichen Standardbibliotheken und Frameworks, wo man schnell korrigieren kann und sehr bald kommen kann. Aber wenn Sie rohe Kraft, leistungsstarke und systematische Optimierungen, starke Compiler-Unterstützung, leistungsstarke Sprachfunktionen und absolute Sicherheit benötigen, machen Java und C es schwierig, die letzten fehlenden aber kritischen Qualitätsprozente zu gewinnen, die Sie über dem Wettbewerb bleiben müssen. Sein als ob Sie weniger Zeit und weniger erfahrene Entwickler in CJava benötigten, als in C, um durchschnittlichen Qualitätscode zu produzieren, aber in der anderen Hand, in dem Moment, in dem Sie ausgezeichnetes zu vollkommenem Qualitätscode benötigten, war es plötzlich einfacher und schneller, die Resultate richtig zu erhalten C. Natürlich ist das meine eigene Wahrnehmung, vielleicht auf unsere spezifischen Bedürfnisse beschränkt. Aber trotzdem passiert es heute, sowohl in den GUI-Teams als auch in den serverseitigen Teams. Natürlich korrigiere diesen Beitrag, wenn etwas Neues passiert. Bearbeiten (2011-06-22) Wir finden, dass in Bezug auf Leistung, C gewinnt durch eine große Marge. Allerdings brauchte es auch die umfangreichsten Tuning-Bemühungen, von denen viele auf einem Niveau der Raffinesse getan wurden, die dem durchschnittlichen Programmierer nicht zur Verfügung stehen würde. . Die Java-Version war wohl die einfachste zu implementieren, aber am schwierigsten zu analysieren für die Leistung. Speziell waren die Effekte um die Garbage Collection kompliziert und sehr schwer zu stimmen. Bearbeiten (2011-09-20) Das gehende Wort bei Facebook ist, dass vernünftig geschrieben C-Code läuft nur schnell, was unterstreicht die enorme Anstrengungen bei der Optimierung von PHP und Java-Code verbracht. Paradoxerweise ist C-Code schwieriger zu schreiben als in anderen Sprachen, aber effizienter Code ist viel einfacher, in C als in anderen Sprachen zu schreiben. Die Codebearbeitung erfolgt bei der Zusammenstellung timequot. Daher ist die Vorlagen-Metaprogrammierung nur im Programm verfügbar, ist zur Kompilierzeit verfügbar, was oft nicht der Fall ist, z. B. Es ist unmöglich, eine kompetitiv performante reguläre Expressionsbibliothek in Vanille C zu schreiben, weil sie nicht in der Lage ist, eine Laufzeitcodegenerierung (ein wichtiger Aspekt der Metaprogrammierung) zu haben. Ndash Jon Harrop Jan 17 12 at 10:08 Immer wenn ich reden verwaltet vs nicht verwaltete Leistung, ich mag auf die Serie Rico (und Raymond) verglichen C und C Versionen eines chinesisch-englischen Wörterbuchs. Diese Google-Suche lässt Sie sich selbst lesen, aber ich mag Ricos Zusammenfassung. Also schäme ich mich von meiner vernichtenden Niederlage. Der verwaltete Code hat ein sehr gutes Ergebnis für kaum Aufwand. Um den verwalteten Raymond zu besiegen, musste er: seine eigene Akte schreiben IO Zeug Schreiben Sie seine eigene String-Klasse Schreiben Sie seinen eigenen Zuweiser Schreiben Sie seine eigene internationale Mapping Natürlich nutzte er auch niedrigere Bibliotheken, um das zu tun, aber das ist noch viel Arbeit. Kannst du anrufen, was ein STL-Programm übrig hat, denke ich nicht so, ich glaube, er hat die std :: vector-Klasse gehalten, die letztlich nie ein Problem war und er hielt die find-Funktion. So viel ist alles andere weg Also, du kannst die CLR definitiv schlagen. Raymond kann sein Programm noch schneller machen, denke ich. Interessanterweise ist die Zeit, um die Datei zu analysieren, wie von beiden Programmen interne Timer gemeldet wird etwa die gleiche - 30ms für jeden. Der Unterschied liegt im Overhead. Für mich ist die Quintessenz, dass es 6 Revisionen für die nicht verwaltete Version gab, um die verwaltete Version zu schlagen, die ein einfacher Port des ursprünglichen nicht verwalteten Codes war. Wenn du jedes letzte Stück von Leistung brauchst (und die Zeit und das Fachwissen hast, um es zu bekommen), dann musst du nicht verwaltet werden, aber für mich, komme ich die Größenordnung Vorteil habe ich auf die ersten Versionen über die 33 ich gewinnen, wenn ich Versuche 6 mal. Zuerst, wenn wir uns den Raymond Chen39s-Code anschauen, versteht er C - oder Datenstrukturen nicht ganz gut. Sein Code kommt fast gerade für Low-Level-C-Code auch in Fällen, in denen der C-Code hat keine Leistungsvorteile (es scheint nur eine Art von Misstrauen und vielleicht ein Mangel an Wissen, wie man Profiler verwenden). Er verstand auch nicht die algorithmisch solide Art, ein Wörterbuch zu implementieren (er benutzte std :: find for Christ39s sake). Wenn es etwas Gutes über Java, Python, C, etc. - sie alle bieten sehr effiziente Wörterbücher. Ndash stinky472 Feb 28 12 at 18:26 Tries oder sogar std :: Karte wäre viel günstiger in Richtung C oder sogar ein Hash Tisch. Schließlich ist ein Wörterbuch genau die Art von Programm, das am meisten von High-Level-Bibliotheken und Frameworks profitiert. Es zeigt keine Unterschiede in der Sprache, so viel wie die beteiligten Bibliotheken (von denen ich gerne sagen würde, dass C weitaus vollständiger ist und viel mehr Werkzeuge für die Aufgabe zur Verfügung stellt). Zeigen Sie ein Programm, das große Blöcke des Gedächtnisses im Vergleich, wie ein großformatiger Matrixvektorcode manipuliert. Das behauptet das ganz schnell, auch wenn, wie in diesem Fall die Kodierer nicht wissen, was. Ndash stinky472 Es ist nicht so sehr, dass du für die CPU-Optimierung kompilierst, aber du kompilierst für die Laufzeitpfadoptimierung. Wenn Sie feststellen, dass eine Methode sehr oft mit einem bestimmten Parameter aufgerufen wird, können Sie diese Routine mit diesem Parameter als Konstante vorkompilieren, die (im Falle eines Booleschen, der den Fluss steuert) einen gigantischen Arbeitsprogramm ausmachen kann. C kann nicht nah an diese Art von Optimierung zu kommen. Ndash Bill K Okt 9 09 at 17:42 Also, wie machen JITs bei der Neukompilierung von Routinen, um die Vorteile der beobachteten Runpats zu nutzen, und wie viel Unterschied macht das ndash David Thornley Dec 3 09 um 21:50 Hardy ja, die CPU kann Zweig machen Vorhersage unabhängig von der Sprache, aber es kann nicht aus einer ganzen Schleife herausfassen, indem man beobachtet, dass die Schleife keinen Einfluss auf irgendetwas hat. Es wird auch nicht bemerkt, dass mult (0) fest verdrahtet ist, um 0 zurückzukehren und einfach den gesamten Methodenaufruf durch if (param 0) result0 zu ersetzen und den gesamten Funktionsmethodenaufruf zu vermeiden. C könnte dies tun, wenn der Compiler einen umfassenden Überblick über das, was geschah, aber im Allgemeinen hat es nicht genug Info zum Zeitpunkt der Kompilierung. Ndash Bill K Sep 8 10 um 17:26 JIT (Just In Time Compiling) kann unglaublich schnell sein, weil es für die Zielplattform optimiert ist. Dies bedeutet, dass es von jedem Compiler Trick profitieren kann Ihre CPU zu unterstützen, unabhängig davon, was CPU der Entwickler schrieb den Code auf. Das Grundkonzept des JIT funktioniert so (stark vereinfacht): Aufruf einer Methode zum ersten Mal: Dein Programmcode ruft eine Methode auf Foo () Die CLR schaut auf den Typ, der Foo () implementiert und bekommt die damit verbundenen Metadaten Die Metadaten, die CLR weiß, welche Speicheradresse der IL (Zwischenbyte-Code) gespeichert ist. Die CLR ordnet einen Speicherblock zu und ruft den JIT auf. Das JIT kompiliert das IL in nativen Code, platziert es in den zugeteilten Speicher und ändert dann den Funktionszeiger in Foo () s Typ Metadaten, um auf diesen nativen Code zu zeigen. Der native Code ist ran. Aufruf einer Methode zum zweiten Mal: Ihr Programmcode ruft eine Methode auf Foo () Die CLR schaut auf den Typ, der Foo () implementiert und findet den Funktionszeiger in den Metadaten. Der native Code an dieser Speicherposition ist ran. Wie Sie sehen können, das 2. Mal herum, ist es praktisch der gleiche Prozess wie C, außer mit dem Vorteil von Echtzeit-Optimierungen. Das heißt, es gibt noch andere Overhead-Probleme, die eine verwaltete Sprache verlangsamen, aber der JIT hilft viel. Nun, es basiert auf der Idee, dass ein Compiler39s-Optimierer den Regeln folgt und Kodierer don39t. Also, da wird immer der Code sein, den der Optimierer findet, der es einfach perfekt optimieren kann, während ein Mensch entweder durch das Betrachten eines größeren Bildes oder mehr darüber wissen kann, was der Code wirklich tut. Ich füge hinzu, dass dies ein 3-jähriger Kommentar ist, und ich weiß mehr über HotSpot als früher, und ich kann leicht sehen, dynamische Optimierung ist ein sehr schöner Weg, um Code schneller zu bekommen. Ndash billjamesdev Jul 14 11 at 6:03 1. Optimierungen von Hotspot oder einem anderen JIT sind immer noch Compiler-Optimierungen. JIT haben den Vorteil gegenüber einem statischen Compiler, in der Lage sein, einige Ergebnisse (Code häufig aufgerufen) inline zu setzen oder sogar Optimierungen basierend auf dem ausführenden Prozessor zu machen, aber es ist immer noch eine Compiler-Optimierung. 2. Ich denke, Sie sprechen über Algorithmus-Optimierung, nicht quotassembly fine tuningquot. Die manuelle Zusammenstellung der Feinabstimmung durch einen menschlichen Coderquot hat seit mehr als einem Jahrzehnt keine besseren Ergebnisse erzielt als Compiler-Optimierungen. In der Tat, ein menschliches Spiel mit Montage in der Regel schrauben Sie jede Optimierung. Ndash paercebal Jul 14 11 at 16:46 Ok, ich bekomme das I39m mit der falschen Terminologie, quotcompiler optimiziationquot anstatt quotstatic optimizationquot. Ich würde darauf hinweisen, dass, zumindest in der Gaming-Branche, wie vor kurzem für die PS2 waren wir immer noch mit Hand-codierte Montage an Orten zu quotoptimizequot für die spezifischen Chips, die wir wussten, waren auf der Konsole Cross-Compiler für diese neuen Chips nicht sein Doch so anspruchsvoll wie für x86-architekturen. Zurück zu der ursprünglichen Frage oben: Die JIT hat den Vorteil, in der Lage zu sein, vor der Optimierung zu messen, was eine gute Sache ist (TM) ndash billjamesdev Jul 14 11 um 17:53 Sie sollten definieren, besser als ... Nun, ich Wissen Sie, Sie fragten nach Geschwindigkeit, aber es ist nicht alles, was zählt. Haben virtuelle Maschinen mehr Laufzeit Overhead Ja Haben sie mehr Arbeitsspeicher Ja Haben sie höhere Startkosten (Laufzeit-Initialisierung und JIT-Compiler). Ja Benötigen Sie eine riesige Bibliothek, die installiert ist Ja Und so weiter, seine voreingenommen, ja) Mit C und Java bezahlen Sie einen Preis für das, was Sie bekommen (schnellere Codierung, automatische Speicherverwaltung, große Bibliothek und so weiter). Aber du hast nicht viel Platz, um über die Details zu feilschen: nimm das komplette Paket oder nichts. Auch wenn diese Sprachen etwas Code optimieren können, um schneller als kompilierter Code auszuführen, ist der ganze Ansatz (IMHO) ineffizient. Stellen Sie sich vor, jeden Tag 5 Meilen zu Ihrem Arbeitsplatz zu fahren, mit einem LKW Es ist komfortabel, es fühlt sich gut an, Sie sind sicher (extreme knusprige Zone) und nach dem Schritt auf dem Gas für einige Zeit, wird es sogar so schnell wie ein Standard-Auto Warum Dont wir alle haben einen LKW, um zur Arbeit zu fahren) In C bekommst du, was du bezahlst, nicht mehr, nicht weniger. Zitat Bjarne Stroustrup: C ist meine Lieblings-Müll gesammelt Sprache, weil es so wenig Müll Link Text erzeugt Stroustrup hasn39t gesehen einige der Code habe ich. Ndash kyoryu Hallo, ich glaube, er hat eine gute Vorstellung von seinen Nachteilen, er sagte auch: quotC macht es einfach, sich in den Fuß zu schießen C macht es härter, aber wenn du es machst, bläst dein ganzes Bein Offquot) ndash Frunsi Dec 4 09 um 11:24 quotIn C Sie bekommen, was Sie bezahlen, nicht mehr, nicht weniger. Gegenbeispiel: Ich habe eine RB-Baumimplementierung in OCaml und C (GNU GCC) benannt, die eine Ausnahme verwendet hat, um aus der Rekursion heraus zu springen, wenn ein hinzugefügtes Element bereits vorhanden war, um das bestehende Set wiederzuverwenden. OCaml war bis zu 6x schneller als C, weil es nicht für die Überprüfung für Destruktoren bezahlen, da der Stapel abgewickelt wird. Ndash Jon Harrop Sep 5 11 at 23:10 Jon: aber an einem (späteren) Zeitpunkt muss es die Objekte sowieso zerstören (zumindest muss es sein Gedächtnis freigeben). Und auch beachten Sie, dass Ausnahmen für Ausnahmefälle sind, zumindest in C diese Regel sollte respektiert werden. C Ausnahmen können schwer sein, wenn Ausnahmen auftreten, das ist ein Kompromiss. Ndash Frunsi Sep 6 11 at 19:19 Einige gute Antworten hier über die spezifische Frage, die du gefragt hast. Ich gehe gerne zurück und schaue das größere Bild an. Denken Sie daran, dass Ihre Benutzer die Wahrnehmung der Geschwindigkeit der Software, die Sie schreiben, von vielen anderen Faktoren beeinflusst wird, als nur, wie gut das Codegen optimiert. Hier sind einige Beispiele: Manuelle Speicherverwaltung ist schwer zu tun (keine Lecks), und noch schwerer zu tun effeciently (freies Gedächtnis bald nach youre getan mit ihm). Mit einem GC ist im Allgemeinen eher ein Programm zu produzieren, das Speicher gut verwaltet. Are you willing to work very hard, and delay delivering your software, in an attempt to out-do the GC My C is easier to read amp understand than my C. I also have more ways to convince myself that my C code is working correctly. That means I can optimize my algorithms with less risk of introducing bugs (and users dont like software that crashes, even if it does it quickly) I can create my software faster in C than in C. That frees up time to work on performance, and still deliver my software on time. Its easier to write good UI in C than C, so Im more likely to be able to push work to the background while UI stays responsive, or to provide progress or hearbeat UI when the program has to block for a while. This doesnt make anything faster, but it makes users happier about waiting. Everything I said about C is probably true for Java, I just dont have the experience to say for sure. The virtual machine languages are unlikely to outperform compiled languages but they can get close enough that it doesnt matter, for (at least) the following reasons (Im speaking for Java here since Ive never done C). 1 The Java Runtime Environment is usually able to detect pieces of code that are run frequently and perform just-in-time (JIT) compilation of those sections so that, in future, they run at the full compiled speed. 2 Vast portions of the Java libraries are compiled so that, when you call a library function, youre executing compiled code, not interpreted. You can see the code (in C) by downloading the OpenJDK. 3 Unless youre doing massive calculations, much of the time your program is running, its waiting for input from a very slow (relatively speaking) human. 4 Since a lot of the validation of Java bytecode is done at the time of loading the class, the normal overhead of runtime checks is greatly reduced. 5 At the worst case, performance-intensive code can be extracted to a compiled module and called from Java (see JNI) so that it runs at full speed. In summary, the Java bytecode will never outperform native machine language, but there are ways to mitigate this. The big advantage of Java (as I see it) is the HUGE standard library and the cross-platform nature. Re item 2, quot2 Vast portions of the Java libraries are compiled so that, when you call a library function, you39re executing compiled code, not interpretedquot: Do you have a citation for that If it were really as you describe, I39d expect to run into native code from my debugger a lot, but I don39t. ndash cero Sep 28 08 at 22:46 Re: cero Debuggers often utilize less efficient but more expressive paths, and are therefore not a good marker for anything performance related. ndash Guvante Oct 7 08 at 18:35 Orion Adrian. let me invert your post to see how unfounded your remarks are, because a lot can be said about C as well. And telling that JavaC compiler optimize away empty functions does really make you sound like you are not my expert in optimization, because a) why should a real program contain empty functions, except for really bad legacy code, b) that is really not black and bleeding edge optimization. Apart from that phrase, you ranted blatantly about pointers, but dont objects in Java and C basically work like C pointers May they not overlap May they not be null C (and most C implementations) has the restrict keyword, both have value types, C has reference-to-value with non-null guarantee. What do Java and C offer Generally, C and C can be just as fast or faster because the AOT compiler -- a compiler that compiles your code before deployment, once and for all, on your high memory many core build server -- can make optimizations that a C compiled program cannot because it has a ton of time to do so. The compiler can determine if the machine is Intel or AMD Pentium 4, Core Solo, or Core Duo or if supports SSE4, etc, and if your compiler does not support runtime dispatch, you can solve for that yourself by deploying a handful of specialized binaries. A C program is commonly compiled upon running it so that it runs decently well on all machines, but is not optimized as much as it could be for a single configuration (i. e. processor, instruction set, other hardware), and it must spend some time first. Features like loop fission, loop inversion, automatic vectorization, whole program optimization, template expansion, IPO, and many more, are very hard to be solved all and completely in a way that does not annoy the end user. Additionally certain language features allow the compiler in C or C to make assumptions about your code that allows it to optimize certain parts away that just arent safe for the JavaC compiler to do. When you dont have access to the full type id of generics or a guaranteed program flow theres a lot of optimizations that just arent safe. Also C and C do many stack allocations at once with just one register incrementation, which surely is more efficient than Javas and C allocations as for the layer of abstraction between the garbage collector and your code. Now I cant speak for Java on this next point, but I know that C compilers for example will actually remove methods and method calls when it knows the body of the method is empty, it will eliminate common subexpressions, it may try and retry to find optimal register usage, it does not enforce bounds checking, it will autovectorize loops and inner loops and will invert inner to outer, it moves conditionals out of loops, it splits and unsplits loops. It will expand std::vector into native zero overhead arrays as youd do the C way. It will do inter procedural optimmizations. It will construct return values directly at the caller site. It will fold and propagate expressions. It will reorder data into a cache friendly manner. It will do jump threading. It lets you write compile time ray tracers with zero runtime overhead. It will make very expensive graph based optimizations. It will do strength reduction, were it replaces certain codes with syntactically totally unequal but semantically equivalent code (the old xor foo, foo is just the simplest, though outdated optimization of such kind). If you kindly ask it, you may omit IEEE floating point standards and enable even more optimizations like floating point operand re-ordering. After it has massaged and massacred your code, it might repeat the whole process, because often, certain optimizations lay the foundation for even certainer optimizations. It might also just retry with shuffled parameters and see how the other variant scores in its internal ranking. And it will use this kind of logic throughout your code. So as you can see, there are lots of reasons why certain C or C implementations will be faster. Now this all said, many optimizations can be made in C that will blow away anything that you could do with C, especially in the number crunching, realtime and close-to-metal realm, but not exclusively there. You dont even have to touch a single pointer to come a long way. So depending on what youre writing I would go with one or the other. But if youre writing something that isnt hardware dependent (driver, video game, etc), I wouldnt worry about the performance of C (again cant speak about Java). Itll do just fine. ltltltltltltltltltlt Generally, certain generalized arguments might sound cool in specific posts, but dont generally sound certainly credible. Anyways, to make peace: AOT is great, as is JIT . The only correct answer can be: It depends. And the real smart people know that you can use the best of both worlds anyways. In some cases, managed code can actually be faster than native code. For instance, mark-and-sweep garbage collection algorithms allow environments like the JRE or CLR to free large numbers of short-lived (usually) objects in a single pass, where most CC heap objects are freed one-at-a-time. For many practical purposes, allocationdeallocation-intensive algorithms implemented in garbage collected languages can actually be faster than their equivalents using manual heap allocation. A major reason for this is that the garbage collector allows the runtime system to amortize allocation and deallocation operations in a potentially advantageous fashion. That said, Ive written a lot of C and a lot of C, and Ive run a lot of benchmarks. In my experience, C is a lot faster than C, in two ways: (1) if you take some code that youve written in C, port it to C the native code tends to be faster. How much faster Well, it varies a whole lot, but its not uncommon to see a 100 speed improvement. (2) In some cases, garbage collection can massively slow down a managed application. The CLR does a terrible job with large heaps (say, 2GB), and can end up spending a lot of time in GC--even in applications that have few--or even no--objects of intermediate life spans. Of course, in most cases that Ive encounted, managed languages are fast enough, by a long shot, and the maintenance and coding tradeoff for the extra performance of C is simply not a good one. Of course, the question is whether we39re comparing an implementation of a program in managed vs. unmanaged code, or the theoretical top performance of the language. Clearly, unmanaged code can always be at least as fast as managed, as in the worst case you could just write an unmanaged program that did exactly the same thing as the managed code But most performance issues are algorithmic, not micro. Also, you don39t optimize managed and unmanaged code the same way, so quotC in Cquot is usually going to not work well. ndash kyoryu Dec 4 09 at 3:27 In CC you can allocate short lived objects on the stack, and you do when its appropriate. In managed code you cannot . you have no choice. Also, in CC you can allocate lists of objects in contigous areas (new Foo100), in managed code you cannot. So, your comparison is not valid. Well, this power of choices places a burden on the developers, but this way they learn to know the world they live in (memory. ). ndash Frunsi Dec 6 09 at 3:39 Go read about HP Labs Dynamo. an interpreter for PA-8000 that runs on PA-8000, and often runs programs faster than they do natively. Then it wont seem at all surprising Dont think of it as an intermediate step -- running a program involves lots of other steps already, in any language. It often comes down to: programs have hot-spots, so even if youre slower running 95 of the body of code you have to run, you can still be performance-competitive if youre faster at the hot 5 a HLL knows more about your intent than a LLL like CC, and so can generate more optimized code (OCaml has even more, and in practice is often even faster) a JIT compiler has a lot of information that a static compiler doesnt (like, the actual data you happen to have this time) a JIT compiler can do optimizations at run-time that traditional linkers arent really allowed to do (like reordering branches so the common case is flat, or inlining library calls) All in all, CC are pretty lousy languages for performance: theres relatively little information about your data types, no information about your data, and no dynamic runtime to allow much in the way of run-time optimization. My understanding is that CC produces native code to run on a particular machine architecture. Conversely, languages like Java and C run on top of a virtual machine which abstracts away the native architecture. Logically it would seem impossible for Java or C to match the speed of C because of this intermediate step, however Ive been told that the latest compilers (hot spot) can attain this speed or even exceed it. That is illogical. The use of an intermediate representation does not inherently degrade performance. For example, llvm-gcc compiles C and C via LLVM IR (which is a virtual infinite-register machine) to native code and it achieves excellent performance (often beating GCC). Perhaps this is more of a compiler question than a language question, but can anyone explain in plain English how it is possible for one of these virtual machine languages to perform better than a native language Here are some examples: Virtual machines with JIT compilation facilitate run-time code generation (e. g. System. Reflection. Emit on ) so you can compile generated code on-the-fly in languages like C and F but must resort to writing a comparatively-slow interpreter in C or C. For example, to implement regular expressions. Parts of the virtual machine (e. g. the write barrier and allocator) are often written in hand-coded assembler because C and C do not generate fast enough code. If a program stresses these parts of a system then it could conceivably outperform anything that can be written in C or C. Dynamic linking of native code requires conformance to an ABI that can impede performance and obviates whole-program optimization whereas linking is typically deferred on VMs and can benefit from whole-program optimizations (like s reified generics). Id also like to address some issues with paercebals highly-upvoted answer above (because someone keeps deleting my comments on his answer) that presents a counter-productively polarized view: The code processing will be done at compilation time. Hence template metaprogramming only works if the program is available at compile time which is often not the case, e. g. it is impossible to write a competitively performant regular expression library in vanilla C because it is incapable of run-time code generation (an important aspect of metaprogramming). playing with types is done at compile time. the equivalent in Java or C is painful at best to write, and will always be slower and resolved at runtime even when the types are known at compile time. In C, that is only true of reference types and is not true for value types. No matter the JIT optimization, nothing will go has fast as direct pointer access to memory. if you have contiguous data in memory, accessing it through C pointers (i. e. C pointers. Lets give Caesar its due) will goes times faster than in JavaC. People have observed Java beating C on the SOR test from the SciMark2 benchmark precisely because pointers impede aliasing-related optimizations. Also worth noting that does type specialization of generics across dynamically-linked libraries after linking whereas C cannot because templates must be resolved before linking. And obviously the big advantage generics have over templates is comprehensible error messages. C Fundamentals for Borland C Builder 2012-05-14 04:31:36 By Console77 Version: C Fundamentals for Borland C Builder 6.0 Easy for beginners, else none - No reliable internet components - Simple graphics, unless you dare rely on thirds party VCLs - No 64bit support - Buggy - Thirdparty VCLs are also buggy - Not a standard product - Less and less vendors supports DelphiC Builder - Insecure future, a sinking ship Embarcadero and their products are a sinking ship, together with the third party tools. There are always problems, bugs, or simply a connectivity is not supported. You never know if it is You, the third part VCL vendor or Emarcadero creating the problems. We have used an obsene amount of time in error finding, debugging. There is still no support for 64bit in C Builder, and the datasnap is unreliable, new releases are always buggy. Emrabadero has no reliable internet connectivity, but rely on Indy, which is unreliable and very difficult to manage. We now face more and more that we need to add plug-ins to our application, but they are not supporting Delphi C Builder. So, we now have to migrate to the standard, which is Visual Studio 2010. Perhaps for hobby projects DelphiC Builder is ok - but not for commercial applications. 34I use before old version34
No comments:
Post a Comment