То, что быстрее, очень зависит от того, какой компилятор и на какой процессор вы ориентируетесь. На большинстве процессоров и всех компиляторах x = (x>=0)? х:-х; это самый быстрый способ получить абсолютное значение, но на самом деле часто стандартные функции уже предлагают это решение (например, fabs()). Он скомпилирован в сравнение, за которым следует инструкция условного присваивания (CMOV), а не в условный переход. Однако на некоторых платформах эта инструкция отсутствует. Хотя компилятор Intel (но не Microsoft или GCC) автоматически конвертировал бы if() в условное присваивание и даже пытался бы оптимизировать циклы (если это возможно).
Код ветвления в целом медленнее, чем условное присваивание, если ЦП использует статистическое прогнозирование. if() может быть в среднем медленнее, если операция повторяется несколько раз, а результат условия постоянно меняется. Процессоры, такие как Intel, начнут вычислять обе ветки и отбросят недопустимую, в случае больших тел if() или большого количества циклов, которые могут быть критическими.
sqr() и sqrt() на современных процессорах Intel являются одной встроенной инструкцией и не медленны, но они неточны, и загрузка регистров также потребует времени.
Связанный с этим вопрос: Почему инструкция перехода ЦП медленная?
Скорее всего, профессор хотел, чтобы студент провел исследование по этому вопросу, это полупровокационный вопрос\задание, которое пойдет только на пользу, если студент научится самостоятельно мыслить и искать дополнительные источники.
person
Swift - Friday Pie
schedule
18.03.2015