代码之家  ›  专栏  ›  技术社区  ›  TripShock

C#物业接入优化

  •  2
  • TripShock  · 技术社区  · 14 年前

    在C#(或VB.NET)中,编译器是否尝试优化属性访问?例如。,

    
    public ViewClass View
    {
        get
        {
            ...
            Something is computed here
            ....
        }
    }
    
    if (View != null)
        View.Something = SomethingElse;
    
    
    

    View 在两次访问之间保持不变,它可以避免计算两次值。是否执行了此类优化?

    我明白如果 查看 GetView() ). 在我的特殊情况下, 查看 包括在视觉树上寻找特定类型的元素。

    相关:有关于(微软)C#编译器工作原理的参考资料吗?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Kieren Johnstone    14 年前

    不是一般的,不是。正如Steven提到的,关于多线程有很多因素需要考虑,如果你真的在计算一些可能改变的东西,你是对的,它应该从属性中重构出来。如果它不改变,您应该延迟加载它(检查私有成员是否为null,如果是,则计算,然后返回值)。

    如果它不改变并且依赖于一个参数,那么可以使用 Dictionary Hashtable 作为缓存-给定参数(键),您将存储值。你可以把每个条目作为 WeakReference 因此,当值没有在任何地方引用并且发生垃圾回收时,内存将被释放。

    希望有帮助。

        2
  •  2
  •   Hans Passant    14 年前

    get
    {
        if (_something == null) {
            _something = createSomething();
        }
        return _something;
    }
    

    这将内联公共案例,并允许创建方法保持非内联状态。在发布版本(load+test+jump)中,这通常被编译为三条机器代码指令,执行时间约为纳秒。这是一个微观优化,看到一个实际的性能改善将是相当罕见的。

    请注意,给定的示例代码不是线程安全的。总是先写正确的代码而不是快速的代码。

        3
  •  1
  •   Steven Sudit    14 年前

    不,所以你应该用 Lazy<T> 实现JIT计算。

        4
  •  0
  •   Ando SylviA    14 年前

    例如:

      object mCachedValue = null;
        public Object MyProperty
        {
            get
            {
    
                if (mCachedValue == null)
                {
                   lock(mCachedValue)
                    {
                       //after acquiring the lock check if the property has not been initialized in the mean time - only calculate once
                        if (mCachedValue == null)
                        {
                            //calculate value the first time 
                        }
                    }
                }
                return mCachedValue;
            }