[C#技巧]new运算符使代码执行速度慢了5倍
作者:admin 时间:2023-5-5 10:53:52 浏览:C#中,new
运算符创建一个类型的新实例。但是,请不要疯狂使用new
运算符来创建一个简单的整型变量(int a = new int();
),虽然,使用 new
运算符创建一个简单的整数变量,它会自动设置为 0,并且不会出现“未分配的局部变量”之类的错误,但是否真的有必要进行自动分配0?让我们看看 new
运算符如何降低代码执行的性能。
不要疯狂使用 new 运算符来创建整数变量
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
namespace Test1
{
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
int a = new int();
a = 100;
}
sw.Stop();
Console.WriteLine("Using New operator:- " + sw.ElapsedTicks);
sw.Restart();
for (int i = 0; i < 1000; i++)
{
int a;
a = 100;
}
sw.Stop();
Console.WriteLine("Without new operator:- "+ sw.ElapsedTicks);
Console.ReadLine();
}
}
}
下面是执行结果
可以看到,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 代码的性能有用的一些技巧,花时间检查你的代码以确保它的性能并及时了解更新是值得的。
相关文章
- 站长推荐