2015-03-19 2 views
1

Я работаю над модулем Javascript, который принимает функцию и в более поздней точке позволяет вам назвать ее, в отличие от currying. Я заметил, что NodeJS переключился с использования .apply() на использование оператора switch, как показано ниже.Что такое эффективный способ вызова функции с переменными аргументами?

function applyFn(fn, args, ctx) { 
    switch (args.length) { 
     case 0: return fn.call(ctx); break; 
     case 1: return fn.call(ctx, args[0]); break; 
     case 2: return fn.call(ctx, args[0], args[1]); break; 
     case 3: return fn.call(ctx, args[0], args[1], args[2]); break; 
     default: return fn.apply(ctx, args); 
    } 
} 

Является ли приведенный выше пример лучше, чем эта версия ниже?

function applyFn(fn, args, ctx) { 
    if (4 in args) return fn.apply(ctx, args); 
    if (3 in args) return fn.call(ctx, args[0], args[1], args[2], args[3]); 
    if (2 in args) return fn.call(ctx, args[0], args[1], args[2]); 
    if (1 in args) return fn.call(ctx, args[0], args[1]); 
    if (0 in args) return fn.call(ctx, args[0]); 
    return fn.call(ctx); // ಠ_ಠ 
} 

Какая версия имеет лучшую производительность?

EDIT: Вот как я использую его: named-parameters.js

+1

Почему бы не 'call()' напрямую? Как насчет этих 'if' и' switch'? – DontVoteMeDown

+5

Это похоже на микро-оптимизацию. –

+0

Это довольно странно. Вы думаете, что V8 будет достаточно умным, чтобы сделать это сам. –

ответ

0

Я понимаю, что это своего рода микро-оптимизации, но так как мой модуль делает только одну вещь, которую я хочу, чтобы убедиться, что он делает это хорошо.

Я обработал тест здесь: http://jsperf.com/switch-vs-case-function-call

switch определенно выглядит победителем как для 4 и 1 ARG вызовов.

+0

Не забудьте принять ваш ответ :-) – Bergi

Смежные вопросы