لماذا 2 * (i * i) أسرع من 2 * i * i في Java؟
مرحبًا بالجميع! أنا أكتب benchmark بسيط لمقارنة أداء الضرب في Java. لاحظت سلوكًا غريبًا: الكود الذي يحتوي على التعبير `2 * (i * i)` يعمل بشكل أسرع باستمرار من `2 * i * i`. إليك مثال:
```java
public class Test {
public static void main(String[] args) {
long start = System.nanoTime();
long sum = 0;
for (int i = 0; i < 1_000_000_000; i++) {
sum += 2 * i * i; // بطيء
}
System.out.println(sum);
System.out.println("Time: " + (System.nanoTime() - start) / 1_000_000 + " ms");
}
}
```
إذا استبدلت `2 * i * i` بـ `2 * (i * i)`، فإن وقت التنفيذ ينخفض تقريبًا إلى النصف! كنت أتوقع ألا يكون هناك فرق، لأنها رياضيًا نفس الشيء. هل هذا مرتبط بترتيب العمليات الحسابية أو بكيفية تحسين JIT-compiler للكود؟ أم أنه bug في JVM؟ أرجو التوضيح.
*ترجمة لسؤال مشهور من Stack Overflow. الأصل: "Why is 2 * (i * i) faster than 2 * i * i in Java؟"
*ترجمة لسؤال مشهور من Stack Overflow. الأصل: "Why is 2 * (i * i) faster than 2 * i * i in Java؟"