Avatar ·

لماذا 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؟"