我已经编写了这段代码,以秒(使用decisec& centisec)计数。
You've wasted time <span id="alltime">0.00</span> seconds.
<script type="text/javascript">
function zeroPad(num,count)
{
var numZeropad = num + '';
while(numZeropad.length < count) { numZeropad = "0" + numZeropad; }
return numZeropad; }
function counttwo() {
tall = document.getElementById('alltime').innerHTML;
if(parseFloat(tall) < 1.00) { tnew2 = tall.replace('0.0','').replace('0.',''); }
else { tnew2 = tall.replace('.',''); }
tnum = parseInt(tnew2) + 1;
//check if have to add zero
if(tnum >= 100) { tstr1 = tnum + ''; }
else { tstr1 = zeroPad(tnum,3); }
tlast = tstr1.substr(0,tstr1.length - 2) + '.' + tstr1.substr(tstr1.length - 2);
document.getElementById("alltime").innerHTML = tlast;
}
var inttwo=setInterval("counttwo()",10);
</script>
在HTML文档中运行。
它运行良好,但是当我使用Firefox 4并运行代码时。看起来有点像LAG(在计数之前停一下)当它在一些数字上时(随机像12.20,4.43)。我已经尝试过更改“counttwo()”来计算,但这没有用。
我告诉我的一些朋友也要在Firefox 4上运行。他们说它根本没有滞后。这是因为我的电脑?还是我的火狐?或其他什么?
提前致谢!
PS。在这里小提琴:http://jsfiddle.net/XvkGy/5/镜子:http://bit.ly/hjVtXS
答案 0 :(得分:2)
当您使用setInterval或setTimeout时,由于多种原因,时间间隔不准确。它依赖于其他javascript运行,浏览器,处理器等。你必须采取+ - 15ms的可靠性为理所当然afaik。 See also ...
答案 1 :(得分:1)
这是很多计算,所以在某些计算机上,是的,它可能会滞后(如果它是史前的或用户让他的处理器真的忙于某事),如果我是对的,那东西也行不通使用Chrome的V8,因为如果您切换标签,该脚本将冻结,并且只有当您返回该标签时才会继续执行。
答案 2 :(得分:1)
setInterval
的问题在于它最终会导致备份。发生这种情况是因为JavaScript引擎试图在间隔上执行该函数(在您的情况下为10ms),但如果执行时间更长超过10ms,则JS引擎开始尝试执行下一个间隔之前当前的一个停止(这实际上只是意味着它在上一次回调结束后将其排队等待运行)。
由于JavaScript执行单线程(HTML 5中的Web工作者除外),这可能会导致UI或DOM更新暂停,因为它会持续处理来自setInterval
的JavaScript回调。在最糟糕的情况下,整个页面可能永久无法响应,因为您的未完成setInterval
执行堆栈变得越来越长,从未完全完成。
除了少数例外情况,通常认为使用setTimeout
(并在执行回调后再次调用setTimeout
)而不是setInterval
更安全。使用setTimeout
,您可以确保一个且只有一个超时排队。而且由于定时器只是近似的(仅仅因为你指定10ms并不意味着它会在10ms内发生),所以你通常不会使用setInterval
而不是setTimeout
获得任何东西。
使用setTimeout
的示例:
var count = function(){
// do something
// queue up execution once again
setTimeout(count, 10);
};
count();
您可能会在某些浏览器上看到暂停的原因之一,而不是其他浏览器,因为并非所有JavaScript引擎都是相同的:)。有些比其他人更快,因此不太可能最终得到setInterval
备份。
答案 3 :(得分:1)
如果你经常看到暂停,你可能会看到垃圾收集或循环收集暂停。
您可以在javascript.options.mem.log
中将about:config
首选项切换为true,然后在脚本运行时查看错误控制台的“消息”标签,从而对此进行测试。如果GC / CC消息与您的暂停相关联,那么它们就是您所看到的内容的解释。
至于为什么你会看到它,但是其他人没有......如果你禁用所有扩展程序,你会发现问题吗?
答案 4 :(得分:0)
不同的浏览器使用不同的JavaScript引擎,因此这段代码可能只是找到了Firefox的JägerMonkey脚本引擎存在问题的地方。计数本身似乎没有任何明显的低效率。
如果它正在为你朋友安装的FF4工作,那么对你来说这可能只是一个孤立的问题,你可以通过改变代码来做很多事情。