相关疑难解决方法(0)

Field vs Property.优化性能

请注意此问题仅与性能有关.让我们跳过设计指南,理念,兼容性,可移植性以及与纯性能无关的任何内容.谢谢.

现在回答这个问题.我一直认为,因为C#getters/setter实际上是伪装的方法,所以读取公共字段必须比调用getter更快.

所以要确保我做了一个测试(下面的代码).但是,如果从Visual Studio内部运行,此测试仅产生预期结果(即字段比34%的getter快).

一旦从命令行运行它,它显示几乎相同的时间......

唯一的解释可能是CLR做了额外的优化(如果我错了,请纠正我).

我不相信在实际应用中,以更复杂的方式使用这些属性,它们将以相同的方式进行优化.

请帮助我证明或反驳现实生活中的属性比田地慢的想法.

问题是 - 我应该如何修改测试类以使CLR改变行为,以便公共字段超越getter.或者告诉我,任何没有内部逻辑的属性都会像字段一样执行(至少在getter上)

编辑:我只谈论发布x64版本.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace PropertyVsField
{
    class Program
    {
        static int LEN = 20000000;
        static void Main(string[] args)
        {
            List<A> a = new List<A>(LEN);
            List<B> b = new List<B>(LEN);

            Random r = new Random(DateTime.Now.Millisecond);

            for (int i = 0; i < LEN; i++)
            {
                double p = r.NextDouble();
                a.Add(new A() { P = p }); …
Run Code Online (Sandbox Code Playgroud)

.net c# optimization performance c#-4.0

64
推荐指数
6
解决办法
2万
查看次数

速记访问器和变异器

我正在学习C#,并且正在学习如何将字段设为私有类,并使用Getters和Setters来公开方法而不是字段值.

get; set;方法1方法2相同呢?例如,一个是另一个的速记吗?

class Student
{
    // Instance fields
    private string name;
    private int mark;

    // Method 1
    public string Name { get; set; }

    // Method 2
    public int Mark
    {
        get { return mark; }
        set { mark = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,如果您想在获取或设置值之前执行计算,是否可以使用方法2?例如,将值转换为百分比或执行验证?例如

class Student
{
    // Instance fields
    private string name;
    private double mark;
    private int maxMark = 50;

    // Method 1
    public string Name { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# encapsulation get set shorthand

16
推荐指数
2
解决办法
3万
查看次数

为什么默认情况下不自动内联自动属性?

由于这些属性只是方法之下,可以理解的是,它们可能执行的任何逻辑的性能可能会或可能不会提高性能 - 因此JIT需要检查方法是否值得内联是可以理解的.

然而,自动属性(据我所知)不能有任何逻辑,只需返回或设置基础字段的值.据我所知,自动属性由编译器和JIT处理,就像任何其他方法一样.
(以下所有内容都依赖于上述段落正确的假设.)

值类型属性显示与变量本身不同的行为,但是参考类型属性应该具有与直接访问基础变量完全相同的行为.

// Automatic Properties Example
public Object MyObj { get; private set; }
Run Code Online (Sandbox Code Playgroud)

是否存在自动属性Reference Types可以通过内联显示性能受损的情况?
如果没有,是什么阻止编译器或JIT自动内联它们?

注意:我理解性能增益可能是微不足道的,特别是当JIT可能无论如何使用它时都可能内联它们 - 但是增益可能很小,似乎合乎逻辑的是,无论如何都会引入这种看似简单的优化.

c# compiler-construction jit inline

4
推荐指数
1
解决办法
1522
查看次数