![]() |
RTL Performance D7 vs XE7
Hallo allerseits,
Ich weis aus der Vergangenheit das es nach Delphi XE2 Performanceprobleme mit der RTL gab. Gibt es dort schon gute Benchmarkvergleiche mit XE7? Vielleicht hat sich da ja was getan? Mich interessiert aber nur die Performance im Zusammenhang mit der VCL. Alles was es sonst noch gibt wie Crossplattform bzw. FMX, Firemonkey, Mobil Nextgen Compiler verwende ich nicht und ist deshalb nicht interessant für mich. Wäre nett wenn jemand paar gute Quellenlink für mich hätte. Achja noch eine kleine Frage zum XE7 Mobilpart. Werden dort jetzt die jeweils nativen Controls des OS genutzt, oder immernoch die Akkuzeitfressenden Firemonkey-Pendants? mfg newbe |
AW: RTL Performance D7 vs XE7
Liste der Anhänge anzeigen (Anzahl: 1)
Performance von Delphi XE6:
![]() Grundsätzlich wird die Version mit Vektorgrafik verwendet. Es gibt es aber schon 2 Komponenten, welche man auf nativ umstellen kann; leider bisher nur für iOS ( bei anderen Plattformen wird die Einstellung ignoriert.) |
AW: RTL Performance D7 vs XE7
Was soll man denn da interessantes und alltagstaugliches benchmarken?
Die XE7-Demo ist frei verfügbar, du kannst doch selbst ganz konkret testen, was dich interessiert. Mir würde es jetzt an Fantasie fehlen, was man denn hier konkret testen soll. Und wo es überhaupt angeblich "Probleme" geben kann... |
AW: RTL Performance D7 vs XE7
Zitat:
Den einen interessiert Numbercrunching mit Floats, den nächsten String Handling. Und ein weiterer muckiert sich über fehlende ![]() Im übrigen liegen nicht alle Dinge im Code der RTL begründet, die nun wegen Multiplatform an einigen Stellen nicht mehr Assembler Code nutzt sondern Pure Pascal, sondern auch im Compiler (wie z.B. die RVO) |
AW: RTL Performance D7 vs XE7
Gegenüber D7 mit dem Widestring ist XEx mit dem Unicodestring um Welten schneller.
|
AW: RTL Performance D7 vs XE7
Der UnicodeString ist auch von Delphi verwaltet. Der war sicherlich auch schon unter XE2 schneller als WideString. 8-)
|
AW: RTL Performance D7 vs XE7
WideString ist eine Kapselung von SysAllocStr und Co.
UnicodeString ist, wie der AnsiString, ein LongString, was intern einem aufgemotzem dnamischen Array entspricht. * mir Referenzzählung, während der WideString nur eine Referenz kennt und jedesmal kopiert wird * und über den Delphi-Speichermanager verwaltet Wobei mit Delphi 2006? auch noch der SpeicherManager vom Delphi duch FastMM ersetzt wurde. Herr Hausladen hat sogar ein Pugin, womit der MM der D7-IDE durch FastMM ersetzt wird, womit diese auch gleich mal flotter wird. |
AW: RTL Performance D7 vs XE7
Zitat:
Delphi-Quellcode:
Geschichten schneller liefen, weil der Compiler da kein Zeugs für Unicode Kompatibilität zwischengehauen hat.
string
|
AW: RTL Performance D7 vs XE7
[QUOTE=Stevie;1272266]
Zitat:
|
AW: RTL Performance D7 vs XE7
Zitat:
Natürlich tu ich das. Denn genau das passiert, wenn du deine Software mit
Delphi-Quellcode:
in Delphi 2007 oder eher geschrieben hast, migrierst und dann irgendwelche Performance Tests laufen lässt, die Stringoperationen beinhalten.
string
Dass das Äpfel mit Birnen vergleichen ist, weiß ich, aber manche nicht. Deshalb erwähn ichs nochmal. P.S. FPC is eh viel schneller! /sarcasm off :roll: |
AW: RTL Performance D7 vs XE7
Zitat:
Zitat:
|
AW: RTL Performance D7 vs XE7
[QUOTE=Bernhard Geyer;1272270]
Zitat:
|
AW: RTL Performance D7 vs XE7
Zitat:
nur mal einiges was ich gern wissen täte :) mfg newbe |
AW: RTL Performance D7 vs XE7
Zitat:
Delphi-Quellcode:
gesetzt hat, dann wird bei IndexOf einfach ne lineare Suche gemacht, ansonsten eine binäre. So kann man auch Performance zum Fenster rauswerfen.
Sorted := True
|
AW: RTL Performance D7 vs XE7
Der FastMM kann InPlace-Realocations, also verkleinern/vergrößern, ohne daß der alte Speicherblock verschoben werden muß.
Vorallen bei größeren Speicherblöcken und wenn dahinter genug Platz ist. Das alte FastStringsProjekt wurde teilweise ins Delphi übernommen (irgenwann um/nach 2006). Generics sollte nicht schneller sein, als die nicht-generische Variante, bzw. gleich schnell. Im Prinzip sind dort "nur" die manuellen Casts durch automatische ersetzt, wobei damit der Compiler besser für Typsicherheit sorgen kann. Bei Listen, also vorallem wenn dir die Sortierung egal ist, wären die TDictionary<T>'s ein Überlegung wert, da sie eine optimalere Suchfunktion besitzen, als z.B. die TStringsList. Insgesamt hat man die generischen Listen oftmals um Hashlisten, Binäre suchen und Dergleichen aufgemotzt, was die alten Funktionen nicht immer hatten. |
AW: RTL Performance D7 vs XE7
@stevie
dachte sortet is bei TStringlist standardmäßig auf true? bin jetz leicht verwirrt. mfg |
AW: RTL Performance D7 vs XE7
Zitat:
|
AW: RTL Performance D7 vs XE7
achja stimmt... ich bin auch durch für heute :)
|
AW: RTL Performance D7 vs XE7
Zur Klarstellung: Der FastMM für Delphi 7 stammt nicht von mir und ich baue den auch nicht über DelphiSpeedUp ein. Die BorlndMM.dll muss man schon selbst austauschen.
Zitat:
An die Geschwindigkeit einer TList kommt TList<T> bei weitem nicht ran. Beispiel Worst-Case Szenario: 100.000 Einträge, letztes Element muss 10.000 Mal gefunden werden
Code:
TList: 0.299 Sekunden
TList<T>: 1.870 Sekunden Zitat:
Code:
Und das auf meinem nagel neuen PC. Im Büro habe ich eine um weiten langsamere Kiste stehen.
StringList Find: 1.993 Sekunden
Dictionary TryGetValue : 3.983 Sekunden Die Zeit, die beim Laden der Daten drauf ging hat sich durch die Umstellung von TDictionary auf eine CompareStr-StringList halbiert. Es dauert zwar immer noch zu lange, aber das ist schon mal ein Anfang. Gut, die Daten sind für das TDictionary etwas ungünstig, aber zum Glück gibt es noch die gute alte TStringList. Die Lösung wird wohl sein, die GUIDs in 2 Int64 zu konvertieren und dann eine "handgeschriebene" Dictionary Klasse zu schreiben, vor allem mit dem Hintergrund, dass die 10.000 Daten nur die Spieldaten sind (ob uns da nicht die GUIDs ausgehen :-) ) |
AW: RTL Performance D7 vs XE7
Ach mist, der blöde Vergleicher.
Die sind nicht so gut und optimieren das z.B. für Strings/Integer? Jetzt muss ich nochmal nachsehn, ob die for-in-schleife bei Arrays und Strings auch über die Enumeratoren läuft. |
AW: RTL Performance D7 vs XE7
Zitat:
|
AW: RTL Performance D7 vs XE7
Zitat:
|
AW: RTL Performance D7 vs XE7
Zitat:
|
AW: RTL Performance D7 vs XE7
@jbg
vielen Dank für deine interessanten Ausführungen. Deine beschriebenen Caseszenarien liegen glaub ich eher bei den meinen. Hinzu kommt noch das ich Lazy Loading nicht besonders mag und vermeide wenn ich die Möglichkeit habe. Es komm also häufiger Vor das ich beim initialisieren des Programms Objectlisten mit mehreren Tausend Objekten pro Typ vollballere. Und da kommt es dann doch schon auf solche "Kleinigkeiten" an. auch meine ich damals mal gehört zu haben das der Borland MM beim erweitern von Listen schneller sein sollte, weil er imm gleich 4 einträge allociert der FastMM immer einen einzigen. Trifft dies noch immer so zu? mfg newbe |
AW: RTL Performance D7 vs XE7
Zitat:
|
AW: RTL Performance D7 vs XE7
Zitat:
Zitat:
Und zum TList<TObject>. Wer überschreibt in Delphi denn TObject.Equals? Das führt nur zu seltsamen Effekten, da das es zu spät kam und jeder davon aus geht, dass ein List<TObject>.IndexOf(MyObject) den Index von MyObject liefert und nicht von einem Objekt, dass zufälligerweise die selben Daten hat. |
AW: RTL Performance D7 vs XE7
Zitat:
Wenn du das optimieren willst, dann musst du dir die IndexOf Methode überschreiben und dort mir einem case über den TypeKind die spezifischen Vergleiche laufen lassen (so werd ich diese Optimierung wohl auch in Spring4D einbauen, von daher an dieser Stelle danke, dass du mich auf dieses potenzielle Performanceproblem aufmerksam gemacht hast) Im Übrigen benutzen wir Equals overrides bei Datenklassen durchaus (meist läuft es auf ein Id Vergleich hinaus). |
AW: RTL Performance D7 vs XE7
@jbg
Der FastMM ist jetzt doch drinne in XE7 oder? @stevie Mir ginge es beim verwenden von generics um das weniger Code schreiben / mehr Lesbarkeit, jedoch bin ich nicht gewillt dafür derartige Performanceeinbußen hinzunehmen. Den Zugriff über irgendwelche Enumeratoren find ich auch schlecht gelöst. Wenn dann bitte so wie in C# also in der Art foreach var item in items item.machirgendwas; oder for (int i = 0; i < items.count();i++) bla = items[i]; bla.mache irgendwas; mfg newbe |
AW: RTL Performance D7 vs XE7
Zitat:
![]() Richtig, mit nem Enumerator. Worin unterscheidet sich das von:
Delphi-Quellcode:
Außer, dass eine for in Schleife in Delphi bei einem Array (im Gegensatz zu C#, wo auch ein array IEnumerable implementiert) nicht über einen expliziten Enumerator läuft sondern vom Compiler direkt übersetzt wird.
for item in items do
item.machirgendwas; |
AW: RTL Performance D7 vs XE7
@stevie
naja ich kanns nicht so schreiben??? Wenn ich deinen Post vorhin richtig verstanden habe muss ich auf das Item über irgendwelche comperator Interfaces drauf zugreifen? dat hier meinte ich bei IndexOf nicht "if FList[Index] = Value then" schreiben kann, sondern einen Comparer (Interface) bemühen muss "if Comparer.Equals(FList[Index], Value)", was ein indirekter Funktionsausruf ist, der dem Compiler auch noch die Möglichkeit nimmt, Daten in CPU Register zu bunkern, vor allem bei Win32. der Unterschied fällt dir auf? gerade geschachtelte Liste und Array Acessoren finde ich hässlich. mfg newbe |
AW: RTL Performance D7 vs XE7
Ich würde bezüglich der allgemeinen Performanceüberlegungen noch gerne anmerken, das weder eine Listenimplementierung, noch die Frage, ob generisch oder nicht, noch die Frage, wie oft man eine Liste durchläuft, bezüglich der Performance entscheidend ist, sondern einzig und alleine bzw. vorrangig die Wahl der richtigen Datenstruktur bzw. des richtigen Algorithmus.
Es gibt kaum Anwendungen, die performancetechnisch ein Problem darstellen, wenn man die richtigen Datenstrukturen wählt). Ausnahmen sind hier z.B. Numbercruncher, wie Mandelbrot z.B. oder ähnliches. Natürlich lassen wir die Palette der Programme mal außen, vor, die eh nur Däumchen drehen, weil sie auf eine überlastete Platte oder das dämlich lahme "Breitbandnetz" warten... In einer Liste suchen gehört mit Sicherheit nicht dazu. Wenn ich hier ein Performanceproblem sehe, dann nehme ich etwas anderes: Trivial eine sortierte Liste und suche nicht linear, sondern binär. Besser, eine Dictionary, die sucht noch nicht einmal mehr binär, sondern weiß quasi, wo was zu finden ist. Ich will jetzt nicht auf dem guten Beispiel mit der Suche in Listen herumreiten oder die Vorschläge madig machen (die ja für alle nachvollziehbar wirklich etwas bringen), sondern eher den Blick darauf lenken, das man, bevor man sich eine neue CPU kauft, vielleicht das Geld doch eher in die Lektüre von guten Büchern über Algorithmik- und Datenstrukturen investiert. Das ist mit Sicherheit nachhaltiger. Oder darin, wie man eine Datenbank richtig aufsetzt, die Indexe richtig setzt und Abfragen performant formuliert. Ich habe hier Kandidaten, die ihren SQL-Server mit 128 GB RAM ausstatten und sich dann freuen, das ihre Query doch tatsächlich nur noch 10 Sekunden dauert, obwohl das mit 4GB und dem Einrichten eines passenden Index auch in 0.1 Sekunden ginge. |
AW: RTL Performance D7 vs XE7
Zitat:
Das Argument, das hätte man auch anders lösen können, mit operator constraints oder handoptimierten IndexOf und sonstigen Methoden, lasse ich allerdings zu. Um 2 Integer oder strings zu vergleichen muss ich nicht zwangsläufig nen extra Gerät fragen, dafür gibts das ja schließlich schon zig Jahre in der Sprache selbst. Auf der konsumierenden Seite der generischen Liste, die ja typisiert ist, hat man aber Zugriff auf alles, was der jeweilige Typ kann. Aber was das nun mit einer for-in/foreach Schleife und Enumeratoren zu tun hat, versteh ich grad nicht. Eventuell fehlt dir aber nur einfach der Überblick über Generics. Aber dieses ganze Performanceverlust Gelaber ist sowieso mal wieder typische Delphianerkrankheit, wenn ich in einer Liste von 100000 Elementen 10000mal das letzte Element suche und das mit ner linearen Suche mache, dann hab ich entweder Alzheimer oder heiße ![]() Zitat:
Dennoch bei der ganzen Diskussion ist es trotzdem wichtig, dass die zugrundeliegenden Datenstrukturen optimiert sind, und da ist an der einen oder anderen Stelle sowohl in der RTL als auch im Compiler noch Verbesserungspotenzial :) |
AW: RTL Performance D7 vs XE7
Zitat:
|
AW: RTL Performance D7 vs XE7
Zitat:
mfg newbe |
AW: RTL Performance D7 vs XE7
Zitat:
Und wenns um das Auflösen von Assoziationen geht, dann wird man nich xmal dieselben linearen Lookups machen sondern sie über die ID oder sonstwas hashen. |
AW: RTL Performance D7 vs XE7
hin oder her ich bin trotzdem der meinung das der neue Code nicht langsamer sein sollte als der alte, schon gar nicht wie in dem bsp. von jbg.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz