【发布时间】:2011-12-05 12:00:19
【问题描述】:
当然,Firebug、Chrome 的 Web Inspector、Opera 的 Dragonfly 和 dynaTrace 的 IE AJAX 工具都具有分析功能。但是,我还没有找到可以让我“忽略”库的工具。
举个例子,假设我有以下纯 JS/DOM 代码:
function foo(node) {
for (var i = 0; i < node.childNodes.length; i++) {
node.childNodes[i].innerHTML = 'Test';
}
}
还有一段类似的使用 jQuery 的代码:
function bar(jqNode) {
jqNode.children().each(function() {
$(this).html('Test');
});
}
(示例不是很好的代码,请保留它们,因为这不是重点)
如果您通过 JS 分析器将两者都抛出,您会发现在第一个示例中,只有一个函数的“自身时间”等于函数中花费的“总”时间 - 作为 DOM 操作算作“自己的时间”。
然而,在 jQuery 示例中,所有这些都被抽象到 jQuery 中,这意味着“自己的时间”很少,所有时间都花在 jQuery 中。
这使得很难找到性能瓶颈,因为具有最高“自身时间”的函数是 jQuery.fix 和 jQuery.init 等等(这并没有告诉我写得有多好(或不写)我的代码是),并且“总时间”最高的函数通常在调用堆栈中太高而无法找出实际问题出在哪里(如果您有一个函数调用其他 10 个函数,而一个函数需要“永远”,则调用函数将有更大的“总时间”,但这不会让你弄清楚哪个被调用函数花费的时间最长')。
【问题讨论】:
-
Raynos:使用其他库分析代码会遇到同样的问题。编写自己的包装器来解决浏览器的疯狂和库将为您解决的各种其他问题意味着您正在编写自己的库 - 这仍然会遇到这个问题。我认为你的建议没有帮助。诚然,我给出的示例存在偏差,因为您当然不需要使用
each,但是在没有 querySelector(All) 的情况下轻松访问浏览器中的元素也会遇到同样的问题,而且不是为了得到“圆”。
标签: javascript jquery profiling