【问题标题】:Find all occurrences of object instantiation查找所有出现的对象实例化
【发布时间】:2014-11-19 08:08:33
【问题描述】:

我正在开发一个使用旧版本垃圾收集器的 C# Mono 项目(在 Unity3D 中)。内存泄漏给我敲响了警钟。

因此,我正在尽可能地优化:避免像瘟疫一样的 Linq、回收集合等。

我想知道的是 - 是否有一个工具可以让我知道我正在实例化新对象的所有位置?

我已经能够用 grep 搜索像 new List 这样的东西,这很好,但如果我想将搜索范围扩大到 new,我也会得到值类型,我想忽略它。

我正在使用 MonoDevelop、Visual Studio 2013 和 Resharper。

【问题讨论】:

  • Resharper 会告诉你在哪里使用了构造函数。
  • 我怎样才能找到这个功能?
  • 你试过Heapshot吗?
  • 将光标放在构造函数或使用构造函数和Reshaper\Find\Find Usages菜单项上;

标签: c# optimization resharper instantiation


【解决方案1】:

JetBrains 为 ReSharper 发布了一个相对较新的小插件,它可以静态分析您的代码以进行分配和装箱 - ReSharper Heap Allocations Viewer。它可能正是您正在寻找的。我们在垃圾收集、内存使用和性能方面遇到了问题,这些问题与性能关键领域中过度分配和过度使用 LINQ 相关。正如您也发现的那样,跟踪这些额外的分配可能很困难。当我们进行重构以减少分配时,这个插件真的很有帮助,我们一直在使用它来防止新代码中过多的内存使用。

基本上,它会在检测到本地对象分配的地方添加下划线和解释,例如:

它还标记 LINQ 语句、迭代器和委托的分配以及委托引起的分配。

您可以从 ReSharper Extension Manager 安装它 - 只需搜索“堆分配查看器”。

【讨论】:

  • 这看起来很棒。有没有办法输出对象分配的所有实例?例如,采用类似代码问题浏览器的格式。
  • 您应该能够在分配时按 alt+enter 并显示所有类似的代码问题。
  • 我试了一下,它似乎对我不起作用。我不知道输出所有对象分配实例的方法。也许这会是一个很好的功能请求?我们在分析后使用了该插件,因此我们大致知道我们的过度分配发生在哪里。
  • 我一直在使用该模块并通过眼睛扫描每个脚本。这有点像针,但它教会了我一些非常有趣的东西。例如,我不知道调用 params[] 方法每次都会实例化一个新数组。
【解决方案2】:

[2021 年更新]

Resharper 堆分配查看器扩展似乎已合并到 Resharper 符号的使用通用工具中。

如果您在 2021 年使用 Resharper 并寻找类的实例化,请执行以下步骤:

  • 转到类定义并查​​询符号的用法,参见。截图如下
  • 单击在查找结果中显示以获得更好的可读性
  • 创建新实例过滤结果

就是这样,您的所有实例现在都已列出。

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 2021-01-04
    • 2011-10-22
    • 1970-01-01
    • 2012-07-16
    • 2014-04-28
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多