很多人写C#代码时只关心功能能不能跑通,却忽略了性能问题。等程序一上线,内存占用飙升、响应变慢,才开始头疼。其实,一些小改动就能带来明显提升。
减少字符串拼接的开销
字符串操作是常见性能陷阱。比如在循环里用+号拼接字符串,每次都会生成新对象,频繁触发GC。这时候该用StringBuilder。
var sb = new System.Text.StringBuilder();
for (int i = 0; i < 1000; i++)
{
sb.Append(i.ToString());
}
string result = sb.ToString();
避免装箱和拆箱
值类型和引用类型之间转换会带来额外开销。比如把int放进ArrayList,就会发生装箱。现在都2024年了,直接用泛型集合List<int>,既安全又快。
合理使用async/await
异步编程不是万能提速药。如果在CPU密集型任务里滥用async,反而增加上下文切换成本。文件读写、网络请求这类IO操作才真正适合异步。
public async Task<string> FetchDataAsync()
{
using var client = new HttpClient();
return await client.GetStringAsync("https://api.example.com/data");
}
缓存重复计算的结果
有个同事写了个方法,每次都要重新解析配置文件。用户点一次按钮就解析一次,卡得不行。改成静态变量缓存后,响应立马顺畅了。
选择合适的数据结构
查一个元素是否存在,用List.Contains要遍历,时间复杂度O(n)。换成HashSet,平均只要O(1)。数据量一大,差距就出来了。
释放资源要及时
数据库连接、文件流这些不及时关,轻则资源耗尽,重则系统崩溃。using语句不只是代码整洁,更是保险绳。
using (var file = File.OpenRead("data.txt"))
{
var reader = new StreamReader(file);
string content = await reader.ReadToEndAsync();
}