首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Chrome的即时功能是,Firefox只需30秒

Chrome的即时功能是,Firefox只需30秒
EN

Stack Overflow用户
提问于 2013-11-21 07:39:51
回答 2查看 540关注 0票数 17

目前,我正在创建一个程序,它将把源代码转换为突出显示的类似HTML的文本。然而,当我测试它时,我发现了一些奇怪的结果。在Chrome上,该程序几乎可以瞬间解析1000行源代码。然而,Firefox需要30秒来解析同样的1000行代码。而且,具有讽刺意味的是,IE10只需要18秒。

现在,我知道不同的浏览器实现javascript的方式是不同的,Chrome往往更快,但我不明白为什么Firefox要花30多倍的时间。我运行了一个10,000,000,000次操作的原始while循环测试,FF和Chrome分别花了14秒和12秒。因此,我倾向于相信我的代码中的某个地方需要Firefox花费异常长的时间才能完成;我已经做了研究,但到目前为止我还没有发现任何可以表明我看到的巨大差异的东西。

那么,有没有人对可能导致这种情况的原因有任何建议?我已经发布了下面代码的问题区域(注释掉这一部分会导致两个浏览器即时解析)。startend都是正则表达式;istream是源代码的来源,ostream是解析后的代码所在的位置。istream.read()调用String slice()方法。最后,这个函数在整个程序中被多次调用。

代码语言:javascript
复制
function(buffer, istream, ostream){
    if(start.test(istream.content)){
        buffer = istream.read();
        ostream.write('[[span class="' + type + '"]]' + buffer);
        do{
            /* Special Cases */
            if(end.test(ostream.content + istream.peek()) && (istream.peek() == "\n" || istream.peek() == " " || istream.peek() == "\t")){
                include = true;
                break;
            }
            else if(istream.peek() == "\n"){
                istream.read();
                ostream.write('[[/span]][[/span]]\n[[span class="line"]][[span class="' + type + '"]]');
                continue;
            }
            else if(istream.peek() == "\t"){
                istream.read();
                ostream.write("@<&#160;&#160;&#160;&#160;>@");
                continue;
            }
            else if(istream.peek() == " "){
                istream.read();
                ostream.write("@<&#160;>@");
                continue;
            }
            ostream.write(istream.read());
        } while(!istream.isEmpty() && !end.test(ostream.content));

        if(include || istream.isEmpty())
            ostream.write('[[/span]]');
        else{
            var ending = ostream.content.length-1;
            while(!end.test(ostream.content.substr(ending)))
                --ending;
            istream.content = ostream.content.substr(ending) + istream.content;
            ostream.content = ostream.content.substring(0, ending) + '[[/span]]';
        }
        return true;
    }
    return false;
}

任何见解都将非常感谢,如果您对如何实现这方面的某些方面有任何疑问,我将竭诚为您效劳。提前谢谢。

istream和ostream对象的定义:

代码语言:javascript
复制
function IOstream(init){
    this.content = init;

    this.read = function(){
        var tmp = this.content.charAt(0);
        this.content = this.content.slice(1);
        return tmp;
    };
    this.peek = function(){  return this.content.charAt(0); };
    this.write = function(str){  this.content += str; };
    this.isEmpty = function(){  return this.content.length == 0; }
}
EN

回答 2

Stack Overflow用户

发布于 2014-09-19 17:20:37

我认为这是因为在每次调用.read()时,都会执行content.slice(1),每次都会复制整个字符串,而不是第一个字符,这可能会花费很多时间。试着像这样修改你的IOStream类:

代码语言:javascript
复制
function IOstream(init){
    this.content = init;
    this.cursor = 0;

    this.read = function(){
        var tmp = this.content.charAt(this.cursor);
        this.cursor++;
        return tmp;
    };
    this.peek = function(){  return this.content.charAt(this.cursor); };
    this.write = function(str){  this.content += str; };
    this.isEmpty = function(){  return this.cursor>=this.content.length; }
}

我认为它可以解决你在所有浏览器中的速度问题。

票数 1
EN

Stack Overflow用户

发布于 2014-09-19 20:43:50

注意到您使用的是松散相等。我将从这里开始,并将==更改为===,看看是否有所不同。

下面是一个松散与严格的jsperf:http://jsperf.com/performance-of-loose-vs-strict-equality

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20109497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档