这一行Javascript代码的性能提升
Performance enhancement of this one line of Javascript code
el.style.top = document.body.scrollTop + 'px';
我正在使用它来锁定某些 TH 元素的垂直滚动。
这行代码似乎具有指数级的运行时复杂度。当我锁定 10 个元素时,它工作得很好。 30 个元素,它仍然有响应,但非常糟糕。 60个元素,就没反应了
以防万一你想知道。不,我没有重复调用它。每次滚动恰好调用 3 次。
已解决:问题出在 document.body.scrollTop。在尝试使用预先计算的值在页面上下滚动元素后,它是平滑的,但是当将虚拟调用添加到同一函数时,它变得没有响应。
我会使用 CSS:
table {
border-collapse: collapse;
}
th {
position: sticky;
top: 0;
background-color: red;
color: white;
outline: solid 1px white;
padding: 5px;
}
td {
border: solid 1px black;
text-align: center;
}
<table>
<thead>
<tr>
<th>header column 1</th>
<th>header column 2</th>
<th>header column 3</th>
<th>header column 4</th>
<th>header column 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
</tbody>
</table>
根据您的 style.top
分配的影响以及浏览器呈现引擎的工作方式,每个 access to .scrollTop
might trigger a reflow。所以你应该在遍历你的元素之前只访问它一次并将它存储在一个变量中:
const { scrollTop } = document.body;
for (const el of els) {
el.style.top = scrollTop + 'px';
}
el.style.top = document.body.scrollTop + 'px';
我正在使用它来锁定某些 TH 元素的垂直滚动。 这行代码似乎具有指数级的运行时复杂度。当我锁定 10 个元素时,它工作得很好。 30 个元素,它仍然有响应,但非常糟糕。 60个元素,就没反应了
以防万一你想知道。不,我没有重复调用它。每次滚动恰好调用 3 次。
已解决:问题出在 document.body.scrollTop。在尝试使用预先计算的值在页面上下滚动元素后,它是平滑的,但是当将虚拟调用添加到同一函数时,它变得没有响应。
我会使用 CSS:
table {
border-collapse: collapse;
}
th {
position: sticky;
top: 0;
background-color: red;
color: white;
outline: solid 1px white;
padding: 5px;
}
td {
border: solid 1px black;
text-align: center;
}
<table>
<thead>
<tr>
<th>header column 1</th>
<th>header column 2</th>
<th>header column 3</th>
<th>header column 4</th>
<th>header column 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
<tr>
<td>data column 1</td>
<td>data column 2</td>
<td>data column 3</td>
<td>data column 4</td>
<td>data column 5</td>
</tr>
</tbody>
</table>
根据您的 style.top
分配的影响以及浏览器呈现引擎的工作方式,每个 access to .scrollTop
might trigger a reflow。所以你应该在遍历你的元素之前只访问它一次并将它存储在一个变量中:
const { scrollTop } = document.body;
for (const el of els) {
el.style.top = scrollTop + 'px';
}