c# - 属性比字段慢

标签 c# properties field jit

似乎我遇到的每篇文章都达成了相同的共识:仅返回字段的属性由 JIT 内联并且具有与字段几乎相同的性能。

但是,我目前的情况似乎并非如此。我的程序进行密集计算,访问许多简单的自动 getter 和私有(private) setter 的属性。然而,在这种特殊情况下,我只是复制一个对象。

在启用优化的 Release模式下分析代码会导致多次调用属性的 get 函数。对 Copy() 的调用总计约 5.6 毫秒。

Properties benchmark

但是,当属性被转换为字段时,该函数的运行速度比使用属性快 6 倍:

enter image description here

与使用字段相比,比较两个属性的相等性似乎会导致更多的性能损失。这是一个类的 IEquatable 实现的基准测试,使用相同的代码但将属性与字段交换。

enter image description here

如果 JIT 应该通过内联来优化属性,为什么会发生这种情况?我想保留属性,因为它们的访问控制方面非常方便,但如果它们慢得多,我会坚持使用字段。

编辑: 似乎受此问题影响的一些(但不是全部)案例正在使用接口(interface)中声明的属性。在这些情况下没有使用其他多态性,但在这些情况下删除接口(interface)会使性能差异达到预期水平。

编辑 2: 如之前的编辑所述,部分问题似乎是由于接口(interface)虚拟调用引起的。经过更多调查后,似乎在 CLR 中运行基准测试可以正确地内联属性,但 JetBrains dotTrace 却没有,即使选中了“启用内联”。

最佳答案

不幸的是,除了尝试通过使用

来帮助消除 JITTER 之外,您无能为力
[MethodImpl(MethodImplOptions.AggressiveInlining)]

AggressiveInlining The method should be inlined if possible.

现在从技术上讲,这只能用在方法或构造函数上,但是您似乎可以在 getter 和 setter 本身上测试它。即它可以编译(虽然我还没有测试过)

public int someType
{
   [MethodImplAttribute(MethodImplOptions.AggressiveInlining)]
   get;
   [MethodImplAttribute(MethodImplOptions.AggressiveInlining)]
   set;
}

注意:内联是一个令人惊奇的黑盒,抖动可能喜欢也可能不喜欢,甚至属性也只是一个建议。另请注意,位数也可能会影响它内联的内容。

最后,我认为你正在以正确的方式解决这个问题,你应该只使用 bechmarker 或分析器,并相应地进行微优化,

关于c# - 属性比字段慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53772811/

相关文章:

php - MySQL 和 PHP : Only the first field in the table is displayed

c# - 企业 N 层设置

c# - 如何从解决方案中的类访问我的 ASP.NET 页面上的控件?

c# - 如何在每个单元格中设置具有不同数据源的 DataGridView ComboBoxColumn?

c# - 如何创建元素自动实例化数组,例如用户自定义类型的int数组?

java - Spring中从多个属性文件读取资源

java - 每当在文件中更新时,Spring 属性文件加载程序 : how to update properties at runtime,?

c# - C# 类中的@namespace 字段是什么?

MySQL 注释字段或文本区域的字段类型

java - 如何在用户定义的 .properties 文件中引用系统属性?