- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
底线:速度很重要。
我查看了我的代码并决定寻找更多方法来提高它的效率(即使是一毫秒,那也很好)。所有这些数据成员、方法、无用的数据创建 - 我们都被教导要遵循指导方针以及如何做和不做。
循环除外。
我们总是被鼓励使用它们,因为它们有助于提高代码的可读性并帮助用户。用户。在我脑子里说完这个定义后,我想到了这个想法:
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
集之外的大多数优化,优化带来的伤害与它们带来的帮助一样多。您确实需要针对您的特定应用程序测试优化,看看它们是有益还是有害。
但是,您通常会通过选择正确的数据结构和算法来获得最佳性能,而不是像这样进行一些微不足道的优化。我发现最好采用以下优化方法:
关于performance - For循环性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17376324/
我是一名优秀的程序员,十分优秀!