2016-12-06 3 views
2

Это один из тех крошечных вопросов по оптимизации, который не имеет значения, но в любом случае интересно думать.Что происходит быстрее: условное или несколько дополнительных арифметических операций?

У меня есть две разные строки Java код, который я мог бы использовать:

  1. coord < 0 ? (coord % max + max) % max : coord % max или
  2. (coord % max + max) % max

Я предполагаю, что Макс всегда положительная ИНТ и коорд может быть любой действительный int. Я считаю, что эти две строки всегда должны давать тот же результат, который заключается в том, чтобы обернуть координату, которая ушла с краю моей карты, где есть монстры.

2 очевидно быстрее в случае, если координата отрицательна. Но если координация положительная, я не уверен, что было бы быстрее. Точка 1 будет делать меньше математических операций в случае, если координация положительная, но я не уверен, что это на самом деле быстрее или нет. Компилятор может даже оптимизировать 1 в 2. Кто-нибудь знает?

К слову, я видел, как люди используют функции post post для обмена координатами, которые просто добавляют max в случае, если координата отрицательна, и это ломается в случае, если ord> max * -1. Я хочу, чтобы у меня было дело с этим делом.

(позже отредактировано) The context is up on Github для тех, кто хотел бы его увидеть. И да, я знаю, что это не имеет значения для производительности моей программы, но я просто подумал, что это интересный вопрос.

+0

Никто не знает наверняка, не видя контекста, и большинство людей не заботятся об этом так или иначе. Единственный способ убедиться в том, что нужно профилировать замкнутый цикл, который включает этот код. Конечно, если вокруг этого кода нет жесткой петли, я не понимаю, почему в первую очередь это беспокоило бы эту проблему. – dasblinkenlight

+0

Как я уже сказал, это просто любопытство. Реальный вопрос: «Что быстрее, несколько арифметических операций или одно условное?» –

+3

Всё зависит. Стоимость филиала не фиксирована, и ни одна из них не является стоимостью остатка. – harold

ответ

1

Вы используете слишком сложное выражение для отрицательного случая:

coord < 0 ? (coord % max + max) % max : coord % max 

таких же, как

coord < 0 ? coord % max + max : coord % max 

ошибочных ветви могут быть дорогостоящими, однако на современном i86/amd64, ветвление могут быть устранены с помощью условного перемещения. Таким образом, условие, скорее всего, быстрее.

Отметьте, что guava также использует его.

0

Я думаю, что ответ branch prediction.

Если вы используете ветви (if-else), код, который выполняется, зависит от входных данных. Таким образом, в зависимости от прогнозирования ветвей входных данных может не работать, потому что может быть непредсказуемым, какая ветка будет выполнена.

Смежные вопросы