سؤال

أي شخص يعرف ما إذا كان المشغل مضاعفة أسرع من استخدام طريقة الرياضيات. يحب:

n * n * n

ضد

Math.Pow ( n, 3 )
هل كانت مفيدة؟

المحلول

أساسا، يجب عليك معيار لترى.

التخمين المتعلم (غير موثوق):

في حال لم يكن الأمثل في نفس الشيء من قبل بعض المترجم ...

من المحتمل جدا أن x * x * x أسرع من ذلك Math.Pow(x, 3) كما Math.Pow يجب أن تتعامل مع المشكلة في قضيةها العامة، والتعامل مع القوى الكسرية وغيرها من القضايا، في حين x * x * x سوف تأخذ مجرد تعليمات مضاعفة، لذلك من المحتمل جدا أن تكون أسرع.

نصائح أخرى

لقد قمت بإعادة تثبيت Windows، لذلك لم يتم تثبيت Visual Studio وكود قبيح

using System;
using System.Diagnostics;

public static class test{

public static void Main(string[] args){
    MyTest();
    PowTest();
}

static void PowTest(){
    var sw = Stopwatch.StartNew();
    double res = 0;
    for (int i = 0; i < 333333333; i++){
        res = Math.Pow(i,30); //pow(i,30)
    }
    Console.WriteLine("Math.Pow: " + sw.ElapsedMilliseconds + " ms:  " + res);
}

static void MyTest(){
    var sw = Stopwatch.StartNew();
    double res = 0;
    for (int i = 0; i < 333333333; i++){
        res = MyPow(i,30);
    }
    Console.WriteLine("MyPow: " + sw.ElapsedMilliseconds + " ms:  " + res);
}



static double MyPow(double num, int exp)
{
    double result = 1.0;
    while (exp > 0)
    {
        if (exp % 2 == 1)
            result *= num;
        exp >>= 1;
        num *= num;
    }

    return result;
}
}

النتائج:
csc / o test.cs

test.exe.

MyPow: 6224 ms:  4.8569351667866E+255  
Math.Pow: 43350 ms:  4.8569351667866E+255 

للأسف عن طريق التربيع (انظر https://stackoverflow.com/Questions/101439/the-Spirection-Afficle-way-Implement-ان-انغريد -) أسرع بكثير من الرياضيات

تحرير: إصدار .NET هو 3.5 المزود بحزمة الخدمة SP1، نظام التشغيل هو Vista SP1 وخطة الطاقة عالية الأداء.

عدد قليل من قواعد الإبهام من 10+ سنوات من التحسين في معالجة الصور والحوسبة العلمية:

يتفوق الأمثل في مستوى الخوارزمية على أي قدر من الأمثل على مستوى منخفض. على الرغم من "كتابة الواضحة، فإن تحسين" الحكمة التقليدية يجب أن يتم ذلك في البداية. ليس بعد.

سيتم توضيح عمليات الرياضيات المرفيفة باليد (خاصة أنواع SIMD SSE +) بشكل عام على فحص الأخطاء بالكامل، والتي تم فحصها بالكامل

أي عملية حيث يعرف المحول البرمجي مسبقا ما يجب القيام به من قبل المحول البرمجي. وتشمل هذه: 1. عمليات الذاكرة مثل الصفيف.copy () 2. للحلقات على صفائف حيث يتم إعطاء طول الصفيف. كما هو الحال في (..; i<array.Length;..)

قم دائما بتعيين أهداف غير واقعية (إذا كنت تريد).

لقد حدث للتو قد اختبرت هذا أمس، ثم رأيت سؤالك الآن.

على جهازي، تشغيل موضوع اختبار Core 2 Duo 1، أسرع لاستخدام مضاعفة تصل إلى عامل 9. في 10، Math.Pow (B، E) أسرع.

ومع ذلك، حتى في عامل 2، فإن النتائج غالبا ما تكون متطابقة. هناك أخطاء تقريب.

بعض الخوارزميات حساسة للغاية لتقرير الأخطاء. اضطررت إلى تشغيل حرفيا أكثر من مليون اختبار عشوائي حتى اكتشفت هذا.

لقد راجعت، و Math.Pow() يعرف أن تأخذ اثنين الزوجي. هذا يعني أنه لا يستطيع القيام بالضدد المتكرر، ولكن يتعين عليه استخدام نهج أكثر عمومية. إذا كان هناك Math.Pow(double, int), ربما يمكن أن يكون أكثر كفاءة.

ومع ذلك، فإن اختلاف الأداء هو بالتأكيد تافهة تماما، لذلك يجب عليك استخدام أيهما أكثر وضوحا. لا يمكن إدخال التحسينات الصغيرة مثل هذا دائما تقريبا، ويمكن تقديمها في أي وقت تقريبا، ويجب تركها في نهاية عملية التطوير. عند هذه النقطة، يمكنك التحقق مما إذا كان البرنامج بطيئا للغاية، حيث تكون النقاط الساخنة، وقضاء جهد التحسين الصغير حيث سيحدث فعليا.

هذا هو ما هو صغير جدا يجب أن تقضيه على الأرجح من أجل منصات محددة، ولا أعتقد أن نتائج Pentium Pro ستكون بالضرورة هي نفسها بالنسبة لذراع أو بنتيوم الثاني.

الكل في الكل، من المرجح أن يكون غير ذي صلة تماما.

دعونا نستخدم الاتفاقية X ^ n. دعونا نفترض N دائما عددا صحيحا.

بالنسبة للقيم الصغيرة من N، ستكون الضرب المملة بشكل أسرع، لأن الرياضيات. يستخدم Math.Pow (المرجح، التنفيذ) الخوارزميات الفاخرة للسماح ب N غير متكاملة و / أو سلبية.

بالنسبة للقيم الكبيرة من N، من المحتمل أن تكون الرياضيات .POW بشكل أسرع، ولكن إذا لم تكن مكتبتك ذكية للغاية، فستستخدم نفس الخوارزمية، والتي لا تكون مثالية إذا كنت تعرف أن N دائما صحيح. لذلك يمكنك كود تنفيذ تنفيذ للأسود عن طريق التربيع أو بعض الخوارزمية الهوى الأخرى.

بالطبع أجهزة الكمبيوتر الحديثة سريعة جدا وربما يجب أن تلتصق بأبسط أو أسهل في القراءة، على الأقل من المرجح أن تكون طريقة عربات التي تجرها الدواب حتى تقوم بتعقيها برنامجك وتكون متأكدا من أنك ستحصل على تسريع كبير باستخدام خوارزمية مختلفة.

لا أوافق على أن وظائف Handbuilt أسرع دائما. وظائف جيب التمام هي أسرع وأكثر دقة من أي شيء يمكنني أن أكتب. أما بالنسبة إلى الأسرى (). لقد قمت باختبار سريع لمعرفة كيف كان الرياضيات البطيئة. كان في جافا سكريبت، لأن ميران حذر من التخمين

    for (i3 = 0; i3 < 50000; ++i3) { 
      for(n=0; n < 9000;n++){ 
        x=x*Math.cos(i3);
      }
    }

فيما يلي النتائج:

Each function run 50000 times 

time for 50000 Math.cos(i) calls = 8 ms 
time for 50000 Math.pow(Math.cos(i),9000) calls = 21 ms 
time for 50000 Math.pow(Math.cos(i),9000000) calls = 16 ms 
time for 50000 homemade for loop calls 1065 ms

إذا كنت لا توافق على تجربة البرنامج في http://www.m0ose.com/javascripts/speedtests/powspeedtest.html.

Math.Pow(x, y) يتم حساب عادة داخليا كما Math.Exp(Math.Log(x) * y). وبعد يتطلب معادلة الطاقة Evey العثور على سجل طبيعي، الضرب، وترفع e إلى السلطة.

كما ذكرت في إجابتي السابقة، فقط في قوة 10 يفعل Math.Pow() تصبح أسرع، ولكن الدقة سوف تتعرض للخطر إذا كنت تستخدم سلسلة من الضربات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top