【发布时间】:2011-06-01 05:11:52
【问题描述】:
我有一个平均需要 250 毫秒才能完成的函数。我想在更短的时间内做到这一点,如果可以的话,
function updateDisplay() {
var start = new Date().getTime();
var $this = $(this);
var data = $this.data('ansi');
var html = '';
for (var i = 0; i < data.screen.length; i++) {
for (var j = 0; j < data.screen[i].length; j++) {
html += data.screen[i][j];
}
html += '<br />';
}
var create = new Date().getTime();
console.log('Build html: ' + (create-start));
$this.html(html);
var end = new Date().getTime();
console.log('Update html: ' +(end-create));
}
我在setInterval 一侧调用此函数来更新我的显示,构建 html 字符串的时间为每帧 0 毫秒到 1 毫秒,但更新 html 的时间为 100 毫秒到 300 毫秒。有没有办法让它更快?
呸,打开 chrome 检查器来观看控制台会增加巨大的延迟 这是我目前的功能(如果来自 CD Sanchez,基本上是一个下降)。在没有检查器打开的情况下,更新 html 的运行时间约为 50 毫秒。这要好得多,但如果可以的话,我希望将其缩短到
function updateDisplay() {
var start = new Date().getTime();
var $this = $(this);
var data = $this.data('ansi');
var html = Array();
for (var i = 0, length1 = data.screen.length; i < length1; ++i) {
var a = data.screen[i]; // cache object
for (var j = 0, length2 = a.length; j < length2; ++j) {
html.push(a[j]); // push to array
}
html.push('<br />');
}
var create = new Date().getTime();
this.innerHTML = html.join(''); // use innerHTML
var end = new Date().getTime();
$('#debug').html('Build html: ' + (create-start) + '<br/>Update html: ' + (end-create));
}
html 的示例值 - 第一行,直到 <br>
<span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;">┌</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">─</span><span style="background-color:#000000;color:#ffffff;">┐</span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><span style="background-color:#000000;color:#ffffff;"> </span><br>
示例 - here,目前仅在 chrome 中进行了测试。在 IE 中工作的已知结...
更新 我已将我的代码转换为使用画布并直接绘制到该画布上。我不确定我是否以最好的方式做这件事,因为这是我第一次使用画布。就目前而言,我在 20 毫秒左右。这是我最满意的上限,不过 10 毫秒会好得多。
我不确定是否可以在样式中定义前景色和背景色并删除fillRect 调用,如果可以的话,这会加快速度。另一个问题是字体看起来不像纯 html 那样清晰,不确定我是否可以解决这个问题。上面链接的示例已更新。
function updateDisplay() {
var start = new Date().getTime();
var $this = $(this);
var data = $this.data('ansi');
for (var i = 0, length1 = data.screen.length; i < length1; ++i) {
var a = data.screen[i]; // cache object
for (var j = 0, length2 = a.length; j < length2; ++j) {
data.ctx.fillStyle = a[j][0];
data.ctx.fillRect (8*j, 14 * i, 8, 14);
data.ctx.fillStyle = a[j][1];
data.ctx.fillText(a[j][2], 8*j, 14 * i);
}
}
var end = new Date().getTime();
$('#debug').html('Frame Time: ' + (end-start));
}
上次更新
ctx.fillText 对于我的目的来说非常慢且不够准确。我将自己的字体定义为 8x16 数组,并使用ctx.fillRect 绘制每个像素。这要快得多,并且可以处理它接缝的字体子系统。
【问题讨论】:
-
你试过
this.innerHTML = html- 可能会快一点。 -
@CD Sanchez - 增加不多,我现在看到的是 100-250 毫秒。如果它有所不同,则 html 是一堆
spans,每个都有一个字符。 -
您是否尝试过使用 Firebug 分析器?它可能会指出一些需要很长时间才能执行的区域。
-
@Justin808:嗯,我认为您测量的大部分时间都花在了 HTML 引擎渲染标记上(这可能非常复杂,具体取决于您的数据集有多大)。我真的想不出你可以用 JavaScript 做些什么来大大缩短时间。
-
如果没有看到传递给
html()的实际字符串,很难在这里说任何有用的东西。给定一个测试用例,应该不难看出时间花在了哪里,但是……至少在某些浏览器上是这样。
标签: javascript jquery optimization