«Переход» от нулевого объекта, похоже, не влияет на производительность - PullRequest
0 голосов
/ 22 октября 2011

Я пытался , чтобы лучше понять, почему человек должен (или не должен) наследовать от объекта (var o = Object.create(null);). Если я правильно понял ответ, соображения производительности, казалось, были основной жизнеспособной причиной для «наследования» от нуля.

Итак, я хотел проверить это (используя небольшой, удобный и симпатичный профилировщик под названием JSLitmus ):

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Title</title>

    <script src="JSLitmus.js"></script>
    <script>
    JSLitmus.test('Prototypeless test', function() {
        var o1 = Object.create(null);
        o1.foo = "bar";
        for (i = 0; i < 1000000; ++i) {
          o1.foo;
        };
    });

    JSLitmus.test('Prototypeful test', function() {
        var o2 = {};
        o2.foo = "bar";
        for (i = 0; i < 1000000; ++i) {
          o2.foo;
        };
    });

    </script>

</head>
<body>
</body>
</html>

При выполнении я получаю одинаковые (противоречивые) результаты. Означает ли это, что при наследовании от Object нет потери производительности?

Ответы [ 2 ]

0 голосов
/ 22 октября 2011

Я пересмотрел свой собственный код и немного изменил код, чтобы сделать поиск поля foo для распространения по цепочке «наследования»:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Title</title>

    <script src="JSLitmus.js"></script>
    <script>
    var o1 = Object.create(null);
    o1.foo = "bar";

    var o2 = Object.create(o1);

    var count;

    JSLitmus.test('Prototypeless test', function() {
        while(--count) {
          o1.foo;
        };
    });

    JSLitmus.test('Prototypeful test', function() {
        while(--count) {
          o2.foo;
        };
    });

    </script>

</head>
<body>
</body>
</html>

Таким образом, у меня есть 10% лучший результат при доступе к свойству o1.

0 голосов
/ 22 октября 2011

Да, нет штрафа за производительность.

С чего бы это? У него нет чека [[Prototype]], потому что foo является собственным свойством o.

Причина, по которой вы хотите унаследовать от null, заключается в создании собственных цепочек прототипов. Это просто позволяет вам контролировать.

В общем, вы бы хотели наследовать от Object.prototype, потому что методы на нем полезны и почти весь вид кода "предполагает", что каждая вещь наследует от него.

Однако вы можете просто создать свою собственную цепочку со специальной логикой

var newObject = Object.make(null,{
  toString: function  () { return "foobar"; },
  valueOf: function () { return 42;  }
});

Для некоторого значения Object.make

А потом просто создайте экземпляры этого

var o = Object.create(newObject);
console.log(o + 3);
console.log("foo" + o);

Живой пример .

Если вы действительно хотите иметь детализированный пользовательский элемент управления .valueOf и другие методы, тогда действительно имеет смысл не наследовать от Object.prototype для целей отладки (то есть не случайно использовать методы Object.prototype вместо ваших собственных) .

Кроме того, я не думаю, что есть реальный вариант использования для этого. Это может быть немного быстрее или занимать немного меньше памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...