| 
| Autor | Beitrag |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: Mi 26.11.08 19:30 
 
Ich optimiere meine PHP-Version nachher noch durch eine Portierung nach Delphi ... hab ne Idee, wie ich die 1,26ms locker schlagen können müsste  _________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
 |  |  |  
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mi 26.11.08 21:05 
 
So, hab meine Version gerade auf dem 6000er getestet, dort braucht die inkl. Aktualisierung 0,8ms. |  |  |  
| Yogu 
          Beiträge: 2598
 Erhaltene Danke: 156
 
 Ubuntu 13.04, Win 7
 C# (VS 2013)
 
 | 
Verfasst: Mi 26.11.08 21:15 
 
Ha! 0,36 Millisekunden !    (2,59GHz x2)
 Mein Algorithmus:
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
 
 | const          CharCount = 6;
 Chars: array[0..CharCount-1] of Char = ('a', 'd', 'f', 'g', 'v', 'x');
 UpperChars: array[0..CharCount-1] of Char = ('A', 'D', 'F', 'G', 'V', 'X');
 
 function TMainForm.Decrypt(const S: String): String;
 var i, j, k, DecryptedPos, Len: Integer; C, C1, C2: Char; Num: Byte; Found: Boolean;
 begin
 SetLength(Result, Length(S));
 DecryptedPos := 1;
 i := 1;
 Len := Length(S);
 while i <= Len do
 begin
 C1 := S[i];
 C2 := S[i+1];
 
 Found := False;
 for j := 0 to CharCount-1 do
 begin
 if (C1 = Chars[j]) or (C1 = UpperChars[j]) then
 begin
 for k := 0 to CharCount-1 do
 begin
 if (C2 = Chars[k]) or (C2 = UpperChars[k]) then
 begin
 Num := j*CharCount + k;
 
 if Num < 26 then
 begin
 if C2 in ['a', 'd', 'f', 'g', 'v', 'x'] then
 C := Chr(97+Num)
 else
 C := Chr(65+Num);
 end
 else
 C := Chr(22+Num);
 
 Result[DecryptedPos] := C;
 inc(DecryptedPos);
 inc(i, 2);
 Found := True;
 Break;
 end;
 end;
 end;
 if Found then Break;
 end;
 
 if not Found then
 begin
 Result[DecryptedPos] := S[i];
 inc(DecryptedPos);
 inc(i);
 end;
 end;
 
 SetLength(Result, DecryptedPos-1);
 end;
 |  Wer den knackt, ist Kokusnussknacker    (*freu* *freu* *freu*)
Edit:  Keine Angst, ich hab mehr als 2,59MHz.   
 Zuletzt bearbeitet von Yogu am Do 27.11.08 18:19, insgesamt 1-mal bearbeitet
 |  |  |  
| Wolle92 
          Beiträge: 1296
 
 Windows Vista Home Premium
 Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
 
 | 
Verfasst: Mi 26.11.08 21:20 
 
Yogu, upp mal das Programm mit ms-Anzeige... Ich wette, meiner ist schneller  _________________ 1405006117752879898543142606244511569936384000000000.
 |  |  |  
| Yogu 
          Beiträge: 2598
 Erhaltene Danke: 156
 
 Ubuntu 13.04, Win 7
 C# (VS 2013)
 
 | 
Verfasst: Mi 26.11.08 21:26 
 
Einloggen, um Attachments anzusehen!
 |  |  |  
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mi 26.11.08 21:47 
 
Ja, bei diesen Algorithmen werde ich nicht mithalten können, weil meiner eben ein reiner Tabellenersetzer ist. Dafür kann ich mit meinem auch andere Ersetzungsalgorithmen knacken.
 Aber ich werde noch eine optimierte Version für diesen speziellen Fall basteln, wenn ich die Zeit finde.
 |  |  |  
| der organist 
          Beiträge: 467
 Erhaltene Danke: 17
 
 WIN 7
 NQC, Basic, Delphi 2010
 
 | 
Verfasst: Mi 26.11.08 22:11 
 
Sagt mir mal einer, wie ich die ms messen kann? Ohne Timer auf Intervall 1 und dann hochzählen? Dann probier ich das auch noch mal... _________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
 |  |  |  
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mi 26.11.08 22:14 
 
Das wäre extrem ungenau.    Schau dir mal meinen Quelltext zum Beispiel an, oder diesen Link:
www.delphipraxis.net...st271529.html#271529 |  |  |  
| Kha 
          Beiträge: 3803
 Erhaltene Danke: 176
 
 Arch Linux
 Python, C, C++ (vim)
 
 | 
Verfasst: Mi 26.11.08 22:37 
 
	  |  Yogu hat folgendes geschrieben  : |  	  | Mein Algorithmus: | 
 Was hast du denn mit der inneren Schleife vor?
 Hab mir mal die Freiheit genommen, deinen Code etwas anzupassen:
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 
 | function Index(C: Char): Integer; inline;const Delta = Integer('a') - Integer('A');
 begin
 case C of
 'A': Result := 0;
 'D': Result := 1;
 'F': Result := 2;
 'G': Result := 3;
 'V': Result := 4;
 'X': Result := 5;
 'a': Result := Delta + 0;
 'd': Result := Delta + 1;
 'f': Result := Delta + 2;
 'g': Result := Delta + 3;
 'v': Result := Delta + 4;
 'x': Result := Delta + 5;
 else
 Result := -1;
 end;
 end;
 
 function Khacrypt(const S: String): String;
 var i, j, Len, Num, Num2: Integer; C1, C2: Char;
 begin
 SetLength(Result, Length(S));
 i := 1;
 j := 1;
 Len := Length(S);
 while i <= Len do
 begin
 C1 := S[i];
 Num := Index(C1);
 if (Num >= 0) and (Num < 6) then
 begin
 C2 := S[i + 1];
 Num2 := Index(C2);
 if Num2 >= 0 then
 begin
 Num := 6 * Num + Num2 + Integer('A');
 if Num <= Integer('z') then
 Result[j] := Chr(Num)
 else
 Result[j] := Chr(Integer('0') + Num - Integer('z') - 1);
 Inc(i, 2);
 Inc(j);
 continue;
 end;
 end;
 Result[j] := C1;
 Inc(i);
 Inc(j);
 end;
 SetLength(Result, j);
 end;
 |  		                       Quelltext 
 									| 1:2:
 3:
 
 | Benchmark, 100000 IterationenYogu: 343 ms
 Meins: 140 ms
 |  	  |  Yogu hat folgendes geschrieben  : |  	  | 2,59Mhz | 
 Daran wird's liegen    ._________________ >λ=
 |  |  |  
| der organist 
          Beiträge: 467
 Erhaltene Danke: 17
 
 WIN 7
 NQC, Basic, Delphi 2010
 
 | 
Verfasst: Do 27.11.08 15:18 
 
Soll heissen:
 -Ich benutze die Funktion drei mal, mit unterschiedlichen Übergabewerten und mache zwischen (Start) und (Stop) meinen Test.
 -Die Millisekunden werden danach über (Stop - Start) * 1000 / Frequenzy)  ausgegeben _________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
 |  |  |  
| Heiko 
          Beiträge: 3169
 Erhaltene Danke: 11
 
 
 
 
 | 
Verfasst: Do 27.11.08 17:15 
 
	  |  der organist hat folgendes geschrieben  : |  	  | -Die Millisekunden werden danach über (Stop - Start) * 1000 / Frequenzy) ausgegeben | 
 Hälst du die Variante für zuverlässig? Mein NB taktet selten über paar Sekunden gleich   . |  |  |  
| Yogu 
          Beiträge: 2598
 Erhaltene Danke: 156
 
 Ubuntu 13.04, Win 7
 C# (VS 2013)
 
 | 
Verfasst: Do 27.11.08 18:20 
 
	  |  Heiko hat folgendes geschrieben  : |  	  | Mein NB taktet selten über paar Sekunden gleich  . | 
 Das sollte er aber! Wäre sehr  seltsam, wenn nicht! |  |  |  
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Do 27.11.08 18:24 
 |  |  |  
| Kha 
          Beiträge: 3803
 Erhaltene Danke: 176
 
 Arch Linux
 Python, C, C++ (vim)
 
 | 
Verfasst: Do 27.11.08 22:14 
 
	  |  jaenicke hat folgendes geschrieben  : |  	  | Es gibt keine genauere Zeitmessmethode unter Windows. GetTickCount ist relativ ungenau, [...] | 
 Genauso ungenau ist es, nur einen einzelnen Wert zu messen, da springt dir jeder Statistiker an die Decke    . Und bei zehntausenden von Wiederholungen dürfte dann auch GetTickCount exakt genug sein    ._________________ >λ=
 |  |  |  
| Tilman 
          Beiträge: 1405
 Erhaltene Danke: 51
 
 Win 7, Android
 Turbo Delphi, Eclipse
 
 | 
Verfasst: Fr 28.11.08 00:15 
 
Man könnte auch versuchen zu messen wieviele Buchstaben(-Paare) eure Algos in 30 Sekunden kodieren / dekodieren. Das wäre vielleicht ein Wert den man besser vergleichen kann. 
 Wobei ich persönlich den 100. Wettbewerb "wer schreibt den schnellsten Algo" nicht mehr sooo prickelnd finde    ich hab als 2. hier enkodiert reingeschrieben und mich nen Keks darüber gefreut, das genügt mir ^^
 P.S. an die Schöpfer des Rätsels:
 interessant finde ich in dem Zusammenhang das Wort "Adventsgewinnspiel". Denn es scheint die Antwort auf die Frage zu sein "Geben Sie ein Wort an, welches möglichst viele Informationen zum adfgvx-Kode liefert". Zusammen mit der Zahl 2008 kommen doch tatsächlich alle Pre- und Postfixe darin vor, die Häufigsten Buchstaben E,N,I,S,A und mit 00, NN sowie weiteren Buchstaben ließ sich auch leicht erschließen dass es ein Monoalphabetisches Verfahren ist. 
 Natürlich weiß ich dass das Wort in jedem Jahr das selbe ist - aber es war hier wirklich perfekt._________________Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. 
(Koreanisches Sprichwort) |  |  |  
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 28.11.08 01:37 
 
So, ich habe es jetzt auf dem 3700er auf 0,069ms gedrückt, 6000er 0,044ms . Ein Klick auf Start im Anhang macht 1000 Durchläufe. 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 
 | constCharList1: array[65..122] of Byte = (0, 0, 0, 1, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0);
 CharList2: array[65..122] of Byte = (6, 0, 0, 7, 0, 8, 9, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0);
 CharTable: array[0..5] of array[0..11] of Char =
 (('a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F'),
 ('g', 'h', 'i', 'j', 'k', 'l', 'G', 'H', 'I', 'J', 'K', 'L'),
 ('m', 'n', 'o', 'p', 'q', 'r', 'M', 'N', 'O', 'P', 'Q', 'R'),
 ('s', 't', 'u', 'v', 'w', 'x', 'S', 'T', 'U', 'V', 'W', 'X'),
 ('y', 'z', ' ', ' ', ' ', ' ', 'Y', 'Z', '0', '1', '2', '3'),
 (' ', ' ', ' ', ' ', ' ', ' ', '4', '5', '6', '7', '8', '9'));
 
 var
 CurIn, CurOut, Len: Integer;
 Chars: array of Char;
 tmp: string;
 StartTime, EndTime, Freq: Int64;
 i: Integer;
 begin
 QueryPerformanceFrequency(Freq);
 QueryPerformanceCounter(StartTime);
 
 for i := 1 to 1000 do
 begin
 tmp := memInput.Text;
 Len := Length(tmp);
 SetLength(Chars, Len);
 CopyMemory(@Chars[0], @tmp[1], Len);
 CurIn := 0;
 CurOut := 0;
 while CurIn < Len do
 begin
 if not (Chars[CurIn] in ['a'..'z', 'A'..'Z']) then
 begin
 Chars[CurOut] := Chars[CurIn];
 Inc(CurIn);
 end
 else
 begin
 Chars[CurOut] := CharTable[CharList1[Ord(Chars[CurIn])]]
 [CharList2[Ord(Chars[CurIn + 1])]];
 Inc(CurIn, 2);
 end;
 Inc(CurOut);
 end;
 SetLength(Chars, CurOut);
 SetLength(tmp, CurOut);
 CopyMemory(@tmp[1], @Chars[0], CurOut);
 memOutput.Text := tmp;
 end;
 
 QueryPerformanceCounter(EndTime);
 ShowMessage(FormatFloat('0.000', (EndTime - StartTime) / Freq) + ' ms');
 end;
 |  // EDIT:
 Und mit ein wenig Pointerspielerei liege ich jetzt bei 0,032ms . 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 
 | constCharList1: array[65..122] of Byte = (0, 0, 0, 1, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0);
 CharList2: array[65..122] of Byte = (6, 0, 0, 7, 0, 8, 9, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 10, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 3,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0);
 CharTable: array[0..5] of array[0..11] of Char =
 (('a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F'),
 ('g', 'h', 'i', 'j', 'k', 'l', 'G', 'H', 'I', 'J', 'K', 'L'),
 ('m', 'n', 'o', 'p', 'q', 'r', 'M', 'N', 'O', 'P', 'Q', 'R'),
 ('s', 't', 'u', 'v', 'w', 'x', 'S', 'T', 'U', 'V', 'W', 'X'),
 ('y', 'z', ' ', ' ', ' ', ' ', 'Y', 'Z', '0', '1', '2', '3'),
 (' ', ' ', ' ', ' ', ' ', ' ', '4', '5', '6', '7', '8', '9'));
 
 var
 EndAddr: Integer;
 CurIn, CurOut: ^Char;
 tmp: string;
 StartTime, EndTime, Freq: Int64;
 i: Integer;
 begin
 QueryPerformanceFrequency(Freq);
 QueryPerformanceCounter(StartTime);
 
 for i := 1 to 1000 do
 begin
 tmp := memInput.Text;
 EndAddr := Integer(Pointer(tmp)) + Length(tmp);
 CurIn := Pointer(tmp);
 CurOut := CurIn;
 while Integer(CurIn) < EndAddr do
 begin
 if not (CurIn^ in ['a'..'z', 'A'..'Z']) then
 begin
 CurOut^ := CurIn^;
 Inc(CurIn);
 end
 else
 begin
 CurOut^ := CharTable[CharList1[Ord(CurIn^)]]
 [CharList2[Ord(Char(Pointer(Integer(CurIn) + 1)^))]];
 Inc(CurIn, 2);
 end;
 Inc(CurOut);
 end;
 SetLength(tmp, Integer(CurOut) - Integer(Pointer(tmp)));
 memOutput.Text := tmp;
 end;
 
 QueryPerformanceCounter(EndTime);
 ShowMessage(FormatFloat('0.000', (EndTime - StartTime) / Freq) + ' ms');
 |  Dieser Quelltext liegt auf dem Speed Knopf unterhalb des Startbuttons (Anhang aktualisiert).
 // EDIT2:
 Post korrigiert, ich hatte noch einen Fehler gemacht in der ersten Version.
 // EDIT3:
 Offenbar wird das Memo gar nicht aktualisiert, da es immer den selben Text bekommt. Ich habe das BeginUpdate..EndUpdate herausgenommen, weil   Yogu  sowas auch nicht drin hatte, aber ich glaube mit diesen beiden Zeilen wäre das Ergebnis realistischer. Dafür 10 mal so groß ca.
Einloggen, um Attachments anzusehen!
 |  |  |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: Fr 28.11.08 14:32 
 
Hab jänicke's Programm mal kurz entkernt und hab da mal meine ASM-Variante getestt mit:
 Mein Rechner kommt auf 120ms; die Original-Version waren 140ms. Hab nen AMD Athlon64 X2 4000+.
 Hier mal meine Routine:
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
 60:
 61:
 62:
 63:
 64:
 65:
 66:
 67:
 68:
 69:
 70:
 71:
 72:
 73:
 74:
 75:
 76:
 77:
 78:
 79:
 80:
 81:
 82:
 83:
 84:
 85:
 86:
 87:
 88:
 89:
 90:
 91:
 92:
 93:
 94:
 95:
 96:
 97:
 98:
 99:
 100:
 101:
 102:
 103:
 104:
 105:
 106:
 107:
 108:
 109:
 110:
 111:
 112:
 113:
 114:
 115:
 116:
 117:
 118:
 119:
 120:
 121:
 122:
 123:
 124:
 125:
 126:
 127:
 128:
 129:
 130:
 131:
 132:
 133:
 134:
 135:
 136:
 137:
 138:
 139:
 140:
 141:
 142:
 143:
 
 | procedure TfrmMain.btnSpeedClick(Sender: TObject);const
 CharList: array[Char] of Byte = (
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
 0, 1, 0, 0, 2, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0,
 0, 1, 0, 0, 2, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0,
 
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 );
 
 CharTable: array[0..35] of Char = (
 'A', 'B', 'C', 'D', 'E', 'F',
 'G', 'H', 'I', 'J', 'K', 'L',
 'M', 'N', 'O', 'P', 'Q', 'R',
 'S', 'T', 'U', 'V', 'W', 'X',
 'Y', 'Z', '0', '1', '2', '3',
 '4', '5', '6', '7', '8', '9'
 );
 
 var
 EndAddr: Integer;
 CurIn, CurOut: ^Char;
 tmp: string;
 StartTime, EndTime, Freq: Int64;
 i: Integer;
 begin
 QueryPerformanceFrequency(Freq);
 QueryPerformanceCounter(StartTime);
 
 for i := 1 to 1000 do
 begin
 tmp := memInput.Text;
 asm
 PUSH  ESI
 PUSH  EDI
 PUSH  EBX
 
 MOV    ESI, DWORD PTR [tmp]
 MOV    EDI, ESI
 MOV    ECX, DWORD PTR [ESI-4]
 
 MOV    EBX, OFFSET CharList
 
 TEST  ECX, ECX
 JMP    @@CheckLoop
 
 @@StartLoop:
 LODSB
 MOV    AH, AL
 
 XLATB
 
 OR    AL, AL
 JNZ    @@Got1
 
 MOV    AL, AH
 STOSB
 JMP    @@ECycle
 
 @@Got1:
 MOV    EDX, EAX
 LODSB
 MOV    AH, AL
 
 DEC    ECX
 
 XLATB
 OR    AL, AL
 JNZ    @@Got2
 
 MOV    AL, DH
 STOSB
 MOV    AL, AH
 STOSB
 JMP    @@ECycle
 
 @@Got2:
 DEC    DL
 AND    EDX, 7
 LEA    EDX, DWORD PTR [EDX+EDX*2]
 ADD    EDX, EDX
 
 MOV    EBX, OFFSET CharTable
 ADD    AL, DL
 DEC    AL
 XLATB
 MOV    EBX, OFFSET CharList
 
 AND    AH, $20
 ADD    AL, AH
 
 STOSB
 
 @@ECycle:
 DEC    ECX
 @@CheckLoop:
 JNZ    @@StartLoop
 
 MOV    DWORD PTR [CurOut], EDI
 
 POP    EBX
 POP    EDI
 POP    ESI
 end;
 SetLength(tmp, Integer(CurOut) - Integer(Pointer(tmp)));
 memOutput.Text := tmp;
 end;
 
 QueryPerformanceCounter(EndTime);
 ShowMessage(FormatFloat('0.000', (EndTime - StartTime) / Freq) + ' ms');
 end;
 | _________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
 |  |  |  
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 28.11.08 15:51 
 
Bei mir kommt deine Version auf 0,061ms und meine auf 0,044ms (3700+ Single Core), auf dem anderen PC (6000+ X2) sinds 0,049ms bei dir und 0,032ms bei mir. Weshalb das bei dir so viele ms sind weiß ich nicht.   |  |  |  
| freedy 
          Beiträge: 403
 Erhaltene Danke: 1
 
 Winows 7
 Delphi XE
 
 | 
Verfasst: Fr 28.11.08 16:32 
 
Also, ich muss schon sagen, dass ich mächtig verwirrt bin. 0,0xx ms? Habt ihr überall vergessen mit 1000 zu multiplizieren? QueryPerformanceFrequency wird ja in Sekunden zurückgegeben. 
 Somit liegt mein Algo immernoch bei 16ms für die Dekodierung des Anfangsartikels. BenBes habe ich bei mir mit 44ms im Schnitt gemessen. Jaenickes gibt mir einen Fehler bei der Bereichsüberprüfung.
 |  |  |  
| GTA-Place 
          
  Beiträge: 5248
 Erhaltene Danke: 2
 
 WIN XP, IE 7, FF 2.0
 Delphi 7, Lazarus
 
 | 
Verfasst: Fr 28.11.08 16:41 
 
	  |  freedy hat folgendes geschrieben  : |  	  | QueryPerformanceFrequency wird ja in Sekunden zurückgegeben. | 
 Ja, da wird tatsächlich vergessen mit 1000 zu multiplizieren. 0,034 heißt in dem Fall 34ms._________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
 
 Zuletzt bearbeitet von GTA-Place am Fr 28.11.08 17:09, insgesamt 3-mal bearbeitet
 |  |  |  |