C#事件结果出现次数统计的字典计数性能优化问题咨询
性能优化思路(按改造成本从低到高、收益从大到小排序)
- 优化1:减少字典查找次数 + 预分配容量
现有代码每次调用会执行2次字典查找(ContainsKey1次、索引器取值1次),属于最大的性能浪费,替换为单次TryGetValue即可,同时提前给定字典初始容量避免运行时扩容重哈希的开销:
仅这个改动就能降低该部分30%~50%的耗时。// 初始化时传入略高于预估key数量的初始值,预分配空间 Dictionary<double, double> OutcomeCounter = new Dictionary<double, double>(55000); public void IncrementDict(Dictionary<double, double> dict, double newKey, double increment = 1) { // 单次查找拿到当前值,key不存在时默认返回0,符合原有逻辑 dict.TryGetValue(newKey, out double current); dict[newKey] = current + increment; } - 优化2:避免接口调用开销
把参数和变量声明从IDictionary接口改为具体的Dictionary类型,消除接口虚方法调用的额外开销,高频调用场景下可带来10%左右的性能提升。 - 优化3:调整key和value的类型
如果你的double类型key本质是固定精度的数值(比如保留N位小数的结果),可以乘以对应10的N次方转为long类型作为key,long的哈希计算速度更快、碰撞概率更低,比double作为key性能高20%以上。如果计数值都是整数,把value也从double换成long,进一步降低运算开销。 - 优化4:多线程场景下用本地字典避免锁竞争
如果你的模拟是多线程运行的,不要共用全局字典加锁统计,改为每个线程创建独立的本地Dictionary做统计,所有模拟任务结束后再把各个线程的统计结果合并到全局字典。完全消除高频操作的锁竞争后,该部分性能可以提升数倍。 - 优化5:升级运行时版本
如果当前使用的是.NET Framework,升级到.NET 6+版本,.NET Core对Dictionary的实现做了大量性能优化,自带20%以上的性能提升。
内容的提问来源于stack exchange,提问作者R Suth
相关产品推荐
相关产品推荐

