Pull to refresh

Comments 20

Кстати, данные Canvas хранятся именно в Int32Array. Уверен, что их ещё будут оптимизировать.
Что будет, если передать неправильный тип?
Как ни странно не вылетит с ошибкой, просто не произойдет присвоения.
a = new Uint8Array(3);
a[1] = 'asdasdsad';
a == {0:0, 1:0, 2:0}
Проверил. На самом деле — присвоится нуль
a = new Uint8Array(3);
a[1] = 4;
a[1] = 'asdasdsad';
console.log( a ); // 0,0,0
Нда, действительно, сам себя запутал, не подумал проверить на более сложном примере.
Не совсем так. В WebGL используются правила конвертации типов из ECMA-262 (пункт 3 — Type Conversion Rules в спеке WebGL).
И, например, для Float32Array строчка будет конвертироваться в NaN:

ar = new Float32Array(1);
ar [0] = 'asdasdsad';
console.log( a[0] ); // NaN
Попробуйте использовать метод subarray() на типизированном массиве, возможно, результаты теста окажутся другими.
извиняюсь, проглядел по ошибке, виноват. Все ок.
интересно, зачем придумывать свой собственный синтаксис, почему не использовать устоявшиеся
int[]
long[]
и т.д.
UFO just landed and posted this here
С таким синтаксисом, объект Uint8Array можно вполне реализовать как function Uint8Array(n) для случая если браузер не поддерживает его нативно.
Жаль, что Вы не описали использование типизированных массивов в качестве представления для ArrayBuffer.
UFO just landed and posted this here
на этом сайте выложены тесты для сравнения производительности встроенных массивов JS против TypedArray (создание, заполнение и т.п.) в различных браузерах
UFO just landed and posted this here
«Аналог в C»

Только char'ы имеют четко один байт, остальные из списка могут иметь отличные от приведенных в таблице значения.
Например sizeof(int) = 2 байта, или sizeof(double) = 10 байт, ну и так далее.
Зависит от платформы и от компилятора.
да, корректнее было бы использовать uint8_t и компанию из stdint.h
Сравнение не совсем корректное:
В случае с Uint8Array вы создаете сразу массив с определенным количеством элементов.

В случае с нативным Array вы создаете массив нулевого размера и потом, по сути, увеличиваете его размер, что медленнее если определить размер массива сразу: a = new Array(size);
Нет, вы ошибаетесь, в обычных массивах нет контроля границ так что компилятору/интерпретатору все равно нужно выделять больше памяти
Круто!
Интересно только — в какой версии IE они появятся…
Подскажите, пожалуйста, у меня вот этот вариант приблизительно на 600 мс быстрее работает

var ss = [];

ss[0] = [];
ss[1] = [];
ss[2] = [];

for(var i = 0; i<10000000;i++)
{
	
	ss[0] = 0;
	ss[1] = 1;
	ss[2] = 5;
}

	ss[0] = 0.0;
	ss[1] = 1.0;
	ss[2] = 5.0;

var dt01 = new Date().getTime();

for(var i = 0; i<10000000;i++)
{
	ss[0][i] = 5.0 + ss[1][i] ;
	ss[1][i] = ss[0][i] + ss[2][i] * 3.0; 

}

var dt02 = new Date().getTime();

alert(dt02 - dt01);


По сравнению с

var ss = new Float32Array[];

	ss[0] = 0.0;
	ss[1] = 1.0;
	ss[2] = 5.0;

var dt01 = new Date().getTime();

for(var i = 0; i<10000000;i++)
{
	ss[0][i] = 5.0 + ss[1][i] ;
	ss[1][i] = ss[0][i] + ss[2][i] * 3.0; 

}

var dt02 = new Date().getTime();

alert(dt02 - dt01);


Sign up to leave a comment.

Articles