Js медленнее в Photoshop, чем в Chrome.Могу ли я сделать две петли быстрее? - PullRequest
0 голосов
/ 22 ноября 2018

Следующий код генерирует случайные точки (x, y), а затем для каждой точки разбивает холст (один квадрат) на четыре.Со следующей точкой в ​​итерации он ищет квадрат, в котором находится точка, и разбивает ее на четыре меньших квадрата - до определенного размера квадрата.

Проблема в том, что он очень быстрый в Chrome и очень медленный в Ps (для 11k очков это занимает 2 секунды в Chrome и 30 минут в Ps! Для 1k очков это занимает около 10 секунд в Ps.

Есть ли что-нибудь лучше переписать на это? Кстати, Ps не поддерживает ES5

var squares = [];
var canvaswidth = app.activeDocument.width.as("px");
var canvasheight = app.activeDocument.height.as("px");
squares.push([{
    x: 0,
    y: 0
}, {
    x: canvaswidth,
    y: 0
}, {
    x: canvaswidth,
    y: canvasheight
}, {
    x: 0,
    y: canvasheight
}])
vertices = [];
for (i = 0; i < 8000; i++) {
    vertices.push({
        x: Math.floor(Math.random() * canvaswidth),
        y: Math.floor(Math.random() * canvasheight)
    })
}
var t0 = new Date().getTime();
var minsquaresize = 24;
for (v = 0; v < vertices.length; v++) {
    if (v > 0 && Math.abs(vertices[v].x - vertices[v - 1].x) > minsquaresize && Math.abs(vertices[v].y - vertices[v - 1].y) > minsquaresize) {
        r = 2;

           for (s = 0; s < squares.length; s++) {

            var squares_s = squares[s];
            if (squares_s != undefined && vertices[v].x >= squares_s[0].x && vertices[v].x <= squares_s[2].x && vertices[v].y >= squares_s[0].y && vertices[v].y <= squares_s[2].y && squares_s[1].x - squares_s[0].x > minsquaresize && squares_s[3].y - squares_s[0].y > minsquaresize) {
                var s1p1 = {
                    x: Math.round(squares_s[0].x),
                    y: Math.round(squares_s[0].y)
                };
                var s1p2 = {
                    x: Math.round((squares_s[0].x + squares_s[1].x) / 2),
                    y: Math.round((squares_s[0].y + squares_s[1].y) / 2)
                };
                var s1p3 = {
                    x: Math.round(((squares_s[1].x - squares_s[0].x) / r) + squares_s[0].x),
                    y: Math.round(((squares_s[3].y - squares_s[0].y) / r) + squares_s[0].y)
                }
                var s1p4 = {
                    x: (squares_s[0].x + squares_s[3].x) / 2,
                    y: Math.round((squares_s[0].y + squares_s[3].y) / 2)
                }
                var s2p2 = {
                    x: squares_s[1].x,
                    y: squares_s[1].y
                }
                var s2p3 = {
                    x: Math.round((squares_s[1].x + squares_s[2].x) / 2),
                    y: Math.round((squares_s[1].y + squares_s[2].y) / 2)
                }
                var s3p3 = {
                    x: squares_s[2].x,
                    y: squares_s[2].y
                }
                var s3p4 = {
                    x: Math.round((squares_s[2].x + squares_s[3].x) / 2),
                    y: Math.round(Math.round((squares_s[2].y + squares_s[3].y) / 2))
                }
                var s4p4 = {
                    x: squares_s[3].x,
                    y: squares_s[3].y
                }
                //alert(s4p4.y)
                delete squares[s];
                squares.push([s1p1, s1p2, s1p3, s1p4])
                squares.push([s1p2, s2p2, s2p3, s1p3])
                squares.push([s1p3, s2p3, s3p3, s3p4])
                squares.push([s1p4, s1p3, s3p4, s4p4])
                break;
            }
        }
    }
}
var t1 = new Date().getTime() - t0;
alert("time: "+t1)

1 Ответ

0 голосов
/ 22 ноября 2018

Управлял значительным увеличением производительности за счет зацикливания квадратов в обратном порядке.Так обычно это было:

for(vertices length, v++){
 for(squares length, s++){
   if vertex is within square then delete square from square array, split square into 4 equal squares and add them to array
 }
}

Вершины собираются из пути, поэтому вершина 4, вероятно, будет близка к вершине 3, поэтому, вероятно, в области последних квадратов, созданных из вершины 3 - в концемассив квадратов.Итак:

for(var s = squares.length; s--;){...}

Это работает намного быстрее (возможно, в 10 раз).Странно, что это также быстрее со случайно расположенными вершинами.

...