0

当我试图弄清楚为什么我的网页(dxview)的加载过程需要这么长时间时,我决定在(该过程的一部分)console.log()之前和之后的代码中放置一些语句,并在eval()其中的字符串中放置一些语句eval()。它看起来有点像这样:

console.log("Timestamp before eval: " + (new Date().getTime()));
eval("... console.log('Some log in here'); ...");
console.log("Timestamp after eval: " + (new Date().getTime()));

有趣的是,结果与我预期的不同:

"Timestamp before eval: 1423852110738"
"Timestamp after eval: 1423852110787"
"Some log in here"

这使得很难检测到实际耗时的部分,因为以这种方式使用时间戳甚至不能表明eval问题是否存在。

将日志放在 eval'ed 字符串的开头和结尾表明eval实际需要250 到 350 毫秒来处理,而两个时间戳之间的差异仅为49 毫秒。但在viewShown调用该方法之前,还需要23,000+ ms

AFAIK,如果您不使用网络工作者或超时/间隔,JS 应该在语句完成之后(而不是之前)继续执行代码。我可能在这里混淆了一些东西,但是这怎么可能呢?

亲切的问候,
杰森

4

1 回答 1

0

我能想到的唯一原因是,在 eval() 中,您是否将 console.log() 放在异步回调中,这将解释 console.log 消息的顺序。

如果一切都是同步的,那么消息的顺序应该是:

"Timestamp before eval: 1423852110738"
"Some log in here"
"Timestamp after eval: 1423852110787"

我的建议是,不要在 eval() 之后记录结束时间,而是找出 eval() 部分实际结束的时间(意味着所有异步方法都已完成),并在此处记录结束时间。

例如,如果在 eval() 中有一个异步函数:

console.log("Timestamp before eval: " + (new Date().getTime()));
eval("setTimeout(function(){
    console.log('Timestamp after eval: ' + (new Date().getTime()));
}, 1000);");

以这种方式,您应该能够准确计算出完成所有功能需要多长时间。

谢谢。

于 2015-02-13T19:43:04.250 回答