看到一篇文章,说最近阅读LAMMPS源码,悟出了很多道理。在计算性能优化这块,源代码作者很多写法我最初不以为意,后来发现是作者有意为之,就是为了把计算性能优化到极致。做计算仿真软件,也特别需要注意这些吧,记录下,在后续编码时注意。
原文链接:https://mp.weixin.qq.com/s/o3tiUTUonbdHVxqczlQEZw?nwr_flag=1#wechat_redirect
1 汇总方法:
主要包括几条:
- 能做乘法就不做除法;
- 能做平方就不做开方;
- 能做连乘就不求幂;
- 能提前算的常量就不要放到循环里算;
2 尝试和时间对比
2.1 C++下的乘法和除法
#include <iostream>
#include <chrono>
using namespace std;
void chengfa(int a, int b, int n);
void chufa(int a, int b, int n);
int main()
{int a = 10;int b = 3;int n = 1000000;chengfa(a,b,n);chufa(a,b,n);return 0;
}void chengfa(int a,int b,int n) {int c;auto start1 = std::chrono::high_resolution_clock::now();for (int i = 0; i < n; i++){c = a * b;}auto end1 = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed1 = end1 - start1;cout << "执行乘法的时间:" << elapsed1.count() << "s\n" << endl;
}void chufa(int a, int b, int n) {int d;auto start2 = std::chrono::high_resolution_clock::now();for (int i = 0; i < n; i++){d = a / b;}auto end2 = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed2 = end2 - start2;cout << "执行乘法的时间:" << elapsed2.count() << "s\n" << endl;
}
少次计算,反倒除法快;多次,乘法显示出了优势;