for循环提高内存访问效率的做法
今天写程序的时候突然想到一点,记录一下:
计算机内存地址是线性排列组织的,而利用for循环对高维数组结构进行遍历处理的时候,要保证最内层for循环遍历的是高维数组的最低维度,这样可以最大化利用CPU的cache,举个例子:
假设有一个二维图像P(x,y),x为行数,0<=x<=M-1,y为列数,0<=y<=N-1。
若想遍历图像内所有的像素,写程序的时候,有以下两种嵌套for:
1 for(x=0;x<M;x++){ 2 for(y=0;y<N;y++){ 3 // ... 4 } 5 }
和
1 for(y=0;y<N;y++){ 2 for(x=0;x<M;x++){ 3 // ... 4 } 5 }
这两种实现方法都能遍历图像内像素,但是第一种效率比第二种高。
因为数据的逻辑形式虽然是高维的,但是存储在内存里的时候却仍是以一维线性的方式存储的,这就造成了高维数据在内存中进行表示的时候,最低维的数据在内存中被连续存储,而除最低维以外的其它所有维度在内存上是不连续的(对于上述例子,P(3,4)与P(3,5)在内存中是连续的,而P(3,4)和P(2,4)在内存中就不是连续的),访问不连续内存对于CPU的cache来说很不友好,会造成较大的内存访问延迟,虽然这个问题可能会被聪明的编译器查到并在编译时刻优化为cache-friendly的代码,但是保不齐有些编译器没有这种优化,所以在写程序的时候还是注意一下这一点。在访问体素块的时候最好也要先确定一下数据逻辑形式的最低维度,然后再写for。
转载于:https://www.cnblogs.com/time-flow1024/p/10065899.html
for循环提高内存访问效率的做法相关推荐
- 如何提高数据库访问效率
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...
- 如何建立JSP操作用以提高数据库访问效率
从服务器端促进程序快速开发的java Server Pages (jsp)决定它成为一种广为流行的工具.虽然呆板的一面仍然存在,然而无论它包含多少缺点,JSP能够为Web程序设计者提供很多东西,尤其是 ...
- CUDA Pro:通过向量化内存访问提高性能
CUDA Pro:通过向量化内存访问提高性能 许多CUDA内核受带宽限制,而新硬件中触发器与带宽的比率不断提高,导致带宽受限制的内核更多.这使得采取措施减轻代码中的带宽瓶颈非常重要.本文将展示如何在C ...
- Hosts文件实际应用 配置内部服务器提高访问效率和速度
一 hosts文件的作用和介绍 https://jingyan.baidu.com/article/335530da45485e19cb41c3d6.html https://www.cnblogs. ...
- 7. CUDA内存访问(一)提高篇------按部就班 ------GPU的革命
序言:从上一篇< CUDA编程接口(二)------一十八般武器>到现在,差不多有三个月了,不知道大家在"暑假"里面过得怎么样,又经历了什么?花了两个星期的睡觉前的时间 ...
- 操作系统采用哪些方法提高内存利用率
操作系统采用哪些方法提高内存利用率 从操作系统的需求开始说起 要想搞清楚操作系统采用哪些方法来提高内存利用率,首先,我们应该明白操作系统为什么需要提高内存的利用率. 计算机的系统资源分为处理机.存储器 ...
- Java内存访问重排序的研究
什么是重排序 请先看这样一段代码1 public class PossibleReordering { static int x = 0, y = 0; static int a = 0, b = 0 ...
- 提高网站访问速度的34条军规(2)
16 在Ajax请求中使用GET方法 (Use GET for AJAX Requests)<?xml:namespace prefix = o ns = "urn:schemas-m ...
- improve php,解析提高PHP执行效率
解析提高PHP执行效率 1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的 ...
- 如何让提高网站访问速度
如何让提高网站访问速度 整理方案一: 网站访问速度可以直接影响到网站的流量,而网站的访问量几乎与网站的利益直接挂钩,因此网站的速度问题成为企业及站长十分关注的问题.现在网站越来越多,不少朋友的网站打开 ...
最新文章
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Epoll模型
- Linux命令(30):tar命令-归档工具
- hadoop-0.21.0 在Windows环境下的部署(2)Hadoop配置
- ros 运行rviz时出现 QXcbConnection: XCB error: 148 错误 解决方法
- springboot导包显示不存在_(一)SpringBoot搭建基本后端应用
- linux qt 读系统信息,使用Qt获取系统版本
- 【论文笔记】node2vec:可扩展的网络特征学习
- PHP7实战开发简单CMS内容管理系统(11)批量删除栏目数据
- python运算符and_Python AND运算子
- T-SQL数据类型的细微差别(四)
- win10台式机,耳机插入没有声音
- 字节跳动实习面经(已拿offer附攻略)
- 如何将QQ群文件快速下载,怎么快速下载QQ中的文件,QQ群文件下载
- openstack部署过程5
- Quartz简介及应用场景
- 小程序如何跳转至同服务器app,微信小程序如何跳转到APP?
- 前端基础——数组的方法
- 拼团商城高保真小程序Axure原型模板
- mkdir: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initia
- 视频H.263与H.264的比较
热门文章
- AppBuilder(二)UseStageMarker
- 理解Java - AQS
- Asp.Net删除文件夹后引起Session丢失的解决办法
- Python 高层文件操作(shutil模块)(转载)
- C++11 后置返回类型
- C++11 using定义类型别名、模板别名
- docker具名和匿名挂载
- -bash: vi: command not found -bash: ls: command not found
- 解决mysql不是内部或外部命令 菜鸟教程
- (day 20 - 中序遍历加双指针)剑指 Offer 36. 二叉搜索树与双向链表