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 بدلاً من ذلك.

المقالات المقترحة
لماذا تعتبر عملية الجذر التربيعي بطيئة في لغة C#؟
دليل لكتابة واسترجاع البيانات من التعليمات البرمجية متعددة الخيوط في C#
مجموعة متنوعة من أساليب الترميز في C#
الاستفادة من مهارات C# لتحقيق الدخل من حضور TikTok
مقدمة إلى لغة C#
7 نصائح فعالة لتعلم C# بشكل أسرع
استكشاف الوظائف الرئيسية في C#