Подтвердить что ты не робот

Когда использовать Float32Array вместо Array в JavaScript

Когда имеет смысл использовать Float32Array вместо стандартного JavaScript Array для приложений браузера?

В этом тесте показано, что Float32Array будет, в общем, медленнее - и если я правильно понимаю, стандартный Array хранит числа как 64 бит - поэтому точность не имеет.

Помимо любого возможного повышения производительности, Float32Array также имеет недостаток читаемости - необходимость использования конструктора:

a = new Float32Array(2);
a[0] = 3.5;
a[1] = 4.5;

вместо массива литерал

a = [3.5, 4.5];

Я спрашиваю об этом, потому что я использую библиотеку glMatrix, которая по умолчанию имеет значение Float32Array, и задаюсь вопросом, есть ли какая-то причина, из-за которой я не должен принуждать ее использовать Array, а это позволит мне использовать литералы массива.

4b9b3361

Ответ 1

Я отправил по электронной почте разработчику glMatrix, и мой ответ ниже содержит его комментарии (пункты 2 и 3):

  • Создание нового объекта обычно быстрее с Array, чем Float32Array. Коэффициент усиления значим для небольших массивов, но меньше (зависит от среды) с большими массивами.

  • Доступ к данным из TypedArray (например, Float32Array) часто происходит быстрее, чем из обычного массива, что означает, что большинство операций с массивами (помимо создания нового объекта) быстрее с помощью TypedArrays.

  • Как также указано @emidander, glMatrix был разработан в основном для WebGL, который требует, чтобы векторы и матрицы были переданы как Float32Array. Таким образом, для приложения WebGL потенциально дорогостоящее преобразование с Array в Float32Array должно быть включено в любое измерение производительности.

Итак, неудивительно, что лучший выбор зависит от приложения:

  • Если массивы обычно малы и/или количество операций на них низкое, так что время конструктора является значительной частью срока службы массива, используйте Array.

  • Если читаемость кода важна как производительность, используйте Array (т.е. используйте [] вместо конструктора).

  • Если массивы очень большие и/или используются для многих операций, используйте TypedArray.

  • Для приложений WebGL (или других приложений, которые в противном случае требовали бы преобразования типов), используйте Float32Array (или другой TypedArray).

Ответ 2

Я бы предположил, что библиотека glMatrix использует Float32Array, потому что она в основном используется в WebGL-приложениях, где матрицы представлены как Float32Arrays (http://www.khronos.org/registry/webgl/specs/1.0/#5.14.10).