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

Che*_*ebz 13 c# performance

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

在此输入图像描述

它表明浮点数的简单分配占据了很大一部分计算能力?我不明白这是怎么可能的.

这是TagData的代码:

public class TagData
{
    public int tf;
    public float tf_idf;
}
Run Code Online (Sandbox Code Playgroud)

所以我真正做的就是:

float tag_tfidf = td.tf_idf;
Run Code Online (Sandbox Code Playgroud)

我很迷惑.

usr*_*usr 7

我将发布另一个理论:它可能是首次访问成员的缓存未命中td.存储器负载需要100-200个循环,在这种情况下似乎达到该方法总持续时间的约1/3.

测试这个理论的要点:

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

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

尝试制作TagData一个struct.这将使所有项目term.tags顺序在内存中,并为您提供良好的性能提升.