[C#技巧]new运算符使代码执行速度慢了5倍
作者:admin 时间:2023-5-5 10:53:52 浏览:317C#中,new
运算符创建一个类型的新实例。但是,请不要疯狂使用new
运算符来创建一个简单的整型变量(int a = new int();
),虽然,使用 new
运算符创建一个简单的整数变量,它会自动设置为 0,并且不会出现“未分配的局部变量”之类的错误,但是否真的有必要进行自动分配0?让我们看看 new
运算符如何降低代码执行的性能。
不要疯狂使用 new 运算符来创建整数变量
下面是执行结果
可以看到,new
运算符将执行速度降低了 5 倍,因此,不要疯狂使用 new
运算符来创建整数变量。
使用StringBuilder连接字符串
在 C#/.NET 中,字符串是不可变的。因此,每次你执行一些看起来像是在更改字符串的操作时,它们实际上是在创建一个新字符串。此类操作包括 Replace
和 Substring
等方法,但也包括连接。
小心连接大量字符串,尤其是在循环内。
这里的提示很简单——注意不要连接大量字符串,尤其是在循环内。在这种情况下,请使用 System.Text.StringBuilder
类,而不是使用“+”运算符。这将确保不会为你连接的每个部分创建新实例。
结论
- 你不是在修改字符串,而是在创建它们,因此请避免对多个字符串执行批量操作
- 改为使用 System.Text.StringBuilder。
内存位置很重要
我们看看下面的两段for
循环代码,它们很相似,但是速度一样吗?哪个更快?
代码 1
- for (int i = 0; i < _map.Length; i++)
- {
- for (int n = 0; n < _map.Length; n++)
- {
- if (_map[i][n] > 0)
- {
- result++;
- }
- }
- }
代码 2
- for (int i = 0; i < _map.Length; i++)
- {
- for (int n = 0; n < _map.Length; n++)
- {
- if (_map[n][i] > 0)
- {
- result++;
- }
- }
- }
在测试中,这个循环上获得了大约 8 倍的性能提升!
注意到区别了吗?这是我们遍历这个数组的顺序([i][n] 与 [n][i])。内存局部性在 .NET 中确实很重要,尽管我们已经完全摆脱了自己管理内存的问题。
虽然 .NET 是面向对象的,但你仍然需要在内存分配中寻找性能提升机会。
总结
不要让 C# 错误拖慢你的代码速度,本文是对提高 .NET 代码的性能有用的一些技巧,花时间检查你的代码以确保它的性能并及时了解更新是值得的。
相关文章