Por que o Object.create é muito mais lento que um construtor?

fundo

Em um projeto que estou mantendo, fazemos uso extensivo de objetos de protótipo nulo como alternativa aos pobres (apenas chave de cadeia) de Mapas, que não são suportados nativamente em muitos navegadores anteriores ao ES6.

Basicamente, para criar um objeto de protótipo nulo em tempo real, usaria-se:

var foo = Object.create(null);

Isso garante que o novo objeto não tenha propriedades herdadas, como "toString", "construtor", "__proto__" que não são desejáveis para este caso de uso específico.

Como esse padrão aparece várias vezes no código, surgiu a idéia de escrever um construtor que criaria objetos cujo protótipo possui um protótipo nulo e sem propriedades próprias.

var Empty = function () { };
Empty.prototype = Object.create(null);

Em seguida, para criar um objeto sem propriedades próprias ou herdadas, pode-se usar:

var bar = new Empty;
O problema

Em um esforço para melhorar o desempenho, escrevi um teste e descobri que o nativoObject.create inesperadamente, a abordagem executa muito mais lentamente que o método que envolve um construtor extra com um protótipo ad hoc, em todos os navegadores:http://jsperf.com/blank-object-creation.

Ingenuamente, eu esperava que o último método fosse mais lento, pois envolve a invocação de um construtor definido pelo usuário, o que não acontece no primeiro caso.

Qual poderia ser a causa dessa diferença de desempenho?

questionAnswers(4)

yourAnswerToTheQuestion