![]() |
AW: "Quelltextbausteine" ähnlich include-Dateien gegen Codedopplung
Zitat:
|
AW: "Quelltextbausteine" ähnlich include-Dateien gegen Codedopplung
Bei kleinen Arrays (N< ca. 20) versagen i.a. Optimierungsbestrebungen.
|
AW: "Quelltextbausteine" ähnlich include-Dateien gegen Codedopplung
Zitat:
Zitat:
Ich habe gerade einen ersten Test gemacht, der die ganze Sache mit dem zentralen überladen einer IsEqual-Funktion hinfällig macht: Die Auswahl der korrekten überladenen Version erfolgt bevor die generischen Typen bekannt sind und somit gibt es keine überladene Version, die man mit diesen Argumenten aufrufen kann... Also bleibt mir nur, immer und überall diese ganze Funktionalität zu überladen statt eine generische Funktion zu nutzen. Die einzige Alternative scheinen die RTTI zu sein. Also werde ich doch RTTI einbauen und diese mit ein paar meistverwendeten Typen überladen. Das steht bei jeder Methode einzeln an. Bei zeitkritischen Routinen muss ich also dran denken zu überprüfen, dass eine entsprechende überladene Version existiert. |
AW: "Quelltextbausteine" ähnlich include-Dateien gegen Codedopplung
Zitat:
|
AW: "Quelltextbausteine" ähnlich include-Dateien gegen Codedopplung
Vorsicht mit Vorurteilen.
TEqualityComparer<T>.Default liefert dir eine Instant eines TEqualityComparer<T>, welche nur einmal erzeugt werden muss. (Die Kosten dafür an RTTI etc sind also irrelevant) EMBT wird sich Mühe gegeben haben, um die jeweilige Implementierung, die sich TEqualityComparer<T> anhand des T pickt ordentlich zu optimieren. Wenn man aber einen ganz kleinen Test schreibt, der ihn gegen einen einfachen Integer-Vergleich antreten lässt, würde man erwarten, dass der Code gleich viiieel langsamer wird, right? Denkste! Zitat:
Ändere die Integers zu Strings und es sieht noch entspannter aus: Zitat:
(Optimierungen in den Compiler Settings ausschalten, nicht dass er den ganzen Vergleich wegoptmiert :stupid: )
Delphi-Quellcode:
uses
SysUtils, Diagnostics, Generics.Collections, Generics.Defaults; function Test(callback : TProc) : TStopwatch; var stopWatch : TStopwatch; begin stopWatch := TStopwatch.StartNew(); try callback(); finally stopWatch.Stop(); end; exit(stopWatch); end; const sampleSize = 10000000; var call1, call2 : TStopwatch; list1, list2 : TList<Integer>; procedure FillTestData; var i : Integer; begin list1.Capacity := sampleSize; list2.Capacity := sampleSize; for i := 0 to sampleSize do begin list1.Add(Random(i * 10)); list2.Add(Random(i * 100)); end; end; begin list1 := TList<Integer>.Create(); try list2 := TList<Integer>.Create(); try FillTestData(); call1 := Test(procedure var i : Integer; dummy : Boolean; begin for i := 0 to sampleSize do dummy := TEqualityComparer<Integer>.Default.Equals(list1[i], list2[i]); end); call2 := Test(procedure var i : Integer; dummy : Boolean; begin for i := 0 to sampleSize do dummy := list1[i] = list2[i]; end); finally list2.Free(); end; finally list1.Free(); end; WriteLn('call1 took ', Trunc(call1.Elapsed.TotalMilliseconds), ' ms'); WriteLn('call2 took ', Trunc(call2.Elapsed.TotalMilliseconds), ' ms'); end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:50 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