У меня есть числовой двумерный массив (массив массивов или матрица), и мне нужно выполнять простые матричные операции, такие как добавление значения к каждой строке или умножение каждого значения на одно число. У меня мало опыта с математическими операциями в JavaScript
, так что это может быть фрагмент кода с костяком. Это также очень медленно, и мне нужно использовать его, когда количество столбцов составляет 10 000–30 000. Под очень медленным я подразумеваю примерно 500 мс для обработки строки из 2000 значений. облом.
var ran2Darray = function(row, col){
var res = [];
for (var i = 0 ; i < row; i++) {
res[i] = [];
for (var j = 0; j < col; j++) {
res[i][j] = Math.random();
}
}
return res;
}
var myArray = ran2Darray(5, 100);
var offset = 2;
for (i = 0; i < myArray.length; i++) {
aRow = myArray[i];
st = Date.now();
aRow.map(function addNumber(offset) {myArray[i] + offset*i; })
end = Date.now();
document.write(end - st);
document.write("</br>");
myArray[i] = aRow;
}
Я хочу избежать каких-либо добавленных библиотек или фреймворков, если, конечно, это не единственный вариант. Можно ли сделать этот код быстрее или есть другое направление, в котором я могу пойти, например, передать вычисление другому языку? Я просто не знаю, как люди решают подобные проблемы. Кстати, forEach
работает примерно так же.
2 ответа
Хорошо, просто небольшая модификация и исправление ошибки в том, что вы здесь представили.
function addNumber(offset) {myArray[i] + offset*i; }) is not good.
MyArray[i] - это первое измерение двумерного массива, зачем к нему что-то добавлять?
function ran2Darray (row, col) {
var res = [];
for (var i = 0 ; i < row; i++) {
res[i] = [];
for (var j = 0; j < col; j++) {
res[i][j] = Math.random();
}
}
return res;
}
var oneMillion = 1000000;
var myArray = ran2Darray(10, oneMillion);
var offset = 2;
var startTime, endTime;
for (i = 0; i < myArray.length; i++) {
startTime = Date.now();
myArray[i] = myArray[i].map(function (offset) {
return (offset + i) * offset;
});
endTime = Date.now();
document.write(endTime - startTime);
document.write("</br>");
}
Попытайся. Это очень быстро https://jsfiddle.net/itaymer/8ttvzyx7/
Вам не нужно переписывать элементы массива несколько раз. .map()
возвращает новый массив, поэтому просто присвойте его текущему индексу:
var myArray = ran2Darray(5, 100000);
var offset = 2;
var performOperation = function(value, idx) {
return value += offset * idx;
}
for (i = 0; i < myArray.length; i++) {
console.time(i);
myArray[i] = myArray[i].map(performOperation)
console.timeEnd(i);
}
Обработка занимает около 20 мс.
Демонстрация Fiddle (открытая консоль)
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.
Array.map
, а такжеforEach
вызывают функцию для каждого элемента. Попробуйте заменить это циклом for.JavaScript
. На моем обычном языке,R
, такие вещи очень оптимизированы, и версия с отображением обычно быстрее. Я переписал его, чтобы использовать 2 индекса, и для матрицы 5 x 50000 это заняло 7 мс. Ответ от @Artyom занял 47 мс (но я узнал несколько вещей из этого ответа).