@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.
In einer generischen Liste intern kann bei einem IndexOf of nunmal kein = benutzt werden, weil der Typ T alles sein kann, auch Zeugs, wofür der Gleich Operator nicht definiert ist (z.b. Records). Dafür gibt es die comparer, die in der
unit Generics.Defaults versteckt sind und die für alle möglichen Datentypen die Vergleiche bereitstellen. Das ist natürlich overhead, erst eine Interface Methode aufzurufen, als direkt einen Vergleich inline zu machen.
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
Schlemiel.
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.
Haha, der war gut. Hab ich auch schon erlebt
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