我正在尝试优化我的代码,并在其上运行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)
我很迷惑.
我将发布另一个理论:它可能是首次访问成员的缓存未命中td.存储器负载需要100-200个循环,在这种情况下似乎达到该方法总持续时间的约1/3.
测试这个理论的要点:
TagData以随机内存顺序访问?我打赌他们在记忆中并不顺序.这导致CPU的内存预取器功能失常.int dummy = td.tf;在昂贵的行之前添加一个新行.这条新线路现在将成为最昂贵的线路,因为它会触发缓存未命中.找到一些方法来执行JIT未优化的虚拟加载操作.也许将所有td.tf值添加到本地并将该值传递给GC.KeepAlive方法的末尾.这应该在JIT发出的x86中保持内存负载.我可能错了,但与其他理论相反,到目前为止我的可测试性.
尝试制作TagData一个struct.这将使所有项目term.tags顺序在内存中,并为您提供良好的性能提升.