strlen Performance-Implementierung

8

Dies ist eine Mehrzweckfrage:

  • Wie ist das mit der Implementierung glibc strlen zu vergleichen?
  • Gibt es im Allgemeinen einen besseren Weg dazu und für die Autovectorisation.

Zufälliger Füllermist, weil stackoverflow irgendwie besser über das Verhältnis von Code zu Zusammenfassung informiert ist

%Vor%     
nwmcsween 03.08.2012, 00:45
quelle

3 Antworten

7

Nun, diese Implementierung basiert auf praktisch demselben Trick ( Ermitteln, ob ein Wort ein Nullbyte hat ) als die Glibc-Implementierung, die Sie verknüpft haben. Sie machen fast dasselbe, außer dass in der glibc-Version einige Schleifen entrollt werden und Bitmasken explizit ausgeschrieben werden. Die ONES und HIGHS aus dem Code, den Sie gepostet haben, sind genau himagic = 0x80808080L und lomagic = 0x01010101L form glibc version.

Der einzige Unterschied, den ich sehe, ist, dass die Version von glibs ein etwas anderes Kriterium für die Erkennung eines Nullbytes verwendet

%Vor%

ohne ... & ~longword zu machen (vergleiche mit HASZERO(x) Makro in Ihrem Beispiel, was dasselbe mit x tut, aber auch ~(x) member). Offenbar glaubten glibc-Autoren, dass diese kürzere Formel effizienter sei. Es kann jedoch zu falsch positiven Ergebnissen führen. Also prüfen sie unter diesem if auf falsche Positive.

Es ist in der Tat eine interessante Frage, was effizienter ist: ein einstufiger präziser Test (Ihr Code) oder ein zweistufiger Test, der mit einer groben ungenauen Prüfung beginnt, gegebenenfalls gefolgt von einer präzisen zweiten Prüfung (glibc code) ).

Wenn Sie sehen möchten, wie sie sich in Bezug auf die tatsächliche Leistung vergleichen, legen Sie sie auf Ihrer Plattform und Ihren Daten fest. Es gibt keinen anderen Weg.

    
AnT 03.08.2012, 00:52
quelle
3

Beachten Sie auch, dass diese Implementierung über das Ende eines char-Arrays hinaus lesen kann:

%Vor%

und beruht daher auf undefiniertem Verhalten.

    
beerboy 08.08.2012 02:05
quelle
0

Um Ihre zweite Frage zu beantworten, denke ich, dass die naive byte-basierte strlen -Implementierung zu einer besseren automatischen Vektorisierung durch den Compiler führen wird, wenn es intelligent ist und Unterstützung für Vektorbefehlssatzerweiterungen (zB SSE) aktiviert wurde (z mit -msse oder einem passenden -march ). Leider führt dies nicht zu einer Vektorisierung mit Grundlinien-CPUs, denen diese Merkmale fehlen, obwohl der Compiler 32- oder 64-Bit-Pseudovektorcode wie der in der Frage zitierte C-Code erzeugen könnte. wenn es schlau genug wäre ...

    
R.. 03.08.2012 01:21
quelle

Tags und Links