为什么这段代码的执行速度如此不同?

Ste*_*ins 3 javascript jquery

Internet Explorer 7中,此代码在47毫秒内始终如一地执行:

function updateObjectValues() {    
    $('.objects').html(12345678); // ~500 DIVs
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码在157毫秒内始终如一地执行:

function updateObjectValues() {
    $('.objects').html('12345678'); // ~500 DIVs
}
Run Code Online (Sandbox Code Playgroud)

传递数字比字符串快3倍.为什么这些结果如此显着不同?而且,有没有办法帮助字符串的性能?

T.J*_*der 9

如果你看一下jQuery的源代码(甚至unminified生产版本),你将看到if (typeof value === "string" ...的代码分支是显著比最终更复杂else,当你在一些传将发生版本.

这是1.4.4代码,如果值是一个字符串:

} else if ( typeof value === "string" && !rnocache.test( value ) &&
    (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
    !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {

    value = value.replace(rxhtmlTag, "<$1></$2>");

    try {
        for ( var i = 0, l = this.length; i < l; i++ ) {
            // Remove element nodes and prevent memory leaks
            if ( this[i].nodeType === 1 ) {
                jQuery.cleanData( this[i].getElementsByTagName("*") );
                this[i].innerHTML = value;
            }
        }

    // If using innerHTML throws an exception, use the fallback method
    } catch(e) {
        this.empty().append( value );
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是数字的作用:

} else {
    this.empty().append( value );
}
Run Code Online (Sandbox Code Playgroud)

显然,所有这些额外的检查和函数调用的开销加起来.我的意思是,即使只是在if顶部的语句中,有三个正则表达式测试,一个地图查找,一个字符串被小写 - 这是在我们进入语句的主体之前(如果我们这样做,也许是检查返回false),它涉及进一步的正则表达式(作为参数化替换的一部分)和循环...

  • +1挖掘深入并以科学的方式做;) (3认同)