Сгенерированные байт-коды для двух частей кода различны на моей машине (как, скорее всего, на вашем), но это не имеет значения. Во-первых, машинный код, фактически выполняемый JVM после оптимизации, может быть одинаковым; во-вторых, на практике вы не заметите никакой разницы. Попробуйте сравнить его самостоятельно (это PDF presentation объясняет, почему вы не должны), скажем, в цикле, и вы увидите, что вы получаете всевозможные результаты, которые могут отличаться n-fold между прогонами и/или после незначительных изменений, и что происходит в окружении, которое вы сделали настолько предсказуемым, насколько сможете. Представьте, что происходит в реальном коде, где любая из этих строк - это не случайный существенный CPU-spender.
Запуск надлежащего JMH микрофункции для этого кода говорит, что он работает в ~ 3-4 наносекундах в обоих вариантах (вместе с загрузкой начального значения из поля и возвратом результата из метода, или же весь метод может быть выброшен далеко). Я немного скептически отношусь к тому, что некоторые фреймворки могут измерять время с такой точностью на моем рабочем столе, но я думаю, что либо это истина, либо фактические тайминги этих двух частей кода заглушаются другими затратами (вызов метода? Loading значение? возвращающее значение?).
Benchmark Mode Cnt Score Error Units
MyBenchmark.f1 thrpt 30 281747,576 ± 9748,881 ops/ms
MyBenchmark.f2 thrpt 30 289411,317 ± 8951,254 ops/ms
Ради полноты картины, эталоном я использовал
import org.openjdk.jmh.annotations.*;
import java.util.concurrent.*;
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class MyBenchmark {
public int a = 0xDEADBEAF;
@Benchmark
public int f1() {
int x = a;
x += 2;
return x;
}
@Benchmark
public int f2() {
int x = a;
x = x + 2;
return x;
}
}
Выполнить 10 итераций прогрева, 10 измерительных итераций, 3 вилки.
Вы беспокоитесь о _nanoseconds_ здесь. Преждевременная оптимизация. –
Простой «почему?» поскольку ответ на этот комментарий был бы более продуктивным. –
Ваш код был 'x = (x + 2);' и мой комментарий был не о производительности, а о читаемости (поскольку он также избегает избыточного parenthese). – Tom