C# 巨大的性能下降分配浮点值

标签 c# performance

我正在尝试优化我的代码并在其上运行 VS 性能监视器。

enter image description here

这说明简单的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。

验证该理论的要点:

  1. 您的数据集很大吗?它打赌是。
  2. 您是否以随机内存顺序访问 TagData?我敢打赌它们在内存中不是连续的。这会导致 CPU 的内存预取器功能失调。
  3. 在昂贵的行之前添加一个新行 int dummy = td.tf;。这个新行现在将是最昂贵的行,因为它会触发缓存未命中。找到一些方法来执行 JIT 未优化的虚拟加载操作。也许将所有 td.tf 值添加到本地,然后将该值传递给方法末尾的 GC.KeepAlive。这应该将内存负载保持在 JIT 发出的 x86 中。

我可能是错的,但与目前为止的其他理论相反,我的理论是可测试的

尝试使 TagData 成为 struct。这将使 term.tags 的所有项目在内存中顺序排列,并为您带来不错的性能提升。

关于C# 巨大的性能下降分配浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20410149/

相关文章:

c# - Server.Transfer 不起作用

c# - C#调试时 '~'是什么意思?

android - 可抛出 : Failed to create the SD card

Java JDK BitSet 与 Lucene OpenBitSet

java - 有没有办法在从 Java 中的输入流读取时将字节更改为整数?

c# - 如何使用 Selenium 和 C# 单击此特定元素

c# - 使用 WPF C# 同时对两个 UIElement 进行动画处理

c# - ExpandoObject 对象和 GetProperty()

java - 存储大量小文件 : archive vs. 文件系统

c++ - wxWidgets wxConfBase 写的很慢