C++高性能编码

张开发
2026/4/17 14:59:47 15 分钟阅读

分享文章

C++高性能编码
一运行模式在探索高性能编码时一定要注意编译选项不同编译优化级别场景下同一个问题的答案可能截然相反如果是在visual studio里面运行那就简单区分debug和release即可。二cache友好1二维数组的访问二维数组的访问最好不要跳内存。#include stdio.h #include time.h #define N 30000 #define M 1000 typedef struct { int a[N]; }Node; #define OUTCLOCK \ printf(%d ,clock()-theClock); \ theClockclock(); int main() { clock_t theClock clock(); Node *p (Node *)malloc(sizeof(Node)*M); OUTCLOCK for (int j 0; j N; j)for (int i 0; i M; i)p[i].a[j] i * j 1; OUTCLOCK for (int i 0; i M; i)for (int j 0; j N; j)p[i].a[j] i * j 1; OUTCLOCK return 0; }debug模式运行输出17 81 68release模式运行输出0 45 51分析一般来说for (int i 0; i M; i)for (int j 0; j N; j)这种遍历更快因为符号cache友好。debug模式是符合结论的。但是release模式下for (int j 0; j N; j)for (int i 0; i M; i)这种写法触发了编译器优化反而优化后的性能比for (int i 0; i M; i)for (int j 0; j N; j)这种遍历更快。2大批量内存拷贝大批量内存拷贝用memcpy代替赋值语句int main() { clock_t theClockclock(); Node *p(Node *)malloc(sizeof(Node)*M); int *p2(int *)malloc(sizeof(int)*N*M); OUTCLOCK for(int i0;iM;i)for(int j0;jN;j)p2[i*Nj]p[i].a[j]; OUTCLOCK memcpy(p2,p, sizeof(int)*N*M); OUTCLOCK return 0; }运行结果0 2811 276三多线程并发1伪共享

更多文章