怎样写出更快的C程序
来源:互联网 发布:ios手机虚拟定位软件 编辑:程序博客网 时间:2024/04/29 14:28
由于存储器的设计和语言的存储安排,一个具有良好局部性的程序往往可以更快的执行。——总结自《深入理解计算机系统》
- 局部性通常有两种不同的形式:时间局部性和空间局部性。在一个具有良好时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。
总之,编写高速缓存友好的代码涉及两个重要问题。
对局部变量的反复引用是好的,因为编译器能够将它们缓存在寄存器文件中(时间局部性)。
步长为1的引用模式是好的,因为存储器层次结构中所有层次上的缓存都是将数据存储为连续的块(空间局部性)。
按照上述思想结合 定时器,以及C语言关于数组的存储方式。我们实验比较按照列访问二维数组和按照行访问二维数组的效果差别。
sumarray.c
/* csapp page 424*/#include <stdio.h>#include "timer.h"int sumarrayrows(int a[][150], int nrow, int ncol){ int i, j, sum = 0; for (i = 0; i < nrow; i++ ) { for (j = 0; j < ncol; j++) { sum += a[i][j]; } } return sum;}int sumarraycols(int a[][150], int nrow, int ncol){ int i, j, sum = 0; for (j = 1; j < ncol; j++ ) { for (i = 0; i < nrow; i++) { sum += a[i][j]; } } return sum;}intmain(){ double timer1, timer2; int i, j, sum; int a[100][150]; for (i = 0; i < 100; i++ ) { for (j = 0; j < 150; j++) { a[i][j] = 1; } } timer_start(timer1); sum = sumarrayrows(a, 100, 150); timer_stop(timer1); timer_start(timer2); sum = sumarraycols(a, 100, 150); timer_stop(timer2); printf("time of summaryrow: %.2lfns\n", timer1); printf("time of summarycol: %.2lfns\n", timer2); return 0;}
上述程序的输出结果如下:
从图中可以看出,对这个特定二维数组的访问,如果改变行列访问顺序,加速了7%左右。
0 0
- 怎样写出更快的C程序
- 如何写出运行速度更快的代码:硬件篇
- 怎样写出健壮的CLI程序
- C程序怎样组织更有结构性
- 让程序跑的更快
- 纯C写出的时钟程序
- 讨论:C程序怎样组织更有结构性
- [转]C程序怎样组织更有结构性
- 通宵以后怎样更快恢复身体
- 怎样让电脑运行更快
- 怎样使javaWEB项目运行更快
- 让你的Java 程序跑的更快
- 使用静态数组让程序“跑”的更快
- 使用调度程序构建反应速度更快的应用程序
- 更快的学习
- 更快的memcpy
- 更快的AtomicInteger
- 《Java程序性能优化 让你的Java程序更快、更稳定》阅读笔记
- 学习python的第十一天
- PHP递归读取一个路径下的目录及文件
- 一天一个设计模式---迭代器模式
- 常用meta整理
- 【PHP】验证码实现
- 怎样写出更快的C程序
- 如何判断Android app退后台、进前台
- Processing-Minim翻译----------Class Minim
- 161122
- Course Schedule
- ios支付宝客户端集成流程
- 彩笔笔记2016/11/22——rpm与yum安装程序
- 用main函数的参数实现简易计算器
- 函数实现键盘输入整型数,将其转换成字符串输出。123456789 "123456789"