Выход ASM не является хорошим показателем скорости алгоритма. Кроме того, из того, что я вижу, две части кода выполняют почти идентичную работу. Наибольшее различие, похоже, является стратегией доступа к памяти, а первое использует roll-left вместо эквивалентного набора инструкций (shl | shr - большинство языков программирования более высокого уровня не учитывают операторов «roll»). Последний может быть лучше, чем первый.
Оптимизация ASM - черная магия, а иногда больше команд выполняется быстрее, чем меньше.
Разумеется, сравнивайте и выигрывайте победителей . Если вам нравится вывод второго, но первый быстрее, вставьте значения второго в первый.
rol edx,5 { edx := (edx shl 5) or (edx shr 27)... }
Обратите внимание, что разные машины будут запускать код по-разному, поэтому, если скорость ДЕЙСТВИТЕЛЬНО сущности, тогда сравнивайте его с оборудованием, на котором вы планируете запустить окончательное приложение. Я готов поспорить, что над мегабайтами данных разница будет составлять миллисекунды, что намного меньше, чем операционная система отнимает у вас.
PS. Я не уверен, что этот алгоритм создает равномерное распределение, то, что вы явно вызывали (вы запускаете гистограммы?). Вы можете посмотреть на перенос этой хэш-функции в Delphi. Это может быть не так быстро, как описанный выше алгоритм, но он выглядит довольно быстрым и также дает хорошее распространение. Опять же, мы, вероятно, говорим о порядке миллисекунд разницы по мегабайтам данных.