gpt4 book ai didi

performance - For循环性能

转载 作者:行者123 更新时间:2023-12-04 02:39:25 25 4
gpt4 key购买 nike

底线:速度很重要。

我查看了我的代码并决定寻找更多方法来提高它的效率(即使是一毫秒,那也很好)。所有这些数据成员、方法、无用的数据创建 - 我们都被教导要遵循指导方针以及如何做和不做。

循环除外。

我们总是被鼓励使用它们,因为它们有助于提高代码的可读性并帮助用户。用户。在我脑子里说完这个定义后,我想到了这个想法:

for (int i = 0; i < 100; i++)
{
//whatever code
}

假设我们知道长度的情况。这将执行代码 100 次,但它执行了 201 次可以省略以帮助机器的操作。如果我们将代码复制粘贴 100 次,丢弃初始化、条件和终止会怎样:

//Code[0]
//Code[1]
//Code[2]
//...

这是一点点,但仍然......

这是效率狂人的常见做法吗?

最佳答案

这是一个常见的优化,称为 loop unrolling 一个好的编译器应该会自动为你做这件事。根据代码的不同,许多编译器实际上也会展开没有绝对上限的循环。

举个极端的例子,你可能对Duff's device感兴趣.这允许您在具有可变上限的循环上进行循环展开,而不必担心末尾的“遗留”迭代。

如果您从 0 循环到 200,展开循环 200 倍不一定会提高您的性能。在生成多少代码和通过避免分支获得多少性能提升之间存在权衡。我认为在很多代码中展开超过 10 个并不常见,但我没有任何引用来支持这个数字。

当今大多数常见的台式机笔记本电脑都运行 x86_64 处理器,即 superscalar做乱序执行和分支预测等疯狂事情的​​架构。在您的编译器可以做的所有疯狂事情和您的 CPU 正在做的所有疯狂事情之间,没有太多需要手动调整这样的小事情。

实际上,您需要注意过度优化。我进行了很多使用 -O3 instead of -O2 进行编译的实验实际上减慢了我的应用程序而不是加速它。我还使用 LLVM 进行了一组实验,测试了在打开和关闭单个优化时相同代码(通用编译器基准测试)的性能如何变化。对于 -O2 集之外的大多数优化,优化带来的伤害与它们带来的帮助一样多。您确实需要针对您的特定应用程序测试优化,看看它们是有益还是有害。

但是,您通常会通过选择正确的数据结构和算法来获得最佳性能,而不是像这样进行一些微不足道的优化。我发现最好采用以下优化方法:

  1. 编写可读性强的代码。
  2. Profile the code看看哪个部分吃掉的时间最多。
  3. 看看我是否可以对该部分进行算法/数据结构更改以加快速度。
  4. 当所有其他方法都失败时,求助于这种低级代码转换(您希望编译器会为您处理)。

关于performance - For循环性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17376324/

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