【问题标题】:Why is Property execution slower than Field or Method execution?为什么属性执行比字段或方法执行慢?
【发布时间】:2012-02-06 14:07:07
【问题描述】:

CLR via CSharp 第 10 章“属性”中,Jeff Richter 写道:

属性方法可能需要很长时间才能执行;始终访问字段 立即完成。使用属性的一个常见原因是 执行线程同步,可以永远停止线程, 因此,如果线程不应该使用属性 需要同步。在那种情况下,一种方法是优选的。 此外,如果您的班级可以远程访问(例如,您的班级 派生自 System.MarshalByRefObject),调用属性 方法将非常慢,因此,一种方法优于 财产。在我看来,从 MarshalByRefObject 派生的类 永远不要使用属性。

即使属性被定义为只返回私有字段,是否也是这种情况?为什么同步时首选方法?为什么在 MarshalByRefObject 场景中首选 Method

为了澄清我的问题:
Jeff 似乎在笼统地声明属性是不可取的,并且在这两种情况下方法更可取。正如 Joe White 所指出的,属性可以有任意代码。但是方法可以运行相同的任意代码。那是我遇到困难的部分。使用方法而不是属性(假设使用相同的代码)进行同步或编组实际上有优势,还是他只是语言约定有问题?

【问题讨论】:

    标签: c# .net performance synchronization clr


    【解决方案1】:

    我认为他的意思是,因为属性可以运行任意代码,调用代码不应该假设它会立即完成。

    如果属性所做的只是返回一个字段,那么它的方法体实际上将由 JIT 编译器内联,并且它的速度与字段访问一样快。所以并不是说属性变慢了;就是它们是黑匣子。如果你不知道一个属性是如何实现的,你就不能假设它会很快返回。

    (也就是说,制作慢速属性将明显违反.NET Framework Design Guidelines,特别是这个:“请使用方法而不是属性,[如果]操作比字段慢几个数量级设置将是“。)

    至于他建议使用方法代替,我无法理解。属性方法:属性getter是一个方法(通常命名为get_PropertyName),而属性setter是一个方法(set_PropertyName),读取属性的代码被编译成使对get_PropertyName 的方法调用。没有什么特别的东西会使属性比方法慢。

    【讨论】:

    • Jeff 的观点是“GetBlah”方法调用向读者传达“这可能很慢”,而“Blah”属性传达“这几乎肯定很快”。因此,如果您要使某些事情变慢,请使其成为一种方法。我不完全同意这个建议——例如,我经常制作具有缓慢不太可能发生的最坏情况但具有出色摊销性能的属性.但是 Jeff 的建议绝对是一个很好的起点;一旦你知道自己在做什么,就偏离它。
    【解决方案2】:

    我认为关键是属性访问看起来像字段访问,所以人们不会期望有什么不寻常的地方。

    如果你有一个可能需要很长时间的属性,你应该把它重写成一个方法。它不会使您的代码性能更好,但更清楚的是它可能需要很长时间。

    就性能而言,属性访问和方法调用没有区别。实际上属性访问只是一个方法调用。

    【讨论】:

    • 好吧..他确实明确地说“调用属性方法会很慢,因此,方法优于属性”。所以这不仅仅是关于外表......至少根据杰夫..
    • 调用属性会很慢,人们并不期望属性会很慢。调用方法同样慢,但人们期望某些方法很慢。
    【解决方案3】:

    方法不比属性快,但方法不应该像属性一样快。因此,该方法最好明确说明它可能需要一些时间(因为在这种情况下是线程同步)。

    字段根本没有“执行”。访问字段就是直接访问内存。

    【讨论】:

    • 访问实例字段是间接访问内存,因为首先你必须在内存中找到receiver
    • @Eric:是的,当然,我的意思是你正在访问内存,而不是执行代码。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2011-04-29
    • 2011-05-07
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多