【问题标题】:Knockout notifySubscribers + Durandal = rapidly degrading performance?淘汰赛 notifySubscribers + Durandal = 性能迅速下降?
【发布时间】:2013-08-12 10:40:51
【问题描述】:

我已经使用 DurandalJS 构建了一个应用程序 - 虽然我不知道该框架是否与此处相关。在 Firefox 和 Chrome 中,如果我单击深蓝色框(文件夹),性能会迅速下降,我不知道为什么。我单击的每个新文件夹都需要更长的时间才能打开 - 我可以看到它在打开大约 20-30 个文件夹后发生。

这些文件夹没有被缓存,应该基于单例视图模型:

define(['services/dataservice', 'durandal/plugins/router', 'durandal/app', 'services/hub', 'viewmodels/setVm', 'viewmodels/folderVm'],
    function (dataservice, router, app, hub, SetViewModel, FolderViewModel) {
    // define vm
    return vm;
}

在 FF 分析器中,我看到如下内容:

我不确定这对那些更熟悉分析的人是否有意义,但我终其一生都无法弄清楚为什么会发生这种性能下降。

chrome 中的内存配置文件显示最大内存消耗约为 45 MB,但我必须等待页面绘制的时间确实越来越长。

现场直播在这里:

www.nogginator.com

知道为什么会这样吗?

【问题讨论】:

  • 您是否查看过浏览器中缓存了多少信息?
  • @PWKad 我在 chrome 中使用了内存分析器(时间线和堆),但一切似乎都根据本指南进行了检查:addyosmani.com/blog/…
  • 注释掉的代码是什么,而不是“//define vm”?此外,性能很大程度上取决于其他引用模块中的代码。
  • 不计算模拟类,您的服务和视图模型中有近 4k 行代码。你肯定有泄漏,但要找到它会很困难。看了几分钟,我的钱会花在你使用 jQuery droppable 绑定到一个公共页面类上,创建一个无法正确清理的闭包。不过老实说,让自己熟悉这么多代码并不是一件容易的事。
  • 应该发布的东西实际上仍然在一些可观察的通知列表中。此外,依赖链增加得更多。这解释了内存消耗和减速。当存在不希望的依赖时,通常会发生这种情况。那是设计上不存在的依赖关系,而仅仅是因为 knockout.js 会自动跟踪依赖关系。您进行了一些涉及可观察的计算,但无意在代码的某个丢失位置创建依赖关系……但是创建了依赖关系。也就是说,很难发现在哪里

标签: knockout.js single-page-application durandal


【解决方案1】:

所以问题最终是shell 视图模型中有太多东西,阻止垃圾收集回收它。将其拆分为多个部分会对性能产生重大影响。

外壳被拆分成

  • authentication 服务
  • sidebar 视图模型
  • menu 视图模型
  • 一些路由器配置

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 2014-08-01
    • 2015-02-24
    • 2017-11-03
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2014-08-21
    相关资源
    最近更新 更多