减少不必要的对象创建
在家办公时,开发环境可能不如公司稳定,这时候代码的运行效率就显得尤为重要。比如在处理大量数据时,频繁创建临时对象会让内存压力变大,GC(垃圾回收)更频繁,导致程序卡顿。可以考虑用对象池来复用实例,尤其是在处理短生命周期的对象时。
private static readonly Stack<StringBuilder> _builderPool = new();
public static StringBuilder RentBuilder()
{
return _builderPool.Count > 0 ? _builderPool.Pop() : new StringBuilder();
}
public static void ReturnBuilder(StringBuilder sb)
{
sb.Clear();
_builderPool.Push(sb);
}这样在高频率调用的场景下,能明显降低内存分配压力。
善用Span<T>避免数组拷贝
远程协作中常需要解析日志、配置或网络数据包,传统做法是用SubArray或ToArray切分数组,但这会触发内存复制。Span<T>提供了一种零成本的“视图”机制,特别适合处理字节流。
public static void ProcessData(ReadOnlySpan<byte> data)
{
if (data.Length < 4) return;
var header = data.Slice(0, 4);
var payload = data.Slice(4);
// 直接操作原内存,无拷贝
}尤其是在处理大文件上传或实时通信协议时,这种写法能让响应更流畅。
字符串拼接优先使用StringBuilder
居家办公时网络会议多,后台服务若因日志记录拖慢整体性能,会影响其他任务执行。比如有人习惯用+号拼接日志信息:
log.Info("User " + name + " accessed resource " + resource); 这种方式在频繁调用时会产生多个中间字符串。
换成StringBuilder更稳妥:
var sb = new StringBuilder();
sb.Append("User ");
sb.Append(name);
sb.Append(" accessed resource ");
sb.Append(resource);
log.Info(sb.ToString());异步编程别滥用async/await
为了不阻塞UI线程,很多人不管三七二十一全加上async/await,但其实简单的同步方法包装成异步反而增加开销。比如这个例子:
public async Task<int> GetValueAsync()
{
return await Task.FromResult(42); // 多此一举
}直接返回Task就好:
public Task<int> GetValueAsync()
{
return Task.FromResult(42);
}特别是在微服务间高频调用的接口中,省去状态机生成能提升吞吐量。
预分配集合容量
在家调试时容易忽略小细节,比如List<T>默认容量是4,如果往里面加上千条数据,就会不断扩容、复制数组。提前设好容量能省下不少时间。
var results = new List<string>(1000); // 预估数量
for (int i = 0; i < 1000; i++)
{
results.Add(GetString(i));
}像导出报表、批量处理请求这类场景,效果立竿见影。