普通人如果说什么事情慢,指的是 5 分钟,10 分钟,或者 1 个小时、2 个小时。而程序员要说什么事情慢,他们指的是 2 纳秒。

每个纳秒对程序员来说都是非常宝贵的,所以,要对代码进行优化,优化,再优化,每个纳秒都不要浪费。

在 C# 程序中,完成一件任务通常都有若干种方法,但这些方法之间是存在一些差异的,特别是性能上的差异。本文尝试着举几个例子来说明这种差异。

1. 装箱还是不装箱(to box or not to box)

一般来说,值类型的数据都是在栈上操作的,而引用类型的数据都是在堆上的,而当值类型需要作为引用类型操作时,都要先对值类型数据进行装箱,使其变为引用类型。但装箱操作是一个成本很高的操作,要尽量避免使用。如对于如下代码:

static string GetArrayInfo(Array a)
{
string s = $"An array with {a.Length} elements.";
return s;
}

其中,a.Length 是一个整型的值类型变量,与字符串混合在一起时,需要进行装箱操作。可改为如下代码以避免装箱操作:

static string GetArrayInfo(Array a)
{
string s = "An array with " + a.Length.ToString() + " elements.";
return s;
}

2. 构造字符串(building strings) 

构造字符串,可以使用 StringBuilder,也可以直接用 + 操作符(编译为对 Concat() 方法的调用)连接字符串。一般来说,使用 StringBuilder 是一种高性能的字符串构造方案,但也不尽然,尤其是 StringBuilder 的 AppendFormat() 方法,成本很高,应尽量避免使用。举例如下。

static string Greeting(string name)
{
StringBuilder sb = new();
_ = sb.AppendFormat("Hello, {0}", name ?? "null");
return sb.ToString();
}

下面的代码使用 Append() 方法构造字符串:

static string Greeting(string name)
{
StringBuilder sb = new();
_ = sb.Append("Hello, ");
_ = sb.Append(name ?? "null");
return sb.ToString();
}

最后,我们用 + 操作符(Concat() 方法)构造同样的字符串:

static string Greeting(string name)
{
return "Hello, " + name ?? "null";
}

经过实测,+ 操作符方法(Concat() 方法)性能最好,StringBuilder 的 Append() 次之,AppendFormat() 最差。

3. 类型转换(type conversion)

如将一个数字字符串转换为整型数,一般有三种方法实现转换:

// 方法1:
_ = int.TryParse("123", out int n); // 方法2:
int n = int.Parse("123"); // 方法3:
int n = Convert.ToInt32("123");

这三种方法都可以。从安全性上讲,int.TryParse() 最安全,从性能上说,则 Convert.ToInt32() 最好(但也相差不大)。如果能确定输入字符串的合法性,则尽量使用 Convert.ToInt32() 方法,反之,则使用 int.TryParse() 以避免抛出异常。

以上三个实例的实测数据如下图所示,这是经过 100 次循环,每次循环执行 1000000 次调用,经过平均后得出的结果。

提高程序的运行性能,除了选用高性能的硬件(高性能CPU、内存、硬盘等)之外,在软件上也要下功夫进行优化。优化涉及的方面很多,代码优化是其中很重要的环节。本文从“黑盒”角度举了几个例子并进行实际测试,以揭示不同方法的实现性能。

C# 代码性能优化举例的更多相关文章

  1. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  2. JavaScript代码性能优化总结

    JavaScript 代码性能优化总结 尽量使用源生方法 javaScript是解释性语言,相比编译性语言执行速度要慢.浏览器已经实现的方法,就不要再去实现一遍了.另外,浏览器已经实现的方法在算法方面 ...

  3. 针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...

  4. Java开发代码性能优化总结

    代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目 ...

  5. [转] Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  6. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  7. Java开发中程序和代码性能优化

    现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...

  8. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  9. js代码性能优化的几个方法

    相信写代码对于大部分人都不难,但想写出高性能的代码就需要一定的技术积累啦,下面是一些优化JavaScript代码性能的常见方法. 一.注意作用域 1.避免全局查找 使用全局变量和函数肯定要比局部的开销 ...

随机推荐

  1. javascript中的12种循环遍历方法

    1.for (自定义条件) 循环 let arr = [1,2,3]; for(let i =0;i<arr.length;i++){ console.log(i,arr[i]) } 2.for ...

  2. ACwing895. 最长上升子序列

    题目: 给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式: 第一行包含整数N. 第二行包含N个整数,表示完整序列. 输出格式: 输出一个整数,表示最大长度. 数据范围: ...

  3. 【LeetCode】289. Game of Life 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  4. 1382 - The Queue

    1382 - The Queue   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB On som ...

  5. ZOJ 3960:What Kind of Friends Are You?

    What Kind of Friends Are You? Time Limit: 1 Second Memory Limit: 65536 KB Japari Park is a large zoo ...

  6. CNN、RNN

    卷积神经网络有三个结构上的特性:局部连接,权重共享以及空间或时间上的次采样.这些特性使得卷积神经网络具有一定程度上的平移.缩放和扭曲不变性. CNN由可学习权重和偏置的神经元组成.每个神经元接收多个输 ...

  7. 由于ios由UIWebView换成了WKWebview内核后导致webview请求接口文件上传,后台接收不到文件

    2020年4月起App Store将不再接受使用UIWebView的新App上架.2020年12月起将不再接受使用UIWebView的App更新. 解决后台文件接收不到的问题 function GLA ...

  8. UML的定义和组成详细介绍

    目录 1.UML 1.1概述 1.2 UML是一种建模语言 1.3 UML语言包含三方面 2.UML支持软件体系结构建模 2.1 逻辑视图 2.2 实现(开发)视图 2.3 部署视图 2.4 过程视图 ...

  9. AWS 15年(2):云原生兴起

    AWS创立云计算15年来,没有一个行业不跟云计算相关,没有任何一个颠覆性创新缺少云计算的参与,云已经是不可逆的滚滚洪流. AWS这15年,是云原生服务从无到有再到基本成熟的15年,是云原生应用兴起的1 ...

  10. mysql语句1-创建库和表

    一.DDL数据定义语言 就是对书库内部的对象进行创建.删除.修改等操作的语言. 关键字:create  drop  alter 1.连接数据库 mysql -u用户名 -p -h指定主机(不指定默认是 ...