2

我观察到在 Android 浏览器上运行 javascript 测试时在 cpu 上执行的指令计数。
测试js代码在html中很简单。这些文件在 android 本地目录中,而不是在 webserver 中。

在 html 中:

<html> 
    <head>
       <script type='text/javascript' src='test.js'>
    </head> 
    <body> 
       <div id='content'> ... </div>
       <span> .. </span>
       <div id='logo'> ... </div>
       ...
    </body> 
</html>

在 test.js 中:

   for (i = 0; i < 1000 ; i++) {
        ... 
           $().append("<div id='content2'> ... </div> 
           var temp1 = $(span#content2)
           var temp2 = $(#logo) 
           var temp3 = $(h3.id)
        ...
    }

简而言之,在 test.js 中,使用了简单的方法,例如使用 jQuery 的 .append()。当我在 Android 浏览器上运行这个简单的测试代码时,我认为我应该有一致的指令数,但实际上,每次运行我都有不同的指令数。它可能在变化中有一些模式,但似乎并不清楚。

我最初的猜测是 DOM 中带有 javascript 的 html 中的“异步”事物。所以,我改变了这样的html:

<html> 
    <head>

    </head> 
    <body> 
       <div id='content'> ... </div>
       <span> .. </span>
       <div id=''> ... </div?
       ...
    </body> 
     <script type='text/javascript' src='test.js'>
</html>

另外,我试过这个

$(document).ready(function() { 
   ... 
       $().append("<div id='content2'> ... </div> 
       var temp1 = $(span#content2)
       var temp2 = $(#logo) 
    ...
});

但是,我还没有得到一致数量的指令。这是异步引起的问题吗?还是 DOM 方面的 jQuery 方法在运行时有一些不确定的行为?或者,JS JIT 编译器在每次运行中都有非常不同的行为?谁能给我一些线索?

谢谢!

4

1 回答 1

1

不仅仅是 JavaScript 不能与 DOM 渲染同步运行,而且 HTML 解析本身本质上是松散的,并且从来没有被设计为确定性的。“足够好”是让 JavaScript 和 HTML 达到每个设备及其兄弟都可以使用它们的原因,但为此付出的代价是某种程度的不可预测性。

一般来说,如果你不需要,不要使用 HTML 解析,特别是如果你想要一致的性能。DOM 有一个完全可用的createElement方法,您可以将其发送到 jQuery 的append方法,这可能会为您提供更一致的结果。(而且它并不是insertBefore一种很难使用的方法。如果您花时间测量 CPU 周期,那么您所做的工作水平明显高于 jQuery 的目标模型。)

(如果 JIT 编译器在足够大的测试运行中没有给您不同的结果,我会感到非常惊讶。除非您每次都设法拥有完全相同的设备,否则我希望根据可用的输入变量会有所不同它必须用来判断要进行多少编译,例如内存分配和 CPU 负载。)

于 2013-08-02T04:57:10.707 回答