【问题标题】:Benchmarking: parts don't add up to the whole基准测试:部分加起来不等于整体
【发布时间】:2014-06-28 05:08:33
【问题描述】:

我正在玩基准测试,以查看我的自定义 javascript 占用了多少馅饼,而就优化而言,我无法控制的事情:dom/network/painting 等。

我会为此使用 chrome 的开发工具,但我看不到准确的饼图,因为我的函数执行 ajax 调用,因此网络被添加到饼图的 javascript 部分(以及 dom 和其他'out of我控制的东西)。

我正在使用 benchmarkjs (http://benchmarkjs.com/) 来测试这一行: document.querySelector("#mydiv").innerHTML = template(data);

其中template 是预编译的车把模板。

关于问题...

我将这个过程分成了 3 个部分,并取了每次运行的平均值:

  1. document.querySelector("#mydiv") - 0.00474178430265463
  2. myDiv.innerHTML = already_called_template - 0.005627522903454419
  3. template(data) - 0.004687963725254854

但是所有三个加在一起(上面的一行)结果是:0.005539341673858488

这比设置 innerHTML 的唯一调用要少。

那么为什么部分不等于总和?我做错了吗?



下面的示例基准(我使用 deferred 作为常量,因为我计划接下来添加 ajax):
var template = Handlebars.compile(html);
var showStats = function(e) { console.log(e.target.stats.mean); };
var cachedDiv = document.querySelector('#myDiv');
var cachedTemplate = template(data);

new Benchmark('just innerHTML', function(deferred) {
  cachedDiv.innerHTML = cachedTemplate;
  deferred.resolve();
}, {defer: true, onComplete: showStats}).run();

new Benchmark('full line', function(deferred) {
  document.querySelector('#myDiv').innerHTML = template(users);
  deferred.resolve();
}, {defer: true, onComplete: showStats}).run();

【问题讨论】:

  • 你不是说不想测量 DOM 的东西吗?
  • 嗨,Bergi,我希望能够分别测量 dom/network/customjs。我的目标是总结它们以了解总时间,但它并没有完全加起来......

标签: javascript performance optimization benchmarking


【解决方案1】:

http://mrale.ph/blog/2012/12/15/microbenchmarks-fairy-tale.html

原来 jit 可能正在做一些疯狂的事情。

答案是试图超越它,但我认为我应该调整我的策略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多