Jus*_*808 6 javascript optimization jquery
我有一个平均需要250毫秒才能完成的功能.我想在更短的时间内完成这项工作,如果我能<10ms,那么<20ms就是最好的.
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));
}
Run Code Online (Sandbox Code Playgroud)
我在a侧调用此函数setInterval来更新我的显示,构建html字符串是每帧0ms到1ms,但更新html是100ms到300ms之间的任何地方.反正有没有让它更快?
Bah,有铬检查员打开观看控制台增加了一个巨大的延迟 这是我目前的功能(基本上是从CD桑切斯下降).没有检查员打开它在大约50ms运行更新html.这要好得多,但如果可以的话,我希望能达到<20ms.
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));
}
Run Code Online (Sandbox Code Playgroud)
html的示例值 - 第1行,最多为<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>
Run Code Online (Sandbox Code Playgroud)
示例 - 此处,目前仅在chrome中测试过.已知在IE中工作的结......
更新 我已将我的代码转换为使用画布并直接绘制到该代码.我不确定我是不是最好的方式,因为它是我第一次使用画布.现在看,我大约20ms.那就是我高兴的地方的上端,但10ms会好得多.
我不确定我是否可以在样式中定义前景色和背景色以及是否删除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));
}
Run Code Online (Sandbox Code Playgroud)
最后更新
ctx.fillText速度很慢,不够准确,不适合我的目的.我已将自己的字体定义为8x16数组,并使用a绘制每个像素ctx.fillRect.这要快得多,并处理它接缝的字体子系统.
这里有一些非常小的优化,我怀疑它们会有多大帮助,但无论如何,你可以这样做:
function updateDisplay() {
var start = new Date().getTime();
var $this = $(this);
var data = $this.data('ansi');
var html = [];
for (var i = 0, length1 = data.screen.length; i < length; ++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();
console.log('Build html: ' + (create-start));
this.innerHTML = html.join(''); // use innerHTML
var end = new Date().getTime();
console.log('Update html: ' +(end-create));
}
Run Code Online (Sandbox Code Playgroud)
当然,这些只是简单的 JavaScript 优化(在较新的浏览器上并不是那么有用)。听起来您需要简化 HTML,可能还需要简化 CSS,以便 HTML 引擎可以更快地呈现它。