Um in den Linux-Kernel aufgenommen zu werden, wurde ein Satz von Patches mit einer optimierten Implementierung der Funktion memchr() vorgeschlagen, die zum Suchen eines Zeichens in einem Array verwendet wird. Im Gegensatz zur alten Variante, die byteweise Vergleiche anwendete, wurde die vorgeschlagene Implementierung unter Berücksichtigung der vollständigen Nutzung von 64- und 32-Bit-CPU-Registern erstellt. Anstelle von Bytes erfolgt der Vergleich unter Verwendung von Maschinenwörtern, was es ermöglicht, mindestens 4 Bytes gleichzeitig zu vergleichen.
Bei der Suche in großen Zeichenfolgen erwies sich die neue Variante als etwa 4-mal schneller als die alte (zum Beispiel bei Zeichenfolgen mit 1000 Zeichen). Bei kleinen Zeichenfolgen ist die Effizienz der neuen Implementierung nicht so signifikant, aber dennoch höher im Vergleich zur ursprünglichen Variante. Im Linux-Kernel erreicht die Größe der in memchr() verarbeiteten Zeichenfolgen 512 Bytes. Der Leistungszuwachs für 512-Byte-Zeichenfolgen beträgt in Situationen, in denen das gesuchte Zeichen am Ende der Zeichenfolge steht, 20%.
Die Testung des Kernels 5.18 mit der neuen Variante von „memchr()“ für 32- und 64-Bit-Architekturen hat keine Probleme ergeben. Der Gesamte Performance-Zuwachs der Kernel-Subsysteme bei Verwendung der optimierten Variante von „memchr()“ wurde bisher nicht bewertet, und auch die Zweckmäßigkeit einer Implementierungsänderung wurde nicht analysiert (in den Kernel-Codes wird die Funktion memchr() 129-mal aufgerufen, einschließlich im Code von Treibern und Dateisystemen).
Quelle: opennet.ru
