Я работаю над определенным проектом в Processing JS, в котором у меня есть функция проецирования точек из 3D на экран с использованием изометрической проекции.
var xy = function(x, y, z) {
return {
x: 300 + cos(30) * x + cos(30 + 120) * z;
y: 300 + sin(30) * x + sin(30 + 120) * z - y;
};
};
Чтобы построить точку, я бы сделал
var p = xy(10, 20, 30); // 10, 20, and 30 being the x, y, and z values respectively
point(p.x, p.y);
Эта функция вызывается много и много времени для кадра, поэтому я хочу быть эффективным. Однажды кто-то сказал мне, что когда я делаю
return {
x: ...
y: ...
};
создает новый объект в памяти каждый раз, когда вызывается функция. Вместо этого он сказал, чтобы сделать функцию, как это
var p = {x:0,y:0};
var xy = function(x, y, z) {
p.x = 300 + cos(30) * x + cos(30 + 120) * z;
p.y = 300 + sin(30) * x + sin(30 + 120) * z - y;
};
и для построения точки сделайте
xy(10, 20, 30);
point(p.x, p.y);
теперь все хорошо, если я сохраняю память, но она работала без особых задержек, когда я использовал старый метод, но я думаю, что новый метод с переназначением переменных казался более запаздывающим, а также Safari не делал всплывающее окно «Эта веб-страница использует значительное количество памяти. Закрытие может повысить производительность вашего Mac». но для нового метода это действительно: «Эта веб-страница использует значительную энергию. Закрытие может улучшить производительность вашего Mac». (JK сказал, что он использует значительную энергию для обоих, но я думаю, что новый метод показался мне более медленным)
так что в основном мой вопрос:
что хуже
var xy = function() {
return {key:"val"};
};
// do it lots of times nonstop
setInterval(function(){for (var i=0; i<amillion; i++) {xy();}}, 1000);
или
var p = {key:"val"};
var xy = function() {
p.key = "val";
};
// do it lots of times nonstop
setInterval(function(){for (var i=0; i<amillion; i++) {xy();}}, 1000);