gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:10:57 24 4
gpt4 key购买 nike

我正在尝试优化我的代码并在其上运行 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com