Как и в вашем примере, я протестировал следующее, используя console.time()
.Похоже, что ваш push
добавляет около 10% ко времени, тогда как ваш attr
вызов почти удваивает процесс.Например:
for (var i = 0; i < 4200; i++ ) {
labels.push(paper.text(0, i * 10, 'my text'));
}
Результат:
labels: 3452ms
attr: 2455ms
Где, когда мы удалили вызовы attr:
for (var i = 0; i < 4200; i++ ) {
paper.text(0, i * 10, 'my text');
}
Результат:
labels: 3011ms
attr: 0ms
Выполнение этой цепочки мало влияет на производительность.
for (var i = 0; i < 4200; i++ ) {
labels.push(paper.text(0, i * 10, 'my text').attr({'font-size':10}));
}
В результате:
draw: 5759ms
Далее мы проанализировали количество символов в строке, чтобы определить, есть лиявляется любой прямой корреляцией между количеством нарисованных символов и прошедшим временем.
paper.text(5, i * 10, '0');
привело к времени draw: 2974ms
paper.text(5, i * 10, 'texttexttexttexttexttexttexttexttexttexttexttext');
, в результате ко времени draw: 3122ms
, котороеnegligable.
Теперь давайте попробуем тот случай, о котором вы говорили, с прямоугольниками.Позволяет рисовать одинаковое количество, используя одинаковое позиционирование, и изменять только несколько атрибутов, которые не влияют на время рендеринга (ширина и высота)
for (var i = 0; i < 4200; i++ ) {
paper.rect(5, i * 10, 50, 50);
}
Результат:
draw: 333ms
Какцифры показывают, я полагаю, это потому, что мы рисуем векторы с невероятно более сложными кривыми.Формула квадрата вектора будет экспоненциально короче, и ее будет легче вычислить, чем последовательность букв и их кривые.