高效编程之cache命中对于程序性能的影响

下面这个代码用两个双层循环遍历了一个二维数组里所有的元素,以我自己机器的测试
上面那个循环耗时基本为下面的一半,两个循环的时间复杂度相同,为什么会有这么大的差别?

首先要明白的是不管是几维数组,他们都是用一块地址连续的内存来存储所有的元素,而内存布局的顺序是一整行接着下一个整行排列,第一个循环是一行一行访问,所以从内存上看是顺序的遍历了这块内存,每次读取的位置都在上一次的附近,所以cache命中率高。第二个循环是一列一列访问,可以说访问的元素都不是连续的内存访问(相隔了一行的大小),从而降低了cache的命中率。

cache的命中率对多层循环的影响是最明显的,因此在设计循环逻辑的时候,如果有某个数据结构需要多次访问,尽量让其全部在最里层中完成访问,提高cache对其的命中率。


#include <stdio.h>
#include <stdlib.h>
int main()
{
int hang = 1024*8;
int lie = 1024*8;
int c = 0;
int **arr = (int **)malloc(sizeof(int*) * lie);
for(c = 0; c < lie; c++)
{
arr[c] = (int*)malloc(sizeof(int) * hang);
}

struct timeval time1, time2;
int i, j;

gettimeofday(&time1, 0);
for(j = 0; j < lie; j++)
{
for(i = 0; i < hang; i++)
{
arr[j][i] ++;
}

}
gettimeofday(&time2, 0);
printf("time %f\n", (double)(time2.tv_sec-time1.tv_sec) + (double)(time2.tv_usec-time1.tv_usec) /1000000);

gettimeofday(&time1, 0);
for(i = 0; i < hang; i++)
{
for(j = 0; j < lie; j++)
{
arr[j][i] ++;
}

}
gettimeofday(&time2, 0);
printf("time %f\n", (double)(time2.tv_sec-time1.tv_sec) + (double)(time2.tv_usec-time1.tv_usec) /1000000);

return 0;
}

高效编程之cache命中对于程序性能的影响

时间: 2024-10-10 03:15:57

高效编程之cache命中对于程序性能的影响的相关文章

【设计优化】-使用缓存(Cache)提高程序性能

        缓存(Cache)就是一块用来存放数据的内存空间.主要作用是暂存数据处理结果,并提供下次访问使用.         缓存的使用非常普遍,比如,浏览器都会在本地缓存页面,从而减少HTTP 的访问次数.又如服务器系统开发时,设计人员为一些核心的 API 加上缓存,从而提高系统的缓存时间.         最简单的缓存实现可以使用 HashMap .当然,这样做会有很多问题,如何时清理无效的数据:如何防止缓存数据过多而导致内存溢出等.一个稍好的方案是使用 WeakHashMap,使用弱

聊聊我的高效编程之路

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:在程序开发过程中.一些IDE的配置.经常使用代类的积累以及经常使用框架的使用. 能帮助我们迅速写好代码,高速定位错误.同一时候,又有利于我们高速构造和部署,以及进行兴许的迭代开发. 文件夹: 一.IDE配置篇 二.规范project篇 三.经常使用代码篇 四.经常使用框架篇 五.其它工具 一.IDE配置篇 平时开发由于是选用Eclipse,所以在配置上假设一開始就配置好的话,开发的过

iOS 程序性能优化

前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写代码时就萦绕在我们脑子里.了解 iOS 程序性能优化的相关知识点,从一开始就把它们落实到代码中是一种好的习惯. 初级技巧 使用复用机制 在我们使用 UITableView 和 UICollectionView 时我们通常会遇到「复用 Cell」这个提法,所谓「复用 Cell」就是指当需要展示的数据条

C++ 应用程序性能优化

C++ 应用程序性能优化 C++ 应用程序性能优化 [email protected] 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方程,以及非线性优化的一些算法,如BFGS,FRPR,PSO等等用于多元函数的极值求解,所以这些数值算法的性能直接影响系统的性能.软件的性能优化是计算机软件开发过程中需要一直关注的重要因素,因此有必要学习下C++应用程序性能优化的方法. 在网上寻找相关资料时,发现这方

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

黑马程序员——网络编程之CTP传输

TCP传输 Socket和ServerSocket,实现了两台机器间的套接字端点,绑定本机IP地址.建立客户端和服务端,客户端对应的对象是Socket,服务端对应的对象是ServerSocket. //客户端部分 public class ClientA { private String filePath ; public String getFilePath() {return filePath;} public void setFilePath(String filePath ) { thi

[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种.NET中特别重要的缓布技术Cache.利用Cache提升程序性能. 1. 缓存Cache的命名空间 .NET中对缓存有两个命名空间 命名空间1:System.Web.Caching 命名空间2:System.Runtime.Caching 引用范围:这两个命名空间,都可以在Web和非WEB应用程序中

ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await

原文:ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await PS:异步编程的本质就是新开任务线程来处理. 约定:异步的方法名均以Async结尾. 实际上呢,异步编程就是通过Task.Run()来实现的. 了解线程的人都知道,新开一个线程来处理事务这个很常见,但是在以往是没办法接收线程里面返回的值的.所以这时候就该await出场了,await从字面意思不难理解,就是等待的意思. 执行await的方法必须是async修饰的,并且是Task

Python学习【第26篇】:并发编程之IO模型

python并发编程之IO模型, 了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义,其实绝大多数函数都是同步调用.但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务. #举例: #1. multiprocessing.Pool下的apply #发起同步调用后,就在原地等着任务结束,