关于使用CPU缓存的一个小栗子

一、背景知识

CPU缓存(Cache Memory),是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。

----以上引自度娘百科,懒呐- -"

缓存中是由缓存行来管理的,典型的缓存行大小为64bytes,一次读入就是64bytes。即使仅仅想读入一个Int64,实际上也是将其后的56bytes也读进来。

因此如果需要操作一个Length为8的Int64数组,一次读入,次次命中,嗨吧~~

 

二、栗子

设计了一个小栗子,是累加一个二维Int64的数据:

如果从一维循环,那么类似于顺序读入,这样应该能实现1次读入缓存,后7次命中,性能应该会好一些。

如果从二维循环,那么读入一次缓存,后面的就没办法命中了,性能一定是底很多。

 

三、栗子代码

 1 using System;
 2 
 3 namespace PerformanceOfCacheLineTest
 4 {
 5     class Program
 6     {
 7         private const Int64 ONE_DIMENSION = 1024 * 1024;
 8         private const Int64 TWO_DIMENSION = 64;
 9 
10         static void Main(string[] args)
11         {
12             Int64[][] array = new Int64[ONE_DIMENSION][];
13             for (int i = 0; i < ONE_DIMENSION; i++)
14             {
15                 array[i] = new Int64[TWO_DIMENSION];
16                 for (int j = 0; j < TWO_DIMENSION; j++)
17                 {
18                     array[i][j] = 0;
19                 }
20             }
21 
22             Console.WriteLine("starting....");
23 
24             DateTime start = System.DateTime.Now;
25             Int64 sum = 0;
26             for (int i = 0; i < ONE_DIMENSION; i++)
27             {
28                 for (int j = 0; j < TWO_DIMENSION; j++)
29                 {
30                     sum += array[i][j];
31                 }
32             }
33             DateTime end = System.DateTime.Now;
34             Console.WriteLine("one dimension first: using " + (end - start).TotalMilliseconds);
35 
36 
37             start = System.DateTime.Now;
38             for (int j = 0; j < TWO_DIMENSION; j++)
39             {
40                 for (int i = 0; i < ONE_DIMENSION; i++)
41                 {
42                     sum += array[i][j];
43                 }
44             }
45             end = System.DateTime.Now;
46             Console.WriteLine("two dimension first: using " + (end - start).TotalMilliseconds);
47 
48             Console.WriteLine("...ended");
49             Console.Read();
50         }
51     }
52 }

 

四、栗子结果

 

五、结论

差距还是很明显的哟,印证了假设。

作为一枚肉鸟,学到新的东西总是让人耳目一新,世界观都不一样了呢*_*。。。需要学习的东西还很多呀!!!

转载于:https://www.cnblogs.com/DexterDi/p/4371613.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

输入快捷键显示未知命令_「干货」华为VRP基础和常用命令了解一下

华为VRP系统的理解手机里面是安卓系统&#xff0c;电脑里面windows系统在我们路由器、交换机、防护墙等网络设备中他们当中的系统就是VRP系统(通用路由平台)可以理解为华为的类型交换机&#xff0c;华为类型路由器以及防火墙他们之间的命令行几乎都是一样华为设备提供丰富的功能…

2 字符串求交集_PostGIS教程十八:维数扩展的9交集模型

一、什么是维数扩展的9交集模型"维数扩展的9交集模型-Dimensionally Extended 9-Intersection Model"&#xff08;DE9IM&#xff09;是一个用于建模两个空间对象如何交互的框架。首先&#xff0c;每个空间对象都具有&#xff1a;内部&#xff08;interior)边界&#…

房子里的K2 BPM业务流程管理

房…子这件事上&#xff0c;尴尬实在太多。 ಥ_ಥ 职场新人&#xff0c;租房很尴尬&#xff1b; 未婚男女&#xff0c;婚房很尴尬&#xff1b; 有下一代的&#xff0c;学区房很尴尬&#xff1b; 耄耋之年&#xff0c;养老房很尴尬... ▽ 甭管买房、租房、装修、设计&#xff0c…

大学生体测成绩判断c语言_体育改革瞄准高校,体测不过关可能真的毕不了业了...

「ECO氪体」体育圈人www.ecosports.cn文/ 圈哥回忆上学期间&#xff0c;体育最令你头疼的时刻是什么&#xff1f;是不是在体育中考将要到来之前&#xff0c;还没日没夜枯燥的训练和近乎苛刻的饮食控制&#xff1f;而现在&#xff0c;体育似乎不想再局限于中学了。图片截自&…

gojs 节点右键点击事件_SWMM快速建模方法(3)—建立管线上下游节点编号

在SWMM中&#xff0c;管线需要输入上下游节点检查井编号&#xff0c;那么在GIS中可否实现自动获取上下游节点编号呢&#xff1f;思路是这样的&#xff0c;首先获得管线两端节点&#xff0c;然后对端点进行融合&#xff0c;删除重复的节点&#xff0c;最后根据坐标关系分别建立管…

android 设置setmultichoiceitems设置初始化勾选_Linux内核启动:虚拟盘空间设置和内存管理结构初始化...

1. 设置虚拟盘并初始化接下来main函数将对外设中的虚拟盘区进行设置。 检查makefile文件中"虚拟盘使用标志"是否设置&#xff0c; 以此确定系统是否使用了虚拟盘(假设有虚拟盘&#xff0c;大小设置为2 MB)。 操作系统从缓冲区的末端起开辟2MB内存空间设置为虚拟盘&am…

关闭mysql服务的方法有哪些_MySQL--启动和关闭MySQL服务

介绍了启动服务器的两种方式&#xff0c;以及可能遇到的问题第一种&#xff1a;系统服务1)可以通过右击方式一步步找到服务右击计算机->选择管理->找到服务&#xff0c;然后双击打开&#xff0c;找到mysql&#xff0c;我安装的是mysql8.0所以服务的名称显示是mysql80&…

devstack mysql_DevStack部署OpenStack开发环境 - 问题总结

建议在使用DevStack搭建OpenStack开发环境前,先安装好开发工具包组.特别是gcc,主要一定是在yum update -y 之前,否则更新完系统后,在安装开发工具包会出现很多依赖包因为版本更新而无法安装.要部署OpenStack需要注意若电脑配置不高,我自己的经验是先最小化或基本Web安装,然后,再…

linux 安装RabbitMQ 注意版本

Linux下安装RabbitMQ 一下载依赖包 1.下载Rabbitmq 所依赖的环境gcc、erlang包和rabbitmq包&#xff0c;这里演示是网上下载gcc 依赖 1yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xzerla…

jquery.js把我的时间修改了为什么?_电气老手在PLC程序调试修改时的几个必备小窍门,看你知道几个?...

我们工程师在设计程序&#xff0c;调试程序&#xff0c;修改程序的时候&#xff0c;为了方便以后对程序的理解&#xff0c;最好是对程序进行注释&#xff0c;能够对程序进行注释也是比较好的一个习惯。为什么这么说呢&#xff1f;因为我们人的脑容量是有限的&#xff0c;或多或…

android如何用adb shell启动应用程序

昨天研究了很久&#xff0c;可能由于基础比较菜吧&#xff0c;所以&#xff0c;没有搜到一个可以直接解决问题的&#xff0c;需要综合几个之后&#xff0c;问题得以解决&#xff0c;记下方法&#xff0c;为了方便自己之后遇到同样问题&#xff0c;也为了方便搜索同样问题的朋友…

mysql数据库删除操作指令_MySQL删除数据库的命令是什么?

删除数据库的命令是&#xff1a;“DROP DATABASE 数据库名;”&#xff1b;例“drop database student;”就是删除名为student的数据库。“DROP DATABASE”语句可以用于删除数据库。使用drop 命令删除数据库drop database语句可以用于删除数据库。drop database命令格式&#xf…

mariadb与mysql的兼容_「MySQL架构」MariaDB versus MySQL: Compatibility

完全替代MySQLMariaDB版本的功能相当于一个“完全替代”的MySQL版本&#xff0c;但有一些限制。这意味着:MariaDB的数据文件通常是二进制的&#xff0c;与MySQL版本的数据文件兼容。所有的文件名和路径通常是相同的。数据和表定义文件(.frm)文件是二进制兼容的。请参阅下面的注…

mysql数据存储和函数_MySQL数据库——存储和函数

一、存储过程1 基本语法CREATE PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_body格式[IN|OUT|INOUT]param_name type2. IN、OUT、INOUT参数(1)带84存储过程实例1 #带多重IF的存储过程2 CREATE PROCEDURE SP_SGRADE_LEVEL(IN p_level char(Repeat语…

在Salesforce中创建Approval Process

在Salesforce中可以创建Approval Process来实现审批流程的功能&#xff0c;实际功能与我们常说的Workflow很相似&#xff0c;具体的设置步骤如下所示 1&#xff09;&#xff1a;选择对应的Object去创建对应的Approval Process 2&#xff09;&#xff1a;点击下图中的Create New…

Python 运算符括号

转载于:https://www.cnblogs.com/fanweisheng/p/11236193.html

计算机二级java试题_计算机二级考试《Java》试题及答案

计算机二级考试《Java》试题及答案选择题(每小题2分&#xff0c;共50分)下列各题A、B、C、D、 四个选项中&#xff0c;只有一个选项是正确的&#xff0c;请将正确选项涂写在答题卡相应的位置上&#xff0c;答在试卷上不得分。(11)下列对Java语言的叙述中&#xff0c;错误的是()…

绕过waf mysql爆库_iwebsec刷题记录-SQL注入漏洞

被推荐了这个web平台&#xff0c;感觉挺适合新手的&#xff0c;网上搜了下没看到有人写wp&#xff0c;这里本入门萌新来稍微整理下自己解题的过程SQL注入漏洞01-数字型注入http://localhost:32774/sqli/01.php?id1发现有报错You have an error in your SQL syntax; check the …

【Vue】组件的基础与组件间通信

转载&#xff1a;https://segmentfault.com/a/1190000016409329 Vue.js 最核心的功能就是组件&#xff08;Component&#xff09;&#xff0c;从组件的构建、注册到组件间通信&#xff0c;Vue 2.x 提供了更多方式&#xff0c;让我们更灵活地使用组件来实现不同需求。 一、构建组…

设计模式的功力长了!

今天醒来后&#xff0c;感觉理解了原来比较复杂的一些设计模式&#xff0c;很好&#xff0c;就像小时候感觉长高一样。学习设计模式有一年多了。进步需要时间&#xff01;