Макет памяти в Javascript - ориентированный на данные vs объектно-ориентированный дизайн [закрыт]

StackOverflow https://stackoverflow.com//questions/25041236

Вопрос

Исходя из опыта работы с C / C ++, расположение объектов в памяти с точки зрения уменьшения пропусков в кэше является чем-то решающим, особенно при работе на консолях.Дизайну, ориентированному на данные, часто отдается предпочтение перед объектно-ориентированным дизайном, чтобы помочь сохранить связанные объекты близко друг к другу в памяти (особенно в областях, критичных к производительности).

Недавно я немного занимался разработкой Javascript, и мне интересно, каков общий консенсус в сообществе Javascript.

С моим ограниченным опытом работы с Javascript я часто был удивлен, видя совершенно неожиданные результаты при профилировании.Расположение внутренней памяти и реализация объектов / структур Javascript настолько сильно различаются от браузера к браузеру, что я задаюсь вопросом, стоит ли пытаться оптимизировать.

Я создал простой тестовый пример (http://jsperf.com/object-vs-data) в jsPerf для сравнения производительности двух методов, и хотя он показывает прирост производительности в Chrome, в Safari заметного ускорения нет.

В Javascript, должен ли я вообще беспокоиться о расположении объектов в памяти?Или это скорее что-то типа "внедрите это одним способом, а затем оптимизируйте при необходимости"?

Этот второй вариант кажется несколько расточительным (с точки зрения времени разработки), особенно если есть какое-то хорошее руководство, которому нужно следовать.

Спасибо ~

Дополнительная информация:По сути, это то, как я бы реализовал эти два подхода в Javascript.Приведенный выше тестовый пример jsPerf реализован следующим образом.

var objectOriented = [
    { foo: 1, bar: 2 },
    { foo: 3, bar: 4 }
];

var dataOriented = {
    foos: [1, 3],
    bars: [2, 4]
};

// Object-oriented access:
var a = objectOriented[0].bar;

// Data-oriented access:
var b = dataOriented.bars[0];
Это было полезно?

Решение

Вы работаете из фундаментального предположения, что объекты в JavaScript работают как в C ++. Они не.

в C ++, основная цель типа заключается в том, чтобы выступать в качестве «объектива» над ломкой памяти. Макет класса напрямую определяет содержимое памяти, которую объект описывает, в четко определенном способе. Массивы C / C ++ специально требуют линейного, непрерывного расположения однородных типов.

В JavaScript объект представляет собой коллекцию пар имени / значения. Массив - это просто объект со специальной «длиной» свойством. Обратите внимание, что здесь нет описания или определения макета памяти здесь. Нет ничего остановки интерпретатора JavaScript от реализации массивов в качестве хеш-таблица, а не линейного куска памяти; На самом деле, я уверен, что они реализованы JS, которые делают только что.

Реализации JavaScript свободно выкладывать память, однако они хотят, и нет переписки между тем, что вы делаете в источнике, и что на самом деле заканчивается в машине.

Кроме того, массивы JavaScript являются неоднородными, не однородными. То есть, предполагая, что он был выложен в непрерывной памяти, ваш эквивалентный тип в C будет JSObject **, не int ** (или плавать ** или что-то еще). Array JS - это набор ссылок на данные, хранящиеся в другом месте, поэтому, даже если ссылки были в вашей строке кэша, ваши данные не будут.

Так, в итоге - такое мышление наберет вас, кроме боли. JavaScript - это гораздо более высокий уровень языка, чем C ++, а часть этого отказывается от контроля, который вы используются. Такой вид оптимизации низкой уровня, если это возможно, будет сделано переводчиком. Сосредоточиться на написании кода с эффективными алгоритмами, которые естественным образом выражают ваше решение; Это достаточно сложно, как есть. : -)

Другие советы

ОК.Повозился с некоторыми цифрами и тестовыми примерами..

Во-первых, я создал этот тестовый пример http://jsperf.com/object-vs-array-creation-for-so В этом случае создание Object является намного быстрее затем создается Array

Во-вторых, я создал этот тестовый пример http://jsperf.com/accessing-speed В этом между ними почти не было никакой разницы..

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

Но..

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

Тестирование в Chrome 36.0.1985.125 на Windows NT 6.3

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top