Guten Morgen,
wollte Dejan Vu's produktiven Worten eigentlich den Vortritt beim Abschluß dieses Threads lassen. Doch:
@Dejan Vu
Ich habe hierbei auch etwas gelernt:
Code:
if (Pointer(Result) = nil) or //result unassigned?
(PLongInt(NativeUInt(Result) - SizeOf(LongInt))^ <> SrcLen) {PStrRec.Len} or //length different?
(PLongInt(NativeUInt(Result) - (SizeOf(LongInt) shl 1))^ <> 1) {PStrRec.RefCnt} then //no unique string?
SetLength(Result,SrcLen+((SrcLen-1) shr 2));
Für hoch performante String functions war ich es gewohnt erst den String-Refcount und die Länge zu testen, bevor ich ein SetLength() calle. Die älteren
IDE's haben in jedem Falle einen neuen Unique-String erzeugt. Nun scheint mir das dieser Test schon implizit dem SetLength drin ist. Oder baut das der Compiler neuerdings direkt ein? Das war nicht immer so, und gilt herauszufinden, seit welcher Version sich Delphi so verhält. Klar ich spare den Call aber der Code wird unleserlich und für jemanden, der davon keine Ahnung hat, völlig banane.
Nu kuck ... muß meine gewohnte low-Level Syntax nun doch nicht in Frage stellen. Mir fällt's gerade wie Schuppen von den Augen:
Ich vergleiche hier die Result-Länge mit der Source-Länge.
Na sooo wird dad doch auch nix!
Also ... habe ich die
Unit nochmals angehängt. Es kitzelt doch noch einige Ticks raus:
Zitat von
Benchmarks:
Task: Fuege einen "_" -Char an jeder 4. Stelle ein!
Benchmarking DupeString('xyz', 1 shl^0..10) Iterations: 2000000:
Autor: "Mavarik" Function: "MavarikQuadUnderScoreInjector" TickCount: 9688
Autor: "Dejan Vu" Function: "DejanVuQuadUnderScoreInjector" TickCount: 575078
Autor: "EgonHugeist" Function: "leerzeichen" TickCount: 3500
Autor: "Sir Rufo" Function: "StrInsertEveryNthPos" TickCount: 85328
Autor: "EgonHugeist" Function: "EH_QuadUnderScoreInjectorBy4" TickCount: 3313
Autor: "EgonHugeist" Function: "EH_QuadUnderScoreInjectorBy8" TickCount: 3250
Task: Fuege einen "/\"-String an jeder 4. Stelle ein!
Benchmarking DupeString('xyz', 1 shl^0..10) Iterations: 2000000:
Autor: "Sir Rufo" Function: "StrInsertEveryNthPos" TickCount: 139406
Autor: "EgonHugeist" Function: "EH_StrInsertEveryNthPos" TickCount: 25422
From my POV ... case closed.
PS. @Mavarik das div 4 braucht ca. 10 Zyklen, wärend ein shr 2 einen braucht.. Ist der Hauptunterschied zwischen "Leerzeichen" und "EH_QuadUnderScoreInjectorBy4"..