Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#127

AW: Anzahl eines Zeichens im String ermitteln

  Alt 15. Jul 2018, 06:55
screenshot-15_07.jpg 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:
 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;
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.
Die "Avg" Variable soll den praktischen Durchschnittswert darstellen wohingegen ['+IntToStr(Round( Min + ((Max-Min)/2) ))+' Avg] den synthetischen Durchschnittswert darstellt.
Oder mache ich es bereits richtig? Mir dröhnt der Kopf. *Hilfe*

So hier sehen nun die Ergebnisse aus:
Zitat:
KodeZwerg's custom Benchmark - DP CountCharInString Edition

Benchmark: Sleep(500)
506229 Nanoseconds wasted. As closer this is to 500000 more accurate Results are given.

Benchmark: Generate Random Data String (500000 chars) Charset: [aA0-zZ9]
5977 Nanoseconds wasted.

0000000523 - Statistic: [ASCII Data] [645 Avg] [575 Min] [715 Max] [found 88 = 8068 times] @ Uwe Raabe CharCount2()
0000000764 - Statistic: [ASCII Data] [738 Avg] [724 Min] [751 Max] [found 88 = 8068 times] @ EgonHugeist EH_CharCount4()
0000000851 - Statistic: [ASCII Data] [667 Avg] [573 Min] [761 Max] [found 88 = 8068 times] @ EgonHugeist CharCount3()
0000000882 - Statistic: [ASCII Data] [602 Avg] [420 Min] [784 Max] [found 88 = 8068 times] @ EgonHugeist EH_CharCount_6()
0000001219 - Statistic: [ASCII Data] [1185 Avg] [1168 Min] [1202 Max] [found 88 = 8068 times] @ Uwe Raabe StringCountChar()
0000001222 - Statistic: [ASCII Data] [1107 Avg] [851 Min] [1363 Max] [found 88 = 8068 times] @ EgonHugeist EH_CharCount_5()
0000001352 - Statistic: [ASCII Data] [1165 Avg] [709 Min] [1620 Max] [found 88 = 8068 times] @ KodeZwerg CountCharInString()
0000001372 - Statistic: [ASCII Data] [1336 Avg] [1319 Min] [1354 Max] [found 88 = 8068 times] @ Uwe Raabe CharCount()
0000001517 - Statistic: [ASCII Data] [1426 Avg] [1161 Min] [1691 Max] [found 88 = 8068 times] @ Miep()
0000001559 - Statistic: [ASCII Data] [1423 Avg] [1168 Min] [1677 Max] [found 88 = 8068 times] @ alzaimar
0000001910 - Statistic: [ASCII Data] [1569 Avg] [1378 Min] [1760 Max] [found 88 = 8068 times] @ Missionar
0000002157 - Statistic: [ASCII Data] [1982 Avg] [1872 Min] [2092 Max] [found 88 = 8068 times] @ marabu
0000002400 - Statistic: [ASCII Data] [2062 Avg] [1889 Min] [2234 Max] [found 88 = 8068 times] @ KodeZwerg CharInStringA()
0000009962 - Statistic: [ASCII Data] [4643 Avg] [856 Min] [8430 Max] [found 88 = 8068 times] @ Neutral General CharCountAsm()
0012230425 - Statistic: [ASCII Data] [13141133 Avg] [12800203 Min] [13482064 Max] [found 88 = 8068 times] @ Ydobon
edit
Ps: Da es noch nicht Threaded kann man noch nicht Canceln !!!
Angehängte Dateien
Dateityp: 7z Benchmark.7z (219,7 KB, 4x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (15. Jul 2018 um 07:51 Uhr)
  Mit Zitat antworten Zitat