O que é mais rápido? Executando uma função vazia ou verificando se a função está indefinida? [fechadas]

Eu estava escrevendo algum código onde uma função sendo passada como um argumento pode ser indefinida. Sendo curioso sobre isso como 'prática' ruim, eu me perguntei o que é realmente mais rápido? Dando uma função vazia, ou tendo a função verificar se o argumento estava indefinido?

Eu fiz o seguinte teste para tentar. A resposta foi muito surpreendente!

var timesTest = 1000;

function empty(){}
console.time('running an empty function');
for( var i=0; i<timesTest; i++ ){
  empty();
}
console.timeEnd('running an empty function');

var somethingthatdoesnotexist;
console.time('checking if a function exists');
for( var i=0; i<timesTest; i++ ){
  if( somethingthatdoesnotexist ){
    somethingthatdoesnotexist();
  }
}
console.timeEnd('checking if a function exists');

// results:
// running an empty function: 0.103ms
// checking if a function exists: 0.036ms

Em números baixos, a verificação de argumentos indefinidos é muito mais rápida.

As coisas ficam interessantes quando os tempos testados aumentam.

// var timesTest = 100000;
// results:
// running an empty function: 1.125ms
// checking if a function exists: 1.276ms 

e

// results:
// var timesTest = 1000000000;
// running an empty function: 2096.941ms
// checking if a function exists: 2452.922ms 

Conforme o número de testes aumenta, a execução de uma função em branco torna-se um pouco mais rápida por uma margem.

Eu não tentei traçar isso em um gráfico ainda, mas estou curioso para esse comportamento. Alguém sabe por que isso é? Como isso afeta as coisas no código do mundo real?

questionAnswers(1)

yourAnswerToTheQuestion