接上篇继续,本文的完整源代码也在上篇文章中。

枚举数组和普通枚举性能差异

有些人可能知道,.net在处理枚举时,对于数组有特别的优化,所以,当枚举的集合是一个数组时,性能会好些。例如下面的测试代码:

 1     class C1 {
 2
 3         public void Do1() {
 4             int[] array = { 1, 2, 3, 4 };
 5             for (int i = 0; i < int.MaxValue/100; i++) {
 6                 DoIt1(array);
 7             }
 8         }
 9
10         private void DoIt1<T>(IEnumerable<T> array) {
11             foreach (var item in array) {
12
13             }
14         }
15
16         public void Do2() {
17             int[] array = { 1, 2, 3, 4 };
18             for (int i = 0; i < int.MaxValue/100; i++) {
19                 DoIt2(array);
20             }
21         }
22
23         private void DoIt2(int[] array) {
24             foreach (var item in array) {
25
26             }
27         }
28     }

第23行的方法中,编译器提前已知是一个数组的枚举,所以会优化指令。那么,到底这种优化差距有多大呢?我需要试验一下。

第一个是Do1的结果,第二个是Do2的结果,显而易见,差距还是相当大的,为什么呢?从反编译的IL代码来看,第一个方法使用标准的GetEnumerator机制,需要创建实例,而且要调用Current和MoveNext两个方法,更何况,Array的GetValue实现实在不够快。而第二个方法使用了for的机制,无需创建实例,不断累加和一个判断语句即可,性能当然高了。

在Linq to Object中,其实是有这样考虑的代码的。例如:

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{if (source == null){throw Error.ArgumentNull("source");}if (selector == null){throw Error.ArgumentNull("selector");}if (source is Enumerable.Iterator<TSource>){return ((Enumerable.Iterator<TSource>)source).Select<TResult>(selector);}if (source is TSource[]){return new Enumerable.WhereSelectArrayIterator<TSource, TResult>((TSource[])source, null, selector);}if (source is List<TSource>){return new Enumerable.WhereSelectListIterator<TSource, TResult>((List<TSource>)source, null, selector);}return new Enumerable.WhereSelectEnumerableIterator<TSource, TResult>(source, null, selector);
}

创建类和结构的性能差异以及属性和字段的性能差异

下面我还要试验创建类实例和结构类型,其性能差异到底有多大?会不会.net的垃圾回收超级厉害,基本上差异不大呢?当然,我也顺手测试了访问属性和访问字段的差别。

 1     class C1 {
 2         public void Do1() {
 3             for (int i = 0; i < int.MaxValue/10; i++) {
 4                 var p = new PointClass() { X = 1, Y = 2 };
 5             }
 6         }
 7         public void Do2() {
 8             for (int i = 0; i < int.MaxValue/10 ; i++) {
 9                 var p = new PointClass2() { X = 1, Y = 2 };
10             }
11         }
12         public void Do3() {
13             for (int i = 0; i < int.MaxValue/10; i++) {
14                 var p = new Point() { X = 1, Y = 2 };
15             }
16         }
17         public void Do4() {
18             for (int i = 0; i < int.MaxValue / 10; i++) {
19                 var p = new Point() { XP = 1, YP = 2 };
20             }
21         }
22     }
23
24
25     class PointClass {
26         public int X { get; set; }
27         public int Y { get; set; }
28     }
29
30     class PointClass2 {
31         public int X;
32         public int Y;
33     }
34
35     struct Point {
36         public int X;
37         public int Y;
38
39         public int XP { get { return X; } set { X = value; } }
40         public int YP { get { return Y; } set { Y = value; } }
41     }

测试结果如下:

实验结果表明:在计算密集型的程序中,结构的创建仍然比类要高效的多,另外,属性和字段的访问其性能基本相当。

C# 性能优化之斤斤计较篇 二相关推荐

  1. C# 性能优化之斤斤计较篇 一

    今天,我想跟大家聊一聊C#的性能优化,当然,这里并不谈基本的原则,这些都假设你已经非常精通了,本文聊的是要争取几个毫秒的程序.关于基本的性能优化,可以参考园子里的文章.比如: .NET 性能优化方法总 ...

  2. Spark性能优化指南——基础篇

    在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作,应用 ...

  3. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  4. Sql Server查询性能优化之索引篇【推荐】

    Sql Server查询性能优化之索引篇[推荐] 这篇是索引系列中比较完整的,经过整理而来的 一 索引基础知识 索引概述 1.概念 可以把索引理解为一种特殊的目录.就好比<新华字典>为了加 ...

  5. Android性能优化系列总篇

    目前性能优化专题已完成以下部分: 性能优化总纲--性能问题及性能调优方式 性能优化第四篇--移动网络优化 性能优化第三篇--Java(Android)代码优化 性能优化第二篇--布局优化 性能优化第一 ...

  6. Unity性能优化 :合批篇

    前言 本系列为一些性能优化的小知识,是日常游戏开发中与性能表现的一些点,本篇为该系列文章的第二篇,前篇链接: 第一篇: Unity性能优化:资源篇 在早期Unity中,对于合批的处理手段主要是下面三种 ...

  7. Android App 性能优化系列结语篇

    Android App 性能优化系列结语篇 原文出处:http://gold.xitu.io/post/581f4ad667f3560058a33057 关于Android App的优化, 从第一篇的 ...

  8. 性能优化系列第一篇——数据库性能优化

    本文章转载的Trinea大神的文章,文章原地址 http://www.trinea.cn/android/database-performance/ 性能优化之数据库优化 本文为性能优化的第一篇--数 ...

  9. Android 性能优化之String篇

    Android 性能优化之 String篇 关于String相关知识都是老掉牙的东西了,但我们经常可能在不经意的String 字符串拼接的情况下浪费内存,影响性能,也常常会成为触发内存OOM的最后一步 ...

  10. 转载 Spark性能优化指南——基础篇

    前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...

最新文章

  1. access open 知乎_NX使用——远程IDE利器
  2. IntelliJ IDEA导入多个eclipse项目到同一个workspace下
  3. VC代码的编写和调试---编写易于调试的VC代码
  4. WPF数据绑定(1-简单数据绑定)
  5. SRS(simple-rtmp-server)流媒体服务器源码分析--启动
  6. SMS短信通API——(1)Java应用发送手机短信
  7. [html] 如何使用普通元素拥有像textarea元素一样缩放?
  8. 网信集团:一直在正常运营 高管被带走消息不实
  9. java lettuce配置多数据源_Spring Boot 2.x Redis多数据源配置(jedis,lettuce)
  10. 图像局部特征(十)--BRIEF描述子
  11. 小黑与Vista试用手记
  12. 51单片机的超声波测距仪制作教程
  13. 分区助手合并移动硬盘分区后,无法访问的解决方法
  14. 烽火路由路虚拟服务器,netcore路由设置烽火
  15. gcc 如何编译cpp文件啊
  16. python 百度脑图json数据转Excel
  17. 搜狗输入法5.0正式版发布 首创云计算输入
  18. 保姆级教程!最全苹果相机使用技巧(系列一)
  19. xmind下载安装电脑版教程
  20. 四阶段课堂总结解决问题

热门文章

  1. 128 数据库基本操作
  2. 使用IronPython集成Python和.NET
  3. WEB架构师成长之路 二
  4. Javascript学习1 - Javascript中的类型对象
  5. ORCALE常用查询语句
  6. javascript之querySelector和querySelectorAll
  7. hadoop远程调试
  8. 数商云:B2C商城网站建设功能框架大解析
  9. 监控web状态的脚本
  10. 一种基于flex的可视化多层流量切分界面的实现