ThreatSourceLibaray/docs/test_result/setintensity_bottleneck_analysis.md

89 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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: 预计算完整映射表
```csharp
// 使用更大的查找表,减少计算
private static readonly byte[] INTENSITY_TO_BYTE_TABLE = new byte[LOOKUP_TABLE_SIZE];
```
### 方案B: 简化二分查找
```csharp
// 移除距离比较直接返回left
private static byte SimpleBinarySearch(double intensity)
{
// 简化版本,牺牲一点精度换取性能
}
```
### 方案C: 移除缓存机制
```csharp
// 缓存的开销可能大于收益
// 直接使用优化的二分查找
```
## 结论
SetIntensity的性能瓶颈主要在于
1. **Dictionary查找** (94.3%性能损失)
2. **二分查找算法** (额外开销)
3. **缓存管理** (管理开销)
当前的1084万ops/sec相比纯数组访问的4.45亿ops/sec有40倍的性能差距。主要优化方向应该是简化或替换Dictionary查找机制。