![]() |
Warum delphi lahmer als c++?
Alle sagen ja, dass c++ schneller sein soll als delphi, dabei frage ich mich, in welchen fällen das zutrifft.
Also bei welchen Schleifen oder sonstigen Anweisungen ist delphi lahmer? Des weiteren wollte ich wissen, warum dies so ist. Beides wird ja nach asm übersetzt, warum erzeugt der delphi compiler "schlechteren" assembler code? |
Re: Warum delphi lahmer als c++?
Es gab vor einiger Zeit mal ein Test in der c't. Darin war Delphi teilweise schneller als c++.
|
Re: Warum delphi lahmer als c++?
Zitat:
Zitat:
Zitat:
Aber diese Optimierungen sind eigentlich vernachlässigbar wenn die Programmlogik nicht passt. Man kann mit hochoptimierten C++-Code langsameren Code erzeugen als z.B. mit VB (noch kein .NET) wenn der Algorithmus und die Programmlogik nicht passt. In einem Artikel der Zeitschrift c't wurden mal ein Vergleich gemacht: a, Reines Nummer-Crunshing: Dort ist C++ einsame Spitze. Nirgends kann man (sinnlose) Schleifen so gut optimieren wie unter C/C++ b, Objektorientierte Konzepte wie Vererbung, Methoden-Überladung etc: Hier ist das Sprachkonzept das hinter C/C++ steckt nicht sehr optimal so das sowohl Delphi und C# als auch Java hier die Nase vorne haben. |
Re: Warum delphi lahmer als c++?
Bernhard Geyer kann ich da nur zustimmen. Man muss aber auch dazusagen, dass wir uns hier in ganz anderen Dimensionen bei diesen Vergleichen bewegen und der Unterschied zwischen Delphi und Cpp nicht gerade groß ist (wir spüren ihn oft garnicht, falls er überhaupt existieren sollte). Ich arbeite mit beiden Sprachen und bin mit beiden zufrieden, weil beide eine gute Geschwindigkeit haben. Für objektorientierte Programmierungs sollte man C++ aber wirklich nicht benutzen, das ist mit Delphi schon einfacher. Ich habe von meinem Bruder gehört (muss wegen Studium Java machen), dass er Java mitlerweile gut findet, weil es garnicht so lahm ist, wie es immer gesagt wird.
Nachtrag: Die Codeoptimierung von Delphi schafft manchmal Codes, die ein Mensch nicht hinbekommen würde :mrgreen: Es hängt also bestimmt nicht mit den Assemblercodes zusammen. Es ist nichts als ein Konkurrenzkampf, bei dem Cpp den Vorteil hat, dass der Compiler (GNU) kostenlos ist. |
Re: Warum delphi lahmer als c++?
moin moin,
C++ und Object Pascal sind Programmiersprachen. Die Sprachen an sich können nicht schneller sein, da "Quellcodes" erst übersetzt werden müssen, in eine Sprache, die ein Prozessor versteht, um diese Befehle dann auszuführen. So gesehen ist deine Frage falsch formuliert. Und um's kurz zu machen: Weder noch! Man kann deine Frage weder mit ja noch mit nein beantworten. Die Ausführungsgeschwindigkeit des übersetzten Programms hängen von vielen Faktoren ab. 1. Welche Compiler (Übersetzer) verwendet man, um das fertige Programm zu erstellen? Unter C++ gibt es massenweise Compiler, Pascal-Compiler gibt es nur wenige. 2. Wie gut optimieren diese Übersetzer? 3. Auf welchem Prozessor läuft die übersetzte Anwendung letztendlich? 4. Benutzt man vorgeschriebene Programmabläufe, die von anderen entwickelt wurden? Klassen, Komponenten, Funktionen? All das kann eine Ursache dafür sein, das das Programm nicht effizient genug arbeitet. 5. ... Und bei Java ist es nochmal ganz anders, den dort werden Programme erzeugt, die nicht direkt auf die Hardware zugreifen, sondern über eine Schnittstelle, dem Interpreter. PS: Wenn du dich wirklich für die Programmierung interessierst, dann lern am besten beide Sprachen entwickel ein paar Projekte und fäll dann dein Urteil. Gruß Stefan edit: Das waren vielleicht viele Rechtschreibfehler... |
Re: Warum delphi lahmer als c++?
Zitat:
|
Re: Warum delphi lahmer als c++?
Ist dann die Aussage des Wikipedia falsch?
Zitat:
|
Re: Warum delphi lahmer als c++?
Hallo,
Zitat:
Gruß xaromz |
Re: Warum delphi lahmer als c++?
Zitat:
Interpretiren ist halt irgendwo ein fester Begriff und steht für die Art der Übersetzung, die in Skriptsprachen wie PHP, Pearl oder VB Verwendung findet. Also die zeilen-/statement- weise Übersetzung von Code. |
Re: Warum delphi lahmer als c++?
Wenn ich mich nicht irre, dann ist Java Bytecode sowas ähnliches wie Maschinencode, nur für einen "fiktiven" Prozessor, sodass man es leicht portieren kann.
Ob da jetzt der Begriff "interpretieren" angebracht ist oder nicht, ist eigentlich Ansichtssache. |
Re: Warum delphi lahmer als c++?
Und dieser fiktive Prozessor ist die Virtuelle Maschine. Der Bytecode ist objektorientiert und unterscheiset sich doch von den realen Prozessoren. MS nennt das .Net Gegenstück CLR ( Common Langauge Runtime)
|
Re: Warum delphi lahmer als c++?
Hallo,
Zitat:
Gruß xaromz (der auch mal Fußnoten verwendet) [1] So gesehen ist natürlich auch eine CPU nur ein Maschinencode-Interpreter. [2] wobei der Block auch das ganze Programm sein kann. |
Re: Warum delphi lahmer als c++?
Delphi leidet ein bischen darunter das der Codegenerator nicht so weiterentwickelt wurde wie es beim Visual Studio und dem GNU Compiler der Fall ist. Zusaetzlich wurden auch die Basisfunktionen (siehe System und SysUtils) nicht weiterentwickelt. Das ist zum Teil der Grund warum DelphiSpeedUp die IDE so beschleunigen kann.
Insgesamt bedeutet das aber nicht das man mit Delphi nicht Programme schreiben kann die so schnell wie C++ Programme sind. Es ist dafuer sowieso auf beiden Seiten sorgfaeltigste Optimierung noetig und da gibt es kaum einen Unterschied in den Schwierigkeiten. |
Re: Warum delphi lahmer als c++?
Zitat:
![]() |
Re: Warum delphi lahmer als c++?
Wie schon oft wiederholt, zählt in erster Linie das Verfahren, also der Algorithmus.
Ich beschäftige mich gerade mit String-Matching-Algorithmen, und hier scheint es hingegen so zu sein, das C(++) die generischen Schleifen und Vergleiche vielleicht doch besser in Maschinencode abbilden kann. Es ist nämlich so, das sich die offensichtlich besten Algorithmen nicht als Ebensolche in Delphi umsetzen lassen. Hier hat bisher (bei meinen Ansätzen), ein sehr kompakter Algorithmus (QS) die Nase bei weitem vorn. Vermutlich vor Allem deshalb, weil die zentrale Funktion (vergleich von zwei Teilstrings) als 'CompareMem' abgebildet ist. Bei dem Algorithmus, der derzeit die Nase vorn hat (FJS), wird der Vergleich über eine generische C-Schleife abgebildet. Wenn ich diesen FJS in Delphi übersetze, ist er um ein vielfaches langsamer als der QS-Algorithmus. Und ich glaube, es liegt an der Verwendung des CompareMem im QS-Algorithmus. Von der Komplexität ('Big Oh') ist der FJS einfach besser. Nebenbei: Auch Boyer-Moore, Horspool etc. können dem QS (QuickSearch von Daniel Sunday) unter Delphi nicht das Wasser reichen. Ich meine, bei diesen generischen Schleifen und Vergleichen dürften die hier beschriebenen CPU-abhängigen Optimierungsmöglichkeiten in den C-Kompilern greifen. Auf Applikationsebene entscheidet jedoch fast ausschließlich das verwendete Verfahren. Nach meiner Einschätzung ist C für die Implementierung generischer Algorithmen (String-Matching, Hash, Listen, etc.) besser geeignet. Auf OOP-Ebene sollte man imho auf C++ verzichten. Zitat:
Zitat:
|
Re: Warum delphi lahmer als c++?
Zitat:
|
Re: Warum delphi lahmer als c++?
hoho, :)
[ot] Zitat:
Nichts. Aber vielleicht ist die Aussage von Bernhard nicht ganz richtig. ;-) Zitat:
[/ot] |
Re: Warum delphi lahmer als c++?
Hi,
erstmal zu der eigentlichen Frage, man sollte immer die Quellen hinterfragen. Pauschale Aussagen wie X ist immer besser/schneller/schöner als Y sind im Prinzip nie richtig. 99% davon sind Anssichtssache. Gerade was die Geschwindigkeit angeht, so mag es hier durchaus mal stimmen, dass eine Sprache schnelleren Code erzeugt als eine andere. Aber man sollte sich a) darüber im klaren sein, dass eine fempto-Sekunde mehr oder weniger bei gleichem Code kaum ins Gewicht fällt. Kommen genügend solcher f Sek. zusammen, so wird jeder Zugriff auf die Festplatte immer noch deutlich mehr ausmachen, auch wenn das eine Programm schneller ist. Wichtiger ist heute eher, wie leicht du was in der Sprache umsetzen kannst. Ein paar Dinge (insbesondere Benutzereingaben) lassen sich nicht beliebig beschleunigen. Natürlich gibt es gebiete, in denen dürfte die reine Perfomance wichtig sein, in anderen ist es eher die Sicherheit oder Robustheit. Man sollte hier eine Sprache nie nach nur einer Aussage beurteilen. Wenn es rein um die Perfomance geht, dann ist rein imperativer C Code wohl wieder schneller als Objekt Orientierter C++ Code, da einfach schon die Möglichkeit der Indirektion fehlt (dürfte auch für Pascal vs. ObjectPascal/Delphi) gelten. Hinzu kommt auch noch, dass man mit Makros oder den Verzicht auf Funktionen den Overhead erspart, der nun mal mit jedem Funktionsaufruf statt findet. Allerdings dürfte kaum ein sinnvolles Projekt entstehen, wenn man hier einfach mal den ganzen Code in eine einzelne Anweisung schreibt. Da wird die Fehleranfälligkeit und die fehlende Wartbarkeit bei weitem den vermeintlichen Geschwindigkeitsvorteil überwiegen. Ja, dann ist auch objektiv die Geschwindigkeit sehr viel leichter zu messen, als es subjektiv der Fall ist. Nimm einfach zwei Anwendungen, die beiden 1 min lang irgendwas berechnen. Hat nur eine davon eine Fortschrittsanzeige, würde ich sagen, werden viele Leute die als schneller arbeitend empfinden (einfach weil etwas passiert!). Je nachdem wie du dann noch den Fortschritt anzeigst kann das für solche Projekte zu einer gefühlten Steigerung (unabhängig von der Berechnung und Sprache) führen. Natürlich wird sowas in einem DBMS wohl kaum benötigt, aber wie gesagt, man muss schon differenzieren, worin etwas schneller ist oder eben nicht. [OT] Zitat:
Ich denke, dass man bei einem JIT nicht mehr von Interpreation sprechen kann, da hier Optmierungen statt finden. Genau das passiert halt dadurch, dass gleich ganze Codeblöcke eingelesen werden. Ein reiner (einfacher) Interpreter würde einfach dumm Zeile für Zeile in eine fremde Umgebung überführen. Natürlich ist und bleibt Objekt Code und seine Übersetzung/Ausführung eine Sache, die man nicht so einfach als einordnen kann, aber der reine Interpreter kommt wohl so wenig zum Einsatz wie die native Ausführung (die aber auf einer Java-CPU/Architektur ohne weiteres möglich ist). Zudem gibt es auch immer mehr CPUs (nicht alle müssen ja in einem normalen PC stecken!) mit eigenen Java-Co-Prozessoren, die wirklich nativ Java Code ausführen. [/OT] |
Re: Warum delphi lahmer als c++?
Zitat:
|
Re: Warum delphi lahmer als c++?
Nope, heißt durch die Standardisierung nun CIL :zwinker: .
|
Re: Warum delphi lahmer als c++?
Zitat:
|
Re: Warum delphi lahmer als c++?
Zitat:
Von Interpretieren spricht man im Normalfall wenn immer wieder interpretiert wird und nicht nur das erste mal. Pascal war früher auch mal eine entsprechende Sprache (P-Code). |
Re: Warum delphi lahmer als c++?
@Bernhard: Jupp, du hast ja so recht. :zwinker:
Wir beide wissen letztendlich worauf es ankommt und müssen uns keine Märchen erzählen. :wink: PS: Na, ob sich der Thread-Ersteller hier nochmal blicken lässt? :stupid: |
Re: Warum delphi lahmer als c++?
Zitat:
Zitat:
|
Re: Warum delphi lahmer als c++?
Borland Delphi und Borland C++ sind in etwa gleich schnell, da beide Sprachen den gleichen Codegenerator verwenden. Java ist ca. 15 mal langsamer. .Net dürfte auch in diesem Bereich liegen.
BTW: Die meiste Prozessorzeit wird verschwendet durch "dumme" Programmierer, nicht durch schlechte Compiler. |
Re: Warum delphi lahmer als c++?
Zitat:
|
Re: Warum delphi lahmer als c++?
Java versus FreePascal:
![]() Java und C#/.net liegen größtenteils gleichauf: ![]() |
Re: Warum delphi lahmer als c++?
Äpfel und Birnen. Delphi hat einen Single-Pass-Compiler. Die meisten C/C++-Compiler sind Multi-Pass.
Auch wäre die Frage welche Versionen welcher C/C++-Compiler mit welcher Delphi-Version verglichen werden. Zitat:
- Objekte auf dem Stack zu erzeugen - Operatoren zu überladen - Templates zu programmieren - TMP (Template-Meta-Programming) mit Templates zu machen (Verlagerung auf Compile-Time) - Präprozessor-Generatormakros zu schreiben Ich erwarte Beispiele! :wall: Zitat:
Zitat:
|
Re: Warum delphi lahmer als c++?
Zitat:
Es ging mir eigentlich nur darum zu sagen, dass ein objektives "Ist schneller" auch fempto-Sekungen bezeichnen kann, mekrt keiner, ist aber schneller. Nur zählt beim Code nie alleine die Perfomance. Ist der Code voll von Fehlern, wird der in keinem System eingesetzt (zumindest nicht all zu oft). Da gibt es halt noch andere Punkte, warum Code sauber und lesbar sein sollte und ich glaube niemand sollte sein Sprache rein nach der (vermeindlichen) Perfomance aussuchen. Immerhin bleibt nun mal jede Indirektion ein klarer Perfomance-Killer, erlaubt aber ein paar nette Dinge bei der Programmierung, deren Vorteile vielleicht die eine Indirektion mehr oder weniger locker überwiegen. Zitat:
An sich ist es halt nur immer etwas langweilig die These zu lesen, dass Sprache A noch viel perfomanter ist als Sprache B. Wichtiger ist da doch eh, dass Entwickler C in A und B schnelleren Code erstellt als D, weil D einfach keine effizienten Datenstrukturen kennt... |
Re: Warum delphi lahmer als c++?
Zitat:
Nachtrag als Erläuterung: es geht um die tatsächlich auszuführenden Anweisungen. Nicht darum wie groß die Binärdatei ist. Zitat:
Zitat:
|
Re: Warum delphi lahmer als c++?
Zitat:
Nee. Gegenbeispiel: Boyer-Moore Pattern Matching (ca. 30 Zeilen) vs. naives Suchen (3 Zeilen)... Boyer-Moore ist viel viel schneller. |
Re: Warum delphi lahmer als c++?
Zitat:
Achso: "Zeilen" in HLLs zu vergleichen und daraus die Codelänge welche ausgeführt wird abzuleiten ist etwas gewagt ;) Nachtrag: Hah, ich glaube ich weiß woher das Mißverständnis rührt. Vermutlich wegen meiner Erwähnung der Linearisierung, richtig? Das ist natürlich ein Feature des Binärcodes und beeinflußt damit die Größe der Datei. Aber das "mehr" war wirklich auf die Ausführung gemünzt. |
Re: Warum delphi lahmer als c++?
Zitat:
Delphi-Quellcode:
Entschuldigung, sind 4 Zeilen. In C, Fortran, ASM etc. ist der Code nicht wesentlich komplexer.
For i:=1 to length (Haystack)-Length(Needle)+1 do
For j:=1 to Length (Needle) do If Haystack[i+j-1] = Needle[j] Then Found := True; "Naives Suchen" (oder Brute Force) ist eine gängige Bezeichung für dieses Verfahren. Ein Weiteres nennt sich übrigens "Not so naive". Hier z.B. ein Pattern-Matching ("Reverse-Factor") der einem die Kinnlade runterklappen lässt , die Implementierung einer Graph-Klasse ist noch nichtmal dabei)... Aber schnell ist er trotzdem: (Aus "Charras & Lecroq, Exact String Matching Algorithms")
Code:
Ich habe tatsächlich überlesen, das Du Schleifen explizit ausklammerst...
void buildSuffixAutomaton(char *x, int m, Graph aut) {
int i, art, init, last, p, q, r; char c; init = getInitial(aut); art = newVertex(aut); setSuffixLink(aut, init, art); last = init; for (i = 0; i < m; ++i) { c = x[i]; p = last; q = newVertex(aut); setLength(aut, q, getLength(aut, p) + 1); setPosition(aut, q, getPosition(aut, p) + 1); while (p != init && getTarget(aut, p, c) == UNDEFINED) { setTarget(aut, p, c, q); setShift(aut, p, c, getPosition(aut, q) - getPosition(aut, p) - 1); p = getSuffixLink(aut, p); } if (getTarget(aut, p, c) == UNDEFINED) { setTarget(aut, init, c, q); setShift(aut, init, c, getPosition(aut, q) - getPosition(aut, init) - 1); setSuffixLink(aut, q, init); } else if (getLength(aut, p) + 1 == getLength(aut, getTarget(aut, p, c))) setSuffixLink(aut, q, getTarget(aut, p, c)); else { r = newVertex(aut); copyVertex(aut, r, getTarget(aut, p, c)); setLength(aut, r, getLength(aut, p) + 1); setSuffixLink(aut, getTarget(aut, p, c), r); setSuffixLink(aut, q, r); while (p != art && getLength(aut, getTarget(aut, p, c)) >= getLength(aut, r)) { setShift(aut, p, c, getPosition(aut, getTarget(aut, p, c)) - getPosition(aut, p) - 1); setTarget(aut, p, c, r); p = getSuffixLink(aut, p); } } last = q; } setTerminal(aut, last); while (last != init) { last = getSuffixLink(aut, last); setTerminal(aut, last); } } char *reverse(char *x, int m) { char *xR; int i; xR = (char *)malloc((m + 1)*sizeof(char)); for (i = 0; i < m; ++i) xR[i] = x[m - 1 - i]; xR[m] = '\0'; return(xR); } int RF(char *x, int m, char *y, int n) { int i, j, shift, period, init, state; Graph aut; char *xR; /* Preprocessing */ aut = newSuffixAutomaton(2*(m + 2), 2*(m + 2)*ASIZE); xR = reverse(x, m); buildSuffixAutomaton(xR, m, aut); init = getInitial(aut); period = m; /* Searching */ j = 0; while (j <= n - m) { i = m - 1; state = init; shift = m; while (i + j >= 0 && getTarget(aut, state, y[i + j]) != UNDEFINED) { state = getTarget(aut, state, y[i + j]); if (isTerminal(aut, state)) { period = shift; shift = i; } --i; } if (i < 0) { OUTPUT(j); shift = period; } j += shift; } } Egal: Natürlich benötigen 10000 Op-codes i.R. länger als 3 |
Re: Warum delphi lahmer als c++?
Zitat:
Wichtig ist es natürlich zu beachten, dass eben nicht jeder Befehl gleich lange dauert (@Olli ich denke das ist Dir schon klar!). Nur kostet jede Division doch immer noch >> mehr als eine einfache Addition. Aber klar, unter der Einfachen Annahme, dass man eine unterschiedliche Anzahl von gleich teuren Befehlen hat, werden natürlich die geringeren Kosten günstiger sein :wink: |
Re: Warum delphi lahmer als c++?
Unterm Strich bleibt eine (banale Erkenntnis):
Das Verfahren ist wichtig, nicht die Sprache. In der untersten Ebene sind die optimierenden Compiler/Sprachen besser eeignet, also Hochsprachen. Bernhard Geyer hat schon treffend angemerkt, das auch bei hochoptimierten Elops (Pos, StrCopy etc.) eine normale Anwendung nur um ein paar Prozente profitiert. |
Re: Warum delphi lahmer als c++?
Zitat:
Das Beispiel von überladenen Operatoren und Matrizen (Vektor und/oder Skalarprodukt) ist hier ein gutes Beispiel. Der Code ist intuitiv und supergut lesbar, aber die Operatoren selber sind auch zu implementieren. Sie müssen allerdings nicht für den Programmierer sichtbar sein. Ergo kann eine solche simple Zeile HLL-Code gut und gern ein kleines C-Programm in der Komplexität übertreffen ohne mehr Zeilen zu haben. Zitat:
Zitat:
Nee, aber mal ernst, uns ist allen klar warum sowas schneller geht. Und das ist nicht wegen der fehlenden Abbruchbedingung ... Zitat:
Ich muß echt an meinem Ausdruck feilen. Zu lange im Ausland :mrgreen: :zwinker: Gruß aus dem (nicht ![]() |
Re: Warum delphi lahmer als c++?
Zitat:
![]() |
Re: Warum delphi lahmer als c++?
Zitat:
Diese Methode hat mehrere Vorteile: 1. Wenn es sich bei der Variablen um ein Stackobjekt handelt, hast du den Aufwand des ctor-Aufrufs erst ab der Zeile mit der Deklaration&Initialisierung. Bei komplexen Objekten kann das einen Unterschied machen. 2. Variablen haben immer einen Standardwert. 3. Baut man zuvor eine Verzweigung (manche benutzen gern goto *würg*) ein, kann nicht hinter der Verzweigung die Variable benutzt werden (wenn sie nur im nächstnötigen Scope liegt) oder zumindest nicht uninitialisiert benutzt werden. Das sind sozusagen kostenlose Codeverbesserungen die als "Stilmittel" automatisch bestimmte durchaus gängige Fehler vermeiden. Aber keine Angst, ich kenne auch Code der sich partout nicht dran hält und Menschen die noch partout C92 programmieren wollen :mrgreen: War also nicht so ernst gemeint wie du es scheinbar aufgefaßt hast :zwinker: |
Re: Warum delphi lahmer als c++?
Zitat:
Ach, und Code auf Seiten von Universitäten sind meist interessant und selten schnell ('Optimizing is beyond the scope of this article'). Die haben's eben nicht drauf. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz