-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
16. Jul 2018
So was habe ich mir schon gedacht.. :thumb: für das Abändern der function! Ich kenne sehr viele implementationen von StringReplace, alle jedoch reservieren Speicher für das Resultat. Hier kommt noch eine Sache zum Tragen: der Char ist kein String, somit sollte abermals Speicher (WideChar->UnicodeString) reserviert werden, wenn da nicht inzwischen ein overload existiert. Gehen wir davon aus, die...
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
15. Jul 2018
@Uwe
Gerne, was früher war muß längst nicht mehr sein... Bin da immer offen!
Um etwas zu lernen, hilft es mir es zu verstehen. Schnell im Pure-Pascal ist etwas, was ich mag.
Daher meine Hypothese, welche meine alleinige Annahme ist und ich auch nicht beweisen kann..
@KodeZwerg
Ich kuller mal ein Auge drüber, danke! Sei so gut und check meine Anmerkungen, bitte.
@jbg
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
15. Jul 2018
@Uwe
ist nur 'ne bescheidene Hypothese. Dennoch sind mir die Ergebnisse von Ydobon viel zu nah an allen anderen. Bist du da mit mir einig? IMO spukt es da ein wenig. Alle sollten sich je nach {$R+} minimal aneinander reihen. Die Theorie die Optimirung von StringReplace ist für mich vom Tisch...
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
15. Jul 2018
Kleine Anregungen:
CountCharInString, CharInStringA scheitern, wenn #0 im String sind und knallen wenn ein #0 gesucht wird. letzteres sollte mindistens abgefangen und ersteres dokumentiert werden
ich meine das Result wird nicht initialisiert, wenn der String lehr ist
für CharCountAsm von Neutral General knallte mit {$R+), wenn der String lehr ist. Die function CharCountAsm selber...
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
14. Jul 2018
@Uwe,
mir scheint der Compiler kennt die Feder das Autors und meint es gut mit ihm :stupid:
Nungut, W64 kann ich dir und CodeZwerg (warum auch immer) auf deinen Pay-Compiler wohl nicht abgraben!
Beim W32 scheint er nun doch auf deiner Seite fremd zugehen..
@Harry
deine Anregung wäre eine weiter Challange -> neues Thema, jodoch sehr leicht. Dieses Thema hier könnte mann auch noch um...
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
14. Jul 2018
Puff, damit hab ich jetzt nicht wirklich gerechnet. Bezhalt vs. Free..
Desaster? Wie teilbar?? Uwe ich teile nix! Ich nehm dem PEnd gleich im Eingang 8 chars weg (Subtraktion) und behalte mir die für die letzte tiny loop vor.. Somit ist das Ergebnis garantiert, oder sieht das jemand anders? Der Code passt, sind jedoch typos drin die behalten werden dürfen :stupid:
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
14. Jul 2018
Double Post. Hab sind noch zwei:
mit direktem Inc des Boolschen ordinals:
function EH_CharCount_5(const S: string; C: Char): Cardinal;
var
P, PEnd: PChar;
begin
Result := 0;
P := Pointer(S);
if P = nil then Exit;
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
14. Jul 2018
Danke für für den letzten Stand.
Ich denke du hast recht. Simples Ausschlusverfahren:
Ich habe mal mein XE10.2-W32 Compilate (release) angehängt. Wenn deine Version immernoch die schnellste mit der EXE ist, dann ist der Compiler ausgeschlossen und da macht deine Hardware einen guten Job.
Bei mir sehen die Ergebnisse (minimale Schwankungen im >5% ) ziehmlich gleich aus.
YFI:
Aber ist...
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
13. Jul 2018
So ist es! Spotrlicher Ehrgeiz, mehr ist das nicht.
Uwe ich hätte 'ne Kiste Wein gewettet, ich gewinne. Zitat: "Again what learned". Hu nicht gewettet, puhh!
Ist wirklich interessant! Sei so fair und füge meine letzte version hinzu, bitte.
Macht XE10.2-Starter(32-Bit) wat anders? Ich glaube es nicht..
Wenn ich über neuere CPU's so nachdenke(die alten sterben alle :-D) -> die Challange...
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
13. Jul 2018
Zum Spaß:
function EH_CharCount_4(const S: string; C: Char): Cardinal;
var
P, PEnd: PChar;
begin
Result := 0;
P := Pointer(S);
if P = nil then Exit;
PEnd := P + PStrLenInt(NativeUInt(P) - SizeOf(StrLenInt))^-1;
if PEnd = p //handle single char string
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
13. Jul 2018
War auch nicht der Zweck. Es ging um die ursprüngliche Frage un das aufweisen verschiedener Varianten.
Wegen der Performance:
Habe mir Uwes Test mit XE10.2-Starter compiliert und meine 2 weiteren Version hinzugefügt.
2. Run:
@Uwe
kannst du das bestätigen? Mir gehen die 30% Performance-Verlust bei meiner Variante 1 ab. Wo sind sie denn hin? Spielt der Compiler Streiche? Habt ihr...
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
13. Jul 2018
Noch ein kleiner:
Scanne von beiden Seiten und halbiere die Loop:
function EH_CharCount4(const S: string; C: Char): Cardinal;
var
P, PEnd: PChar;
begin
Result := 0;
P := Pointer(S);
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
13. Jul 2018
Assoooo! Und ich dachte schon ...
Der code ist mir klar. Auch die möglicherweise begleitenden Probleme die sich durch den Anruf bei Emba ergeben könnten.
Wenn man so mit dem Speicher spielt, sollte das auch klar sein.
Da greift man auch anders an:
type
//zentral deklariert
PStrLenInt ^StrLenInt;
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
13. Jul 2018
Interessant! Danke!
String ist immer langsam. Die Schleife ist da nicht unbedingt schuld, sondern die permanente Indexierung der Speicheraddresse und die damit verbundenen RangeChecks. Durch deinen CodeStyle ak. Pointer-Math gibt es eben diese Checks erst gar nicht nicht.
function CharCount(const S: string; C: Char): Cardinal;
var
P, PEnd: PChar;
begin
Result := 0;
P :=...
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
13. Jul 2018
Na dann klär mich mal auf! Hättest du FPC anstatt von nur "64 Bit" geschrien dann hättest du meiner bescheidenen Meinung nach recht. :cyclops:
Edit:
function CharCount(const S: string; C: Char): Cardinal;
var
P, PEnd: PChar;
begin
Result := 0;
P := Pointer(S);
-
Forum: Sonstige Fragen zu Delphi
Delphi
by EgonHugeist,
13. Jul 2018
@Uwe
Schaut gut aus! No a bizzl kürzer:
function CharCount(const S: string; C: Char): Cardinal;
var
P, PEnd: PChar;
begin
Result := 0;
P := Pointer(S);