C++ 代码性能优化 -- 循环分割提高并行性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ 代码性能优化 -- 循环分割提高并行性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1447字,纯文字阅读大概需要3分钟。
内容图文
对于一个可结合和可交换的合并操作来说,比如整数的加法或乘法,
我们可以通过将一组合并操作分割成 2 个或更多的部分,并在最后合并结果来提高性能。
原理:
普通代码只能利用 CPU 的一个寄存器,分割后可以利用多个寄存器。
当分割达到一个数量时,寄存器用完,性能不再提升,甚至会开始下降。
用代码来描述,如下:
// 一般情况下的代码 for (i = 1; i < n+1; i++) { res = res OPER i; } // 循环分割后代码 for (i = 1; i < n; i+=2) { res1 = res1 OPER i; res2 = res2 OPER (i+1); }
int 整数加法,性能测试结果对比如下:
整数的加法,普通代码运行 26s,循环分割后,18s。
浮点数计算的性能提升,明显大于整数,乘法的性能提升,略大于加法。
完整测试代码:
#include <time.h> #include <iostream> #define OPER + #define INIT 0 using namespace std; int calc1(int n) { int i; int res = INIT; for (i = 1; i < n+1; i++) { res = res OPER i; } return res; } int calc2(int n) { int i; int res1 = INIT; int res2 = INIT; for (i = 1; i < n; i+=2) { res1 = res1 OPER i; res2 = res2 OPER (i+1); } for (; i < n+1; i++) { res1 = res1 OPER i; } return res1 OPER res2; } typedef int (*FUNC)(int n); int time_test(FUNC calc, int param) { cout << " Result: " << calc(param) << "\t"; time_t t_begin; time(&t_begin); for (int i = 0; i < 10000; i++) for (int j = 0; j < 10000; j++) calc(param); time_t t_end; time(&t_end); cout << "Time Cost: " << difftime(t_end, t_begin) << endl; } int main() { cout << "calc1 "; time_test(calc1, 100); cout << "calc2 "; time_test(calc2, 100); return 0; }
转载于:https://www.cnblogs.com/misspy/p/3843025.html
内容总结
以上是互联网集市为您收集整理的C++ 代码性能优化 -- 循环分割提高并行性全部内容,希望文章能够帮你解决C++ 代码性能优化 -- 循环分割提高并行性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。