zoukankan      html  css  js  c++  java
  • 【译】改善结构体相等性性能

    目录:https://www.cnblogs.com/liqingwen/p/10261436.html

    通过重写 Equals 方法可以改善结构体相等比较的性能方法。 如果结构体包含引用类型字段(而不是仅仅只有值类型,如 int)。

    默认情况下,结构体的相等性是通过对内存中的两个结构体对象进行逐字节比较来实现并自动确定的,但只有在结构体不包含任何引用类型的情况下。

    当结构体包含引用类型字段时, 会使用反射来比较两个结构体对象之间的字段,这种基于反射的方法会导致性能降低。

    下图显示了一个仅包含值类型的结构体和另一个包含引用类型的结构体的默认相等性比较的相对性能。

     
    具有引用或值类型的性能

    【备注】图表基于执行 10000000 次相等性的性能测试,比较时间以毫秒为单位。这里省略了特定的数字, 以便于将注意力集中在相对差异上。

    用于比较的结构体:

        struct StructWithRefTypesNoOverriddenEquals
        {
            public int Age { get; set; }
    
            public int Height { get; set; }
    
            public string Name { get; set; }
        }
    
        struct StructWithNoRefTypesNoOverriddenEquals
        {
            public int Age { get; set; }
    
            public int Height { get; set; }
        }
    

    重写 Equals() 来改善性能

    如果重写 Equals 方法来提供自定义的相等性含义,则会使用重写方法而不是默认(较慢)基于反射的机制:

        struct StructWithRefTypesAndOverriddenEquals
        {
            public int Age { get; set; }
            public int Height { get; set; }
            public string Name { get; set; }
    
            public override bool Equals(object obj)
            {
                if (!(obj is StructWithRefTypesAndOverriddenEquals))
                    return false;
    
                var other = (StructWithRefTypesAndOverriddenEquals)obj;
    
                return Age == other.Age &&
                Height == other.Height &&
                Name == other.Name;
            }
    
            // GetHashCode override and == != operators omitted
        }
    

    现在,将 StructWithRefTypesNoOverriddenEquals 的性能与 StructWithRefTypesandOverridEquals 的性能进行比较,生成以下结果:

     
    自定义 .Equals() 实现

    实现重写的 Equals 意味着不会使用反射,而是执行自定义的 .Equals() 代码来取代原来的方式。

    【提示】与性能相关的所有内容都一样,这些性能差异可能与您正在编写的应用程序相关,也可能与您所编写的应用程序无关。

    章节:Improving Struct Equality Performance
    译书名:《C# 奇淫巧技 -- 编写更优雅的 C#》
    原书名:《C# Tips -- Write Better C#》
    网址:https://leanpub.com/cstips

  • 相关阅读:
    淘淘商城-day02[框架整合,后台系统搭建]
    淘淘商城-day01[项目介绍,搭建maven工程,SVN使用]
    CentOS7安装FastDFS 5.05
    ubuntu ssh 开启
    BAT 快速删除CVS文件和拷贝最近修改文件的目录结构
    eclipse 插件
    Eclipse 工作空间目录 详解
    淘淘商城-传智播客J2EE的实践项目 目录篇
    eclipse 版本 发行版本
    ROM、PROM、EPROM、EEPROM、Flash ROM分别指什么?
  • 原文地址:https://www.cnblogs.com/liqingwen/p/10266192.html
Copyright © 2011-2022 走看看