You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#事件结果出现次数统计的字典计数性能优化问题咨询

性能优化思路(按改造成本从低到高、收益从大到小排序)
  • 优化1:减少字典查找次数 + 预分配容量
    现有代码每次调用会执行2次字典查找(ContainsKey1次、索引器取值1次),属于最大的性能浪费,替换为单次TryGetValue即可,同时提前给定字典初始容量避免运行时扩容重哈希的开销:
    // 初始化时传入略高于预估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;
    }
    
    仅这个改动就能降低该部分30%~50%的耗时。
  • 优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:15:02