Dies ist eine Mehrzweckfrage:
Zufälliger Füllermist, weil stackoverflow irgendwie besser über das Verhältnis von Code zu Zusammenfassung informiert ist
%Vor% 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.
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 ...
Tags und Links string c performance strlen