javascript - على - جافا سكريبت، والفرز مع المعلمة الثانية هو أسرع




شرح جافا سكريبت (2)

لقد أجريت اختبارا قليلا، ووجدت أن array.sort(function(a, b) { return a - b; }); هو أسرع بكثير من array.sort(); في جافا سكريبت.

وكانت النتائج صادمة جدا، حوالي 1.7 مرات أسرع في IE9، 1.6 مرة في FF7 و 6.7 مرات في كروم.

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

هل هناك أي تفسير معقول؟

إديت: تطبيقاتي:

لا مقارنة:

function quickSort(array, from, to) {
    if(typeof from === 'undefined') {
        from = 0;
        to = array.length - 1;
    }
    else if(typeof to === 'undefined') {
        to = array.length - 1;
    }

    if(to - from < 1) {
        return;
    }

    var i = from, pivot = to, t;

    while(i < pivot) {
        if(array[i] > array[pivot]) {
            t = array[i];
            array[i] = array[pivot - 1];
            array[pivot - 1] = array[pivot];
            array[pivot] = t;
            pivot--;
        }
        else {
            i++;
        }
    }

    quickSort(array, from, pivot - 1);
    quickSort(array, pivot + 1, to);
}

مع المقارنة:

function quickSortFunc(array, sortfunc, from, to) {
    if(typeof from === 'undefined') {
        from = 0;
        to = array.length - 1;
    }
    else if(typeof to === 'undefined') {
        to = array.length - 1;
    }

    if(to - from < 1) {
        return;
    }

    var i = from, pivot = to, t;

    while(i < pivot) {
        if(sortfunc(array[i], array[pivot]) > 0) {
            t = array[i];
            array[i] = array[pivot - 1];
            array[pivot - 1] = array[pivot];
            array[pivot] = t;
            pivot--;
        }
        else {
            i++;
        }
    }

    quickSortFunc(array, sortfunc, from, pivot - 1);
    quickSortFunc(array, sortfunc, pivot + 1, to);
}

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

ومع ذلك، إذا حاولت تنفيذ أساليب مصفوفة نوع مستقلة، مثل النظام reverse() قد تجد أيضا أن التنفيذ الخاص بك هو أسرع. على الأقل الألغام.

لماذا ا؟

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

رائع.

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

هناك، قلت ذلك.

حاليا، قد يتم تشغيل رمز المستخدم بشكل أسرع ثم التنفيذ الأصلي، إسبسيالي منذ مبرمج يعرف ما تدفق البيانات في ذلك. ولكن هذا يمكن أن يكون مؤقتا.

سوف أتوقف هنا وتتيح لك أن تقرر ما إذا كنت ترغب في إنشاء مكتبة مجموعة الخاصة بك. ؛)


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

يمكن أن يكون مشكلة تحسين الخطأ، التي يمكن حلها إذا كان صحيحا ... نأمل شخص في فايرفوكس ديف يمكن الإجابة على هذا :)







sorting