![]() |
AW: Anzahl eines Zeichens im String ermitteln
Hier schau mal selbst, das ist mit nur 50000 Zeichen/Bytes, achte auf den Ydobon Zeitwert. Katastrophal bei mir.
Diese Ergebnisse sind nicht unter optimalen Voraussetzungen entstanden da alle Kerne mit was anderem ausgelastet sind. Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Delphi 2009 war ja die erste Version mit Unicode. Vermutlich war dort die Umsetzung von StringReplace schlicht noch nicht so gut.
|
AW: Anzahl eines Zeichens im String ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Anhang 49520So in etwa würde neue GUI aussehen.
Wem noch mehr sinnvolle Optionen einfallen, bitte melden. Edit Ps: Ein Cancel Button ist nun vorhanden :) |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Delphi-Quellcode:
habe ich momentan drinnen.
Windows, SysUtils;
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Wollt ihr den String nicht auch noch aufteilen und Multithreaded mit SSE/MMX/... oder besser noch mit CUDA/OpenCL/... beackern?
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
PS: Wer viel misst misst Mist. Gerade beim Selbstbau von Assemblerzeugs sollte man auch beachten, dass CPUs sich unterschiedlich verhalten. Einige halbwegs Aktuelle planen z.B. schonmal vor und werden dann ausgebremst, wenn der Code sich anders/unvorhersehbar/abwechselnd verhält. Ich hatte mal eine Zählschleife gebaut und bremste meine CPU so aus, dass die For-In-Schleife von Delphi doppelt so schnell lief. :stupid: |
AW: Anzahl eines Zeichens im String ermitteln
Liste der Anhänge anzeigen (Anzahl: 2)
Anhang 49521 So sieht mein letzter Entwurf aus.
Vorkompiliert plus Source im Anhang. Es sind noch nicht alle Varianten enthalten, aber bitte testet mal ob das einem Benchmark gerecht wird. Abgesehen von noch fehlender Methoden brauche ich auch Hilfe bei etwas was mir gerade den Kopf verdreht.
Delphi-Quellcode:
So schaut nun ein kompletter Bench-Block aus, Hilfe brauche ich bei der Berechnung der Variable "Avg". Irgendwie mache ich da etwas falsch und komme gerade nicht auf die korrekte Lösung.
if ((Tests.ItemIndex = 0) or (Tests.ItemIndex = 1)) then
begin for Loops := 0 to Times.Value do begin QueryPerformanceCounter(Int64((@lpPerformanceCount1)^)); i := CharInString.miep(Data, Ch); QueryPerformanceCounter(Int64((@lpPerformanceCount2)^)); QueryPerformanceFrequency(Int64((@Frequency)^)); Curr := (1000000 * (lpPerformanceCount2.QuadPart - lpPerformanceCount1.QuadPart) / Frequency.QuadPart); if Loops = 0 then begin Last := Curr; Min := Curr; Max := Curr; Avg := Curr; end; if Curr < Min then Min := Curr; if Curr > Max then Max := Curr; if Curr < Last then Avg := (((Curr - Last) / 2) - Avg); if Curr > Last then Avg := (((Curr - Last) / 2) + Avg); Last := Curr; if fCancel = True then Break; end; Avg := Abs(Avg); if b = False then lstResults.Items.Add(format('%.10d',[Round(Avg)])+ ' - Statistic: [ASCII Data] ['+IntToStr(Round( Min + ((Max-Min)/2) ))+' Avg] ['+IntToStr(Round(Min))+' Min] ['+IntToStr(Round(Max))+' Max] [found ' + IntToStr(Ord(Ch)) + ' = '+IntToStr(i)+' times] @ Miep()'); if b = True then lstResults.Items.Add(format('%.10d',[Round(Avg)])+ ' - Statistic: [Binary Data] ['+IntToStr(Round( Min + ((Max-Min)/2) ))+' Avg] ['+IntToStr(Round(Min))+' Min] ['+IntToStr(Round(Max))+' Max] [found ' + IntToStr(Ord(Ch)) + ' = '+IntToStr(i)+' times] @ Miep()'); end; if fCancel = True then goto cancel; Die "Avg" Variable soll den praktischen Durchschnittswert darstellen wohingegen
Delphi-Quellcode:
den synthetischen Durchschnittswert darstellt.
['+IntToStr(Round( Min + ((Max-Min)/2) ))+' Avg]
Oder mache ich es bereits richtig? Mir dröhnt der Kopf. *Hilfe* So hier sehen nun die Ergebnisse aus: Zitat:
Ps: Da es noch nicht Threaded kann man noch nicht Canceln !!! |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Delphi-Quellcode:
einfach durch ein
{$IFDEF CPUX86}
Delphi-Quellcode:
(Das "N" nicht vergessen)
{$IFNDEF CPUX64}
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Aktuell schaut deine Messung so aus:
Delphi-Quellcode:
Die Auflösung von QueryPerformanceCounter liegt zwar unter 1 Mikrosekunde, aber deine Messungen liegen zum Teil deutlich unter diesem Wert. Das bedeutet, daß die gemessene Laufzeit im Bereich oder sogar unter der Messgenauigkeit liegt, was einen relativ hohen Messfehler, schlimmstenfalls sogar vollkommen unbrauchbare Ergebnisse erwarten lässt.
QueryPerformanceCounter(Int64((@lpPerformanceCount1)^));
i := CharInString.miep(Data, Ch); QueryPerformanceCounter(Int64((@lpPerformanceCount2)^)); Diesen Messfehler kannst du sehr leicht reduzieren, wenn du die Messung über eine deutlich größere Anzahl der Aufrufe machst und dann durch diese Anzahl teilst. Die gemessene Zeit sollte also mindestens 2-3 Größenordnungen über der Messgenauigkeit liegen (das wären hier 0.01 - 0.1 ms). Aktuell versuchst du die mehrfachen Einzelmessungen zu mitteln, was dir aber nur den Mittelwert der einzelnen Fehler liefert, diesen aber nicht zwingend verkleinert (z.B. wenn er immer positiv ist). In meinem Benchmark hatte ich das schon so implementiert. Nach dem Start der Stopwatch wird die zu messende Funktion 10000x aufgerufen und dann die Gesamtzeit gemessen. Da hier nur die Rangfolge relevant ist, spare ich mir das Runterrechnen auf die mittlere Laufzeit eines einzelnen Aufrufs. Durch diese Maßnahme haben wir den obigen Messfehler auf 1/10000 verkleinert, womit er vernachlässigbar wird. Nun kann man argumentieren, daß die Messung über die Schleife ja auch einen gewissen Overhead verursacht. Zu diesem Zweck mache ich einen Kalibrierungslauf mit der Fake-Funktion, die in Relation zu den später zu messenden Funktionen vernachlässigbar kurz ist. Die bisherigen Läufe ergaben alle eine vernachlässigbare Laufzeit der Timing-Schleife. Gegebenenfalls kann man den hier ermittelten Wert dann auch von den späteren Messergebnissen abziehen. Bei den 10000 Aufrufen liegt der Fehler deutlich unter 1/1000. Übrigens: Wenn deine Delphi-Version noch keine TStopwatch kennt, es gibt eine offizielle und frei verfügbare Vorgängerversion von Allen Bauer: ![]() |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Ansonsten::thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 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