Согласно Schema Validation with Intel® Streaming SIMD Extensions 4 (Intel® SSE4) (Intel, 2008 г.) [они] добавили инструкции, облегчающие поиск символов и сравнение двух операндов по 16 байт за раз. Я написал несколько основных функций strlen() и strcmp() на C, но они кажутся медленнее, чем glibc.
Я хотел бы, возможно, поэкспериментировать с использованием встроенной сборки, чтобы увидеть, как мой проект ведет себя с вводом/выводом XML.
Я читал (здесь), что использование SMID для таких вещей, как strlen(), изобилует потенциальными проблемами (выравнивание памяти), поэтому я немного обеспокоен его использованием в производственном коде.
pcmpeqb
, как это делает glibc, или просто используйте функции glibc. Конечно, скалярный C будет медленнее, потому что gcc/clang не может автоматически векторизовать циклы, если количество поездок не известно во время компиляции. Это исключает циклы поиска с разрывом, зависящим от данных; вам нужно вручную векторизовать. SIMD strlen вполне возможен; это то, что glibc использует с рукописным asm, вам просто нужно быть осторожным: безопасно ли читать за конец буфера на той же странице на x86 и x64? показывает, как это сделать. - person Peter Cordes   schedule 26.10.2020pcmpistri
, особенно для strcmp.) Но на самом деле, если важно найти длину строки, часто лучше использовать строки явной длины, где вы сохраняете длину с помощью указателя. - person Peter Cordes   schedule 26.10.2020