Forum: PC-Programmierung Welches strlen ist schneller?


von udok (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Und zum Schluss die Ergebnisse der Performance Tests für die strlen 
Funktion,
ohne viel Kommentar.

Wenn Interesse besteht, das ganze auf dem eigenen Rechner 
auszuprobieren,
dann stelle ich die Sourcen und die Exe hier rein.

Gruss,
Udo

von Wilhelm M. (wimalopaan)


Lesenswert?

Besser std::string benutzen, da entfällt das Problem ;-)

von Jobst Q. (joquis)


Lesenswert?

strlen ist dann am schnellsten, wenn es nicht gebraucht wird. ZB wenn 
man es durch eine einfache Pointersubtraktion ersetzt. Dazu benutzt oder 
schreibt man Stringfunktionen, die das Stringende zurückgeben, statt dem 
eh schon bekannten Stringanfang, wie stpcpy statt strcpy.

von Irgendwer (Gast)


Lesenswert?

Wie kannst Du Dir sicher sein, dass Du nicht einfach nur aktuelle RAM- 
und Cache-Performance getestet hast?

Mikrobenchmarks korrekt durchführen ist eine Wissenschaft für sich. 
Heutige Betriebssystem und CPU-Architekturen sind da ganz schön 
spannend...

von D00fi (Gast)


Lesenswert?

Im guten VHDL kann man auch ein strlen schreiben, was nach
einem Takt schon einen Returnwert hat!
Das soll mal einer in C nachmachen...

von Purzel H. (hacky)


Lesenswert?

Es ist aber schon klar dass sich die Strings gewandelt haben ? Zum einen 
gibt es Wide Strings, UTF-8, usw, wo ein char mehr als ein byte belegt. 
Und dann sollte man nicht mehr mit 0 terminierten Strings arbeiten, 
sondern sich die Laenge separat mitfuehren.
Das Schlimmste geschieht, wenn man Strings aus einzelnen Character 
zusammenhaengt im Sinne von :
- Laenge bestimmen
- alloc laenge + 1
- bestehenden stron kopieren
- neues byte hinten dran
- dispose bestehden string.

von Mark B. (markbrandis)


Lesenswert?

Ich hab jetzt ehrlich gesagt noch nie von einem Programm gehört, das zu 
langsam gelaufen wäre, weil ein strlen() zu viel Rechenzeit verbraucht 
hätte. 🤔

: Bearbeitet durch User
von Le X. (lex_91)


Lesenswert?

Mark B. schrieb:
> Ich hab jetzt ehrlich gesagt noch nie von einem Programm gehört, das zu
> langsam gelaufen wäre, weil ein strlen() zu viel Rechenzeit verbraucht
> hätte. 🤔

Weißt du denn von jedem trägen Programm den Grund, warum es träge ist?

von temp (Gast)


Lesenswert?

Mark B. schrieb:
> Ich hab jetzt ehrlich gesagt noch nie von einem Programm gehört, das zu
> langsam gelaufen wäre, weil ein strlen() zu viel Rechenzeit verbraucht
> hätte.

Klar, wenn man nur 'Hello World' programmiert.
Wer mit wirklich großen Datenmengen und Formaten umgehen muss die er 
nicht selbst bestimmen kann, kann durchaus in die Verlegenheit kommen 
dass ein langsames strlen() darüber entscheidet ob die Analyse 1 Stunde 
oder 3 Stunden braucht. Mit irgendwelchen dynamischen Sachen ala 
str::string brauchst du dann überhaupt nicht anfangen. Für den 6er 
Compiler von Microsoft habe ich auch eine eigene strlen() verwendet weil 
die damalige Version in der lib schnarch langsam war.

von temp (Gast)


Lesenswert?

Stell bitte mal deine Quellen hier ein, ich würde das gern mal gegen 
testen.

von Mark B. (markbrandis)


Lesenswert?

Le X. schrieb:
> Weißt du denn von jedem trägen Programm den Grund, warum es träge ist?

In den Beiträgen vom Themenersteller war meines Wissens nach nie die 
Rede davon, dass irgendwas zu langsam wäre.

Ansonsten halte ich es mit Donald Knuth: "The real problem is that 
programmers have spent far too much time worrying about efficiency in 
the wrong places and at the wrong times; premature optimization is the 
root of all evil (or at least most of it) in programming."

von temp (Gast)


Lesenswert?

temp schrieb:
> Stell bitte mal deine Quellen hier ein, ich würde das gern mal gegen
> testen.

ok, nicht mehr nötig. Mir recht das was es zu memcpy im anderen Thread 
gibt

von Rolf M. (rmagnus)


Lesenswert?

D00fi schrieb:
> Im guten VHDL kann man auch ein strlen schreiben, was nach
> einem Takt schon einen Returnwert hat!

Egal wie lang der String nachher zur Laufzeit ist?

von D00fi (Gast)


Lesenswert?

> Egal wie lang der String nachher zur Laufzeit ist?

Sicher, wenn der FPGA genuegend Swapspace hat.

SCNR.

von Mark B. (markbrandis)


Lesenswert?

@udok
Darf man fragen, was die Motivation dafür ist so genau auf die 
Rechenzeit zu schauen? Hast Du sehr große Datenmengen zu verarbeiten?

von udok (Gast)


Lesenswert?

Die Motivation war zu wissen, wie gross die Unterschiede in den Libc 
memcpy/strcpy Funktionen sind, bzw. ob es nennenswerte Unterschiede 
gibt.
Das ist erst mal ausreichend geklärt.

von udok (Gast)


Angehängte Dateien:

Lesenswert?

1
Hier ein Update der Ergebnisse der Performance Tests für
2
die strlen Funktion.  Das Diagram zeigt die verarbeiteten Bytes / Takt
3
in Abhängigkeit der String Länge.
4
5
- Der Microsoft cl.exe compiler stolpert manchmal über seine eigenen
6
  Optimierungen.  Die Compiler eigenen Builtin Funktionen sind
7
  mit der -O2 Optimierung eingeschaltet.
8
  Leider sind diese "Intrinsic" Funktionen langsamer als
9
  die Funktionen der MS Runtime MSVCRT...
10
  Daher wurde jetzt mit "-Oi-" (Intrinsics aus) compiliert.
11
- Die MSVCRT schlägt sich ziemlich gut, wenn sie der Compiler verwendet.
12
- Der Intel Compiler v19 hat hier ein Problem
13
  mit der Erkennung des Host Prozessors (-QxHost).
14
  Am schnellsten ist der Code nur mit -O2, und nicht der Host spezifische.
15
- AVX2 in Assembler bringt noch mal einen Faktor 2x gegenüber der SSE2 Lib
16
  von Agner Fog.  Damit erreicht man bis zu 25 Bytes / Takt.
17
  Nicht schlecht für die seit Zen3 totgesagte Intel CPU.
18
- die kurze Assembler Schlefe "rep; scasb" ist brutal langsam,
19
  leider optimiert Intel nur die "rep; movsb" Schleife.
20
21
Gruss,
22
Udo

von mh (Gast)


Lesenswert?

udok schrieb:
> AVX2 in Assembler bringt noch mal einen Faktor 2x gegenüber der SSE2 Lib
>   von Agner Fog.  Damit erreicht man bis zu 25 Bytes / Takt.

Hast du das auch mal getestet, wenn der CPU warm wird? Taktet die CPU 
bei den AVX2 Befehlen runter, wenn du die CPU richtig belastest?

von udok (Gast)


Lesenswert?

mh schrieb:
> Hast du das auch mal getestet, wenn der CPU warm wird? Taktet die CPU
> bei den AVX2 Befehlen runter, wenn du die CPU richtig belastest?

In meinen Tests sehe ich keinen Effekt.

Jeder der Tests läuft in einer Schleife öfters durch, und alle Tests
dauern eine gute Minute.
Ich habe die Tests noch mal mit den Windows Energieeinstellungen auf 
Maximum
durchlaufen lassen, und das ganze 3 mal wiederholt.
Die Ergebnisse sind sehr reproduzierbar, da ändert sich nicht viel.

Der Lüfter vom Notebook läuft hörbar, aber noch nicht auf Maximum.
Es wird aber auch nur eine der 6 CPUs beansprucht.

Hier noch die Programmgrösse:
1
test_0_intel_icl_19.exe           22528
2
test_1_AgnerFog_cl_15.exe          6656
3
test_2_strlen_avx_cl_15.exe        6656
4
test_3_strlen_sse_cl_15.exe        6656
5
test_4_msvcrt_cl_15.exe            6656
6
test_5_forloop_cl_15.exe           6656
7
test_6_strlen_scasb_cl_15.exe      6656
8
test_7_strlen_forloop_gcc_9.exe   43008

Der Mingw gcc linkt noch mit seinen eigenen Supportlibs,
und die Exe hat 11 (!) Sektionen, keine Ahnung was da der macht...
Alle exe sind ohne Debugging Infos, und gestrippt,
und linken dynamisch auf die MSVCRT.DLL

von mh (Gast)


Lesenswert?

Du benutzt aber nur einen Kern?

von udok (Gast)


Lesenswert?

Ja.  Die Tests laufen hintereinander auf einem Kern.

von Carl D. (jcw2)


Lesenswert?

D00fi schrieb:
>> Egal wie lang der String nachher zur Laufzeit ist?
>
> Sicher, wenn der FPGA genuegend Swapspace hat.
>
> SCNR.

Wenn das FPGA eine 8x unendlich breites RAM Interface hat, dann schafft 
man das in einer "Speichertransaktion". Die internen Resourcen werden ja 
immer reichen, denn die nötigen Anschlüsse ermöglichen ja beliebige 
Chipfläche. Problematisch wird die Physik. Blöder Einstein.

von cppbert3 (Gast)


Lesenswert?

Mark B. schrieb:
> Ansonsten halte ich es mit Donald Knuth: "The real problem is that
> programmers have spent far too much time worrying about efficiency in
> the wrong places and at the wrong times; premature optimization is the
> root of all evil (or at least most of it) in programming."

Das KANN ein Problem sein ist aber in der heutigen Zeit aber auch 
manchmal überholt, so wie auch Aussage das Assembler nicht mehr 
schneller oder immer schneller ist, solche Sätze kommen von Leuten die 
es schon zu bunt, falsch oder nie Optimierung Betrieben haben oder 
mussten

Die Float String Konvertierung hat auch irgendwie kaum jemand gejuckt, 
mit der neuen MSVC STL zieht z.B. der neue Ryu Algorithmus ein der 
faktisch alle alten Messwerte bedeutungslos macht, und auch bei memcpy 
und Konsorte gibt es immer noch regelmässig Verbesserung an der glibc, 
musl usw. Nur sind die Optimierungen nicht einfach automatisch auf allen 
Platformen, Kompilern gleichmässig gut verfügbar

Wenn es wirklich um Performanz geht und kein Anfänger am Werk ist der 
diletantische Gründe für Performanzprobleme sieht hat auch heute noch 
relevanz

von Carl D. (jcw2)


Lesenswert?

Intel weiß übrigens, welche SIMD-Befehle da besonders nützlich sein 
können. Wobei auch der x64-GCC dem Assemblerleser schnell klar macht, 
daß er einen gewissen Rüchstand bei den Vokabeln hat.

Gerade mal ge-google-t:
mit VPCMPUB kann man 64Bytes am Stück mit '\0' vergleichen und das 
Ergebnis in ein Mask-Register schreiben. Dann mit CLZ den Index der 
ersten '1' im Ergebnis finden. Das ist viel schneller als Null-Bytes in 
einer Schleife suchen.

von schlaubischlumpf (Gast)


Lesenswert?

> Wenn es wirklich um Performanz geht und kein Anfänger am Werk ist der
> diletantische Gründe für Performanzprobleme sieht hat auch heute noch
> relevanz

Versuchs nochmal mit ein paar Kommas.

von cppbert3 (Gast)


Lesenswert?

schlaubischlumpf schrieb:
> Wenn es wirklich um Performanz geht und kein Anfänger am Werk ist
> der diletantische Gründe für Performanzprobleme sieht hat auch heute
> noch relevanz
>
> Versuchs nochmal mit ein paar Kommas.

Wirds damit schneller ;)

von Pandur S. (jetztnicht)


Lesenswert?

Falls die Stringlange zu zaehlen ein Problem wird, nimmt man besser ein 
Array of char und fuehrt die laenge als variable mit. Dann faellt das 
zaehlen weg... tsss.

von cppbert3 (Gast)


Lesenswert?

Pandur S. schrieb:
> Falls die Stringlange zu zaehlen ein Problem wird, nimmt man
> besser ein Array of char und fuehrt die laenge als variable mit. Dann
> faellt das zaehlen weg... tsss.

Wenn man das ändern kann...

von Jemand (Gast)


Lesenswert?

Pandur S. schrieb:
> Falls die Stringlange zu zaehlen ein Problem wird, nimmt man
> besser ein Array of char und fuehrt die laenge als variable mit. Dann
> faellt das zaehlen weg... tsss.

Adieu API-Kompatibilität und Konsistenz

von D00fi (Gast)


Lesenswert?

Wir sind hier bei C und nicht bei Pascal!

von Pandur S. (jetztnicht)


Lesenswert?

Es soll Leute geben, welche repetitiv an einen String appenden. Dies 
geht dann als

 len= stlen(thestring);
 pluslen = strlen(plusstring);
 newstring = alloc(len+pluslen);
 newstring = copy(thestring)+copy(plusstring)

wenn man das ein paar Millionen mal macht, um sich einen Text 
zusammenzustueckeln, ist der Rechner beschaeftigt.

: Bearbeitet durch User
von nicht BWLer (Gast)


Lesenswert?

> Es soll Leute geben, welche repetitiv an einen String appenden.

Das kann ich mir bei BWL-Software lebhaft vorstellen.
Da es damit aber nur BWLer trifft, ist es mir egal.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.