【问题标题】:Should I reduce set variable我应该减少设置变量
【发布时间】:2016-12-23 18:35:15
【问题描述】:

我有 2 个 C++ 代码:

代码1:减少赋值变量

While(alive)
{
if(health < healthMax) health = healthMax;
}

代码2:不减少赋值变量

While(alive)
{
health = healthMax;
}

我不知道 set 和 get 是如何工作的,但我个人认为 set 会更改/写入内存上的数据,并且只获得读取内存,因此最好 get 和 reduce set - 这就是我更喜欢代码 1 的原因现在更多。我想对了吗?

感谢您的阅读:)

【问题讨论】:

  • 谢谢你回答我。那么写入和读取数据部分呢?写入数据对内存/内存的影响是否大于读取数据?
  • 我很确定我记得看到过这个问题的副本,关于是否/何时值得使用if 来避免分配,但找不到它。

标签: c performance conditional variable-assignment


【解决方案1】:

没有。该分配有望编译为寄存器之间的移动,这比条件分支便宜。

如果health 是全局的,您可能希望手动将存储下放到循环之外的全局,但即使每次迭代都有一个存储也不错。重复存储到同一内存位置很便宜,因为它们会在 L1 缓存中命中。您可以预期每个时钟的吞吐量约为 1,而不会占用其他内核的内存带宽。

由于您将其标记为 assembly,请参阅 标记 wiki 以获取指向该平台性能详细信息的链接,尤其是 Agner Fog 的内容。许多概念与其他架构类似。

【讨论】:

  • 读写数据部分呢?写入数据对内存/ram 的影响是否大于读取数据 - 例如,写入会使 ram 比读取更热?
  • 哦,如果我不知道写入是否会使 ram 比读取更热,我不能满足?
  • @123iamking:DRAM 写入命令可能与 DRAM 读取命令的能耗大致相同。但由于缓存的原因,asm 中的每个商店都不会发生这种情况。 asm 的功能与 DRAM 看到的内存流量之间存在巨大差异。尽一切可能使您的代码平均以更少的周期运行,因为竞速睡眠对 CPU 内核功耗很重要。
  • 所以当我们做一个像 int a; 这样的语句时a = 3; // 代码 1 if(a==3){}// 代码 2 ==> 代码 1 和代码 2 对物理消耗的作用相同。
  • @123iamking:这就是为什么我说要把它编辑到你的问题中,而不是搞乱不可读的 cmets。但是if(a==3){} 效率更高,因为它什么都不做。 {} 为空,因此编译器甚至不需要进行测试。 godbolt.org/g/Q8GTce.
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多