我正在尝试优化我的代码并在其上运行 VS 性能监视器。
这说明简单的float赋值占用了大块的算力??我不明白这怎么可能。
这是 TagData 的代码:
public class TagData
{
public int tf;
public float tf_idf;
}
所以我真正做的是:
float tag_tfidf = td.tf_idf;
我很困惑。
最佳答案
我再贴一个理论:可能是第一次访问td
成员的cache miss。内存加载需要 100-200 个周期,在这种情况下似乎占该方法总持续时间的大约 1/3。
验证该理论的要点:
- 您的数据集很大吗?它打赌是。
- 您是否以随机内存顺序访问
TagData
?我敢打赌它们在内存中不是连续的。这会导致 CPU 的内存预取器功能失调。 - 在昂贵的行之前添加一个新行
int dummy = td.tf;
。这个新行现在将是最昂贵的行,因为它会触发缓存未命中。找到一些方法来执行 JIT 未优化的虚拟加载操作。也许将所有td.tf
值添加到本地,然后将该值传递给方法末尾的GC.KeepAlive
。这应该将内存负载保持在 JIT 发出的 x86 中。
我可能是错的,但与目前为止的其他理论相反,我的理论是可测试的。
尝试使 TagData
成为 struct
。这将使 term.tags
的所有项目在内存中顺序排列,并为您带来不错的性能提升。
关于C# 巨大的性能下降分配浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20410149/