DOM与javascript是异步的?
在Android浏览器上运行javascript测试时,我观察到cpu上执行的指令数。DOM与javascript是异步的?,javascript,html,asynchronous,Javascript,Html,Asynchronous,在Android浏览器上运行javascript测试时,我观察到cpu上执行的指令数。 测试js代码在html中很简单。这些文件位于android本地目录中,而不是Web服务器中 在html中: <html> <head> <script type='text/javascript' src='test.js'> </head> <body> <div id='conten
测试js代码在html中很简单。这些文件位于android本地目录中,而不是Web服务器中 在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)
...
}
(i=0;i<1000;i++)的{
...
$().append(“。。。
var temp1=$(span#content2)
var temp2=$(#徽标)
var temp3=$(h3.id)
...
}
简而言之,在test.js中,使用了简单的方法,例如使用jQuery的.append()。
当我在Android浏览器上运行这个简单的测试代码时,我认为应该有一致数量的指令,但实际上,每次运行时我都有不同的指令计数。
它可能在变化中有一些模式,但似乎不清楚
我最初的猜测是,DOM中的html和javascript是“异步”的。
因此,我对html进行了如下更改:
<html>
<head>
</head>
<body>
<div id='content'> ... </div>
<span> .. </span>
<div id=''> ... </div?
...
</body>
<script type='text/javascript' src='test.js'>
</html>
...
..
这不仅仅是因为JavaScript不能与DOM呈现同步运行,还因为HTML解析本身本身就很松散,从来没有被设计成确定性的。“足够好”是JavaScript和HTML被每个设备及其兄弟都可以使用的原因,但为此付出的代价是某种程度的不可预测性
一般来说,如果不需要的话,不要使用HTML解析,特别是如果您想要一致的性能的话。DOM有一个完全可用的createElement
方法,您可以将它发送到jQuery的append
方法,这可能会得到更一致的结果。(这不像insertBefore
是一种很难使用的方法。如果你花时间来测量CPU周期,你所做的工作水平要远远高于jQuery的目标模型。)
(如果JIT编译器在一个足够大的测试运行中没有给出不同的结果,我会非常惊讶。除非每次都能使用完全相同的设备,否则我会根据它用来判断编译量的可用输入变量(如内存分配和CPU负载)来预期一些变化。)实际上,我对CPU工作负载和性能感兴趣。如果HTML解析器是松散的和不确定的,正如您所提到的,我很可能在libdvm中有更大的差异。因此,这就是dalvik库(假设HTML解析器是用Java实现的)而不是libwebcore.so。让我通过实验获得更多数据,并详细查看配置文件,然后我将发布它。顺便说一句,我对html解析不太熟悉。那么,你能解释一下为什么它天生松散且不可预测吗?再次感谢!html解析松散是因为标记汤。在内存中构建DOM文档时,parser必须允许任何随机标记成为下一个读取的字节。我不确定是否会将其称为“不可预测”,但它肯定是不确定的。
$(document).ready(function() {
...
$().append("<div id='content2'> ... </div>
var temp1 = $(span#content2)
var temp2 = $(#logo)
...
});