Я просто наткнулся на эту статью: Compute the minimum or maximum of two integers without branchingОптимизация кода, чтобы избежать ветвления
Он начинается с «[о] н некоторых редких машинах, где ветвление дорого ...».
Раньше я думал, что ветвление всегда дорого, поскольку оно часто заставляет процессор очищать и перезапускать конвейер выполнения (например, см. Why is it faster to process a sorted array than an unsorted array?).
Это оставляет меня пару вопросов:
- ли автор статьи получить, что часть не так? Или эта статья может быть написана за раз до того, как возникла проблема ветвления (я не могу найти дату на ней).
- У современных процессоров есть способ завершить минимальные ветви, например, в
(x < y) ? x : y
без ухудшения производительности? - Или все современные компиляторы просто реализуют этот хак автоматически? В частности, что делает Java? Тем более, что его
Math.min(...)
функции только что тройное заявление ...
Хорошая уловка на встроенных устройствах. Похоже, автор просто скопировал предложение со страницы Стэнфорда, с которой он ссылается в конце. И **, что ** статья, не только кажется, что она была написана в 1997 году (опять же, нет четкой даты, просто диапазон авторских прав), но она также квалифицирует заявление далее как «... редкие машины, где ветвление очень дорогое * * и никаких правил перемещения [al] move ** ... ". –
Я только что заметил. Почему «numberOfLeadingZeros» реализован с использованием нескольких ветвей, в то время как его можно выразить как «64-highBit (n)», который можно вычислить как «битCount» (maximumOneBit (n) - 1) + 1 », оба из которых являются сериями двоичные операции без какой-либо ветви. ...? –
@MarkJeronimus Не знаю, но, может быть, ветви могут заменяться условными ходами? И, может быть, кому-то это не понравилось, так как на современных процессорах он все равно заменяется на 'lzcnt', а на слабых процессорах ветви могут быть дешевле. Вы можете скопировать методы (так, чтобы внутренние свойства не привыкли) и сравнить их (но, пожалуйста, используйте JMH или Caliper, иначе это просто случайный шум). Мне было бы интересно, но я действительно должен был заняться другими делами. – maaartinus