Каков наиболее эффективный способ обработки точек / малых векторов в JavaScript? - PullRequest
6 голосов
/ 15 января 2011

В настоящее время я создаю веб-приложение (= JavaScript), которое использует много «точек» (= небольшие векторы фиксированного размера). Есть два основных способа их представления:

var pointA = [ xValue, yValue ];

и

var pointB = { x: xValue, y: yValue };

Так что перевод моей точки зрения будет выглядеть примерно так:

var pointAtrans = [ pointA[0] + 3, pointA[1] + 4 ];
var pointBtrans = { x: pointB.x + 3, pointB.y + 4 };

И то, и другое легко обрабатывать с точки зрения программиста (объектный вариант немного более читабелен, тем более, что я в основном имею дело с 2D-данными, редко с 3D и вряд ли с 4D - но никогда больше. всегда вписывается в x, y, z и w)

Но мой вопрос сейчас:
Каков наиболее эффективный способ с точки зрения языка - теоретически и в реальных реализациях?
Каковы требования к памяти?
Какова стоимость установки массива против объекта?
...

Моими целевыми браузерами являются FireFox и основанные на Webkit (Chromium, Safari), но было бы неплохо иметь отличный (= быстрый) опыт в IE и Opera ...

Ответы [ 3 ]

5 голосов
/ 15 января 2011

Массивы создаются быстрее, но если учесть время доступа, то все наоборот.Также обратите внимание, что форма конструктора быстро создается и доступна.Он имеет лучшее из обоих слов в современных реализациях new Vector(x, y) - [ Test ] alt text

Проверенные браузеры: Chrome 10, Firefox 3.6, Firefox Beta 4.0b9, IE 9 Preview 7, Opera 11

1 голос
/ 15 января 2011

Спасибо за все ответы и вклад.Очень интересными были результаты теста, написанного galamalazs: http://jsperf.com/object-vs-array/2

Взяв все аспекты вместе, мы получим:

  • Массивы должны быть проиндексированы числом, а не строкой (arr [0] против arr ['0'])
  • Производительность между формой Object и Array отличается в основном реализацией, а не типом.
  • Победителя нет, он отличается от реализациик реализации
  • Будущие реализации браузеров, известных сегодня, также могут изменить победителя - в любом случае
  • В Chromium массивы будут использовать половину памяти объекта - но мы говорим о 40 МБи 80 МБ на миллион экземпляров - это от 40 до 80 байт каждая.
  • Потребление памяти в других реализациях JavaScript неизвестно, но, скорее всего, оно также будет отличаться от производительности.

Таким образом, в конечном итоге оба варианта разумны, и только читаемость кода примет решение!

Если это в основном для хранения данныхa с тривиальной работой (как в моем текущем проекте) путь объекта - путь.mouse.x и mouse.y тривиально показывают намерение разработчика.

В большинстве приложений с математической ориентацией и векторной математикой, такой как преобразование координат (особенно при переходе в 3D), наилучшим способом будет случай массива, например, умножение матриц.будет выглядеть более родным для разработчика и показать его намерения.

1 голос
/ 15 января 2011

Я догадываюсь, что Arrays даст вам лучшую производительность. (!)

Тем не менее, код уже значительно менее читабелен в вашем примере Array, чем в вашем примере Object.Прибыль, скорее всего, невелика, поэтому я предлагаю вам сделать некоторые базовые тесты по математике и подсчету, чтобы поставить реальное число в обмен.

Для начала вы могли бы

  • Запустите таймер
  • Создайте 1 тысячу случайных [X, Y] Arrays
  • Получите доступ к их полям 1 миллион раз.
  • Повторите с Objects и сравните.

(!) - хороший пример того, почему бенчмаркинг настолько полезен: массивы действительно лучше для создания, но объекты лучше для доступа, что может быть очень важно (в зависимости от ваших потребностей).Галамбалаз написал отличный тест для этого случая: http://jsperf.com/object-vs-array

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