C# لماذا القسمة أبطأ من الضرب؟
في لغات البرمجة وتحديداً C# هناك 4 عمليات حسابية يمكن إجراؤها: الجمع والطرح والضرب والقسمة.
ومن منظور خارجي، قد يبدو أن جميعهم متشابهون من حيث الأداء، ولكن يتبين أن أحدهم أبطأ بكثير مقارنة بالثلاثة الآخرين.
أيهما أبطأ قد تسأل؟ التقسيم.
وفقًا لـ ورق HP هذا:
يستغرق حساب قسمة النقطة العائمة والجذر التربيعي وقتًا أطول بكثير من عملية الجمع والضرب. يتم حساب الأخيرين مباشرة بينما يتم حساب الأول عادةً باستخدام خوارزمية تكرارية. الطريقة الأكثر شيوعًا هي استخدام تكرار نيوتن-رافسون الخالي من القسمة للحصول على تقريب لمقلوب المقام (القسمة) أو الجذر التربيعي المتبادل، ثم الضرب في البسط (القسمة) أو وسيطة الإدخال (الجذر التربيعي)..
للتحقق من البيان أعلاه قررت إجراء اختبار بسيط باستخدام الكود أدناه:
//Generate two random numbers
var rand = new System.Random();
float a = rand.Next();
float b = rand.Next();
Debug.Log("Number a: " + a + " Number b: " + b);
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
//Addition
for (int i = 1; i < 1000000; i++)
{
float tmp = a + b;
}
watch.Stop();
//Output
Debug.Log("Addition took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");
watch.Reset();
watch.Start();
//Subtraction
for (int i = 1; i < 1000000; i++)
{
float tmp = a - b;
}
watch.Stop();
//Output
Debug.Log("Subtraction took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");
watch.Reset();
watch.Start();
//Multiplication
for (int i = 1; i < 1000000; i++)
{
float tmp = a * b;
}
watch.Stop();
//Output
Debug.Log("Multiplication took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");
watch.Reset();
watch.Start();
//Division
for (int i = 1; i < 1000000; i++)
{
float tmp = a / b;
}
watch.Stop();
//Division
Debug.Log("Division took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");
في الأساس، قمت بإجراء مليون عملية جمع وطرح وضرب وقسمة للرقمين العشوائيين وقمت بقياس الوقت الذي استغرقه كل واحد منهم في المعالجة، وتم تكرار الاختبار 5 مرات، وهذه هي النتيجة:
- استغرقت عملية الإضافة في المتوسط 0.0004 ثانية
- استغرق الطرح في المتوسط 0.0003 ثانية
- استغرق الضرب في المتوسط 0.0003 ثانية
- استغرق القسم في المتوسط 0.0044 ثانية
أظهرت النتيجة أن عمليات الجمع والطرح والضرب متشابهة من حيث الأداء، ولكن القسمة تبدو أبطأ بحوالي 1100%.
ليس هناك فرق بسيط، مما يؤدي إلى استنتاج أنه من الأفضل دائمًا استخدام الضرب بدلاً من القسمة كلما أمكن ذلك. على سبيل المثال، عندما تحتاج إلى تقسيم الرقم على 2، فمن الأفضل ضربه في 0.5 بدلاً من ذلك.