ThreatSourceLibaray/docs/test_result/setintensity_bottleneck_analysis.md

2.3 KiB
Raw Blame History

SetIntensity性能瓶颈分析报告

测试结果总结

1. 纯数组访问性能

  • 性能: 444,938,821 ops/sec (4.45亿次/秒)
  • 结论: 数组访问本身不是瓶颈

2. ConvertToByte组件性能分析

组件 性能 (ops/sec) 相对性能
DoubleToLong转换 452,857,531 基准 (100%)
Dictionary查找 25,745,857 5.7%
二分查找 33,593,910 7.4%

3. 实际场景性能对比

场景 性能 (ops/sec) 相对于纯数组访问
纯数组访问 444,938,821 100%
全零值 387,356,678 87%
单一非零值 18,612,235 4.2%
缓存优化场景 11,682,734 2.6%
随机值 7,196,264 1.6%

瓶颈分析

主要瓶颈识别

  1. Dictionary查找是最大瓶颈

    • 从4.45亿ops/sec降到2574万ops/sec
    • 性能损失: 94.3%
  2. 二分查找是第二瓶颈

    • 性能: 3359万ops/sec
    • 比Dictionary稍好但仍然很慢
  3. 缓存未命中时的复合开销

    • 随机值场景: 719万ops/sec
    • 包含Dictionary查找 + 二分查找 + 缓存更新

性能下降原因

  1. Dictionary.TryGetValue开销

    • 哈希计算
    • 内存访问模式不友好
    • 装箱/拆箱开销
  2. 二分查找开销

    • 多次数组访问
    • 分支预测失败
    • Math.Abs计算
  3. 缓存管理开销

    • 缓存大小检查
    • 新条目插入

优化建议

方案A: 预计算完整映射表

// 使用更大的查找表,减少计算
private static readonly byte[] INTENSITY_TO_BYTE_TABLE = new byte[LOOKUP_TABLE_SIZE];

方案B: 简化二分查找

// 移除距离比较直接返回left
private static byte SimpleBinarySearch(double intensity)
{
    // 简化版本,牺牲一点精度换取性能
}

方案C: 移除缓存机制

// 缓存的开销可能大于收益
// 直接使用优化的二分查找

结论

SetIntensity的性能瓶颈主要在于

  1. Dictionary查找 (94.3%性能损失)
  2. 二分查找算法 (额外开销)
  3. 缓存管理 (管理开销)

当前的1084万ops/sec相比纯数组访问的4.45亿ops/sec有40倍的性能差距。主要优化方向应该是简化或替换Dictionary查找机制。