- 浏览: 1065322 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (399)
- C++ (39)
- Java (74)
- Java界面开发学习笔记 (4)
- Java用户的c++之旅 (0)
- 自言自语 (12)
- DSP (1)
- MCU (0)
- CG (0)
- Jabber (0)
- Gloox (0)
- Linux (11)
- Windows (19)
- Networks (4)
- Jobs (0)
- PHP (1)
- JSP (2)
- 生活 (35)
- C (2)
- Qt4 (2)
- C# (50)
- WPF (5)
- ASP (2)
- FLEX (47)
- SQL (20)
- JavaScript (12)
- SharePoint (6)
- GWT (1)
- Dojo (9)
- HTML (11)
- Others (7)
- 如何安装配置系列 (7)
- UML (2)
- Android (3)
- alibaba (1)
最新评论
-
zxjlwt:
学习了http://surenpi.com
Firefox插件开发: Hello World! -
ylldzz:
楼主知道MVEL怎么调试么
MVEL简介及快速使用 -
blueman2012:
您好,可否提供源码下载,我把您的代码贴过来后,好多报错的,谢谢 ...
Log4J日志解析 -
svygh123:
你的游标都没有关闭呢!
MYSQL游标嵌套循环示例 -
dizh:
写的很好啊
MVEL简介及快速使用
某型CPU的一级数据缓存大小为16K字节,cache块大小为64字节;二级缓存大小为256K字节,cache块大小为4K字节,采用二路组相联。经测试,下面两段代码运行时效率差别很大,请分析哪段代码更好,以及可能的原因。
为了进一步提高效率,你还可以采取什么办法?
A段代码:
int matrix[1023][15];
const char *str = "this is a str";
int i, j, tmp, sum = 0;
tmp = strlen(str);
for(i = 0; i < 1023; i++)
for(j = 0; j < 15; j++)
sum += matrix[i][j] + tmp;
B段代码 :
int matrix[1025][17];
const char *str = "this is a str";
int i, j, sum = 0;
for(i = 0; i < 17; i++)
for(j = 0; j < 1025; j++)
sum += matrix[j][i] + strlen(str);
A段代码效率要远远高于B段代码,原因有三:
1、
B 效率低最要命的地方就是每次都要调用strlen()函数,这是个严重问题,属于逻辑级错误。假设A的两层循环都不改变,仅仅是把A的那个循环里面的 temp换成strlen()调用,在Windows 2000 (Intel 双) 下测试,竟然是A的执行时间的3.699倍。(这里没有涉及不同CPU有不同的Cache设计)仅仅是这一点就已经说明B段代码垃圾代码。
2、
这也是一个逻辑级的错误。在这里我们再做个试验,A、B段代码分别采用大小一样的数组[1023][15]、[1023][16]、[1023][17],只是在循环上采取了不同的方式。两者在运行时间上也是有很大差异的了。B的运行时间大概是A的1.130倍。
那么这是因为什么呢?其实也很简单,那就是A段代码中的循环执行语句对内存的访问是连续的,而B段代码中的循环执行语句对内存的访问是跳跃的。直接降低了B代码的运行效率。
这里不是内层循环执行多少次的问题,而是一个对内存访问是否连续的问题。
3、
A的二维数组是[1023][15],B的二维数组是[1027][17],在这里B段代码有犯了一个CPU级错误(或者是Cache级的错误)。
因为在Cache中数据或指令是以行为单位存储的(也可以说是Cache块),一行又包含了很多字。如现在主流的设计是一行包含64Byte。每一行拥有一个Tag。因此,假设CPU需要一个标为Tag 1的行中的数据,它会通过CAM对Cache中的行进行查找,一旦找到相同Tag的行,就对其中的数据进行读取。
A的是15 *4B = 60B,一个Cache行刚好可以存储。B的是17*4B = 68B,超过了一个Cache行所存储的数据。很明显17的时候命中率要低于15的时候。
现在我们先不管A、B的循环嵌套的顺序,仅仅拿A段代码来做个试验,我们将会分三种情况来进行:
[1023][15] [1023][16] [1023][17]
运行结果并没有出乎意料之外 17 的时候的运行时间大概是 15 的时候的1.399倍,除去有因为17的时候多执行循环,17/15 = 1.133 。进行折算,17的时候大概是15的时候的1.265倍。
16的时候的执行时间要比15的时候的执行时间要短,因为是16的时候,Cache命中率更高。16/15 = 1.066 ,而15的执行时间却是16的1.068倍,加上16多执行的消耗,进行折算,15的时候大概是16的时候执行时间的1.134倍。
因为A段代码是15,而B段代码是17,在这一点上B段代码的效率要低于A段代码的效率。这是一个CPU级的错误(或者是Cache级的错误),这里涉及到Cache的块大小,也就涉及到Cache命中率,也就影响到代码效率。
不再假设什么,仅仅对A段和B段代码进行测试,B段代码的执行效率将是A段代码执行效率的3.95倍。当然最大的罪魁祸首就是B中的重复调用strlen()函数。后面两个错误告诉我们当需要对大量数据访问的时候,一定要注意对内存的访问要尽量是连续而且循环内层的访问接近Cache的块大小,以提高Cache的命中率,从而提高程序的运行效率。
所以可以对代码进行一下修改:
#define XX 15
#define YY 1023
int matrix[XX][YY];
const char *str = "this is a str";
int i, j, tmp, sum = 0;
tmp = strlen(str);
for(i = 0; i < XX; i++)
for(j = 0; j < YY; j++)
sum += matrix[i][j] + tmp;
这个程序仅仅是把数组的声明给颠倒了一下,循环也颠倒了一下,看起来和运行起来和上面给出的A段代码没有多大的区别。但是如果当XX很小,比如:8,那么这段程序和给出的A段代码就有区别了。这是因为这样做可以提高Cache的命中率。
这是尹宝玲老师出的题吧?
我个人觉得就现阶段而言 稳定性比效率要高很多
而且这些东西在虚拟机上是不是可以由专门的程序来优化?
孟老大?
为了进一步提高效率,你还可以采取什么办法?
A段代码:
int matrix[1023][15];
const char *str = "this is a str";
int i, j, tmp, sum = 0;
tmp = strlen(str);
for(i = 0; i < 1023; i++)
for(j = 0; j < 15; j++)
sum += matrix[i][j] + tmp;
B段代码 :
int matrix[1025][17];
const char *str = "this is a str";
int i, j, sum = 0;
for(i = 0; i < 17; i++)
for(j = 0; j < 1025; j++)
sum += matrix[j][i] + strlen(str);
A段代码效率要远远高于B段代码,原因有三:
1、
B 效率低最要命的地方就是每次都要调用strlen()函数,这是个严重问题,属于逻辑级错误。假设A的两层循环都不改变,仅仅是把A的那个循环里面的 temp换成strlen()调用,在Windows 2000 (Intel 双) 下测试,竟然是A的执行时间的3.699倍。(这里没有涉及不同CPU有不同的Cache设计)仅仅是这一点就已经说明B段代码垃圾代码。
2、
这也是一个逻辑级的错误。在这里我们再做个试验,A、B段代码分别采用大小一样的数组[1023][15]、[1023][16]、[1023][17],只是在循环上采取了不同的方式。两者在运行时间上也是有很大差异的了。B的运行时间大概是A的1.130倍。
那么这是因为什么呢?其实也很简单,那就是A段代码中的循环执行语句对内存的访问是连续的,而B段代码中的循环执行语句对内存的访问是跳跃的。直接降低了B代码的运行效率。
这里不是内层循环执行多少次的问题,而是一个对内存访问是否连续的问题。
3、
A的二维数组是[1023][15],B的二维数组是[1027][17],在这里B段代码有犯了一个CPU级错误(或者是Cache级的错误)。
因为在Cache中数据或指令是以行为单位存储的(也可以说是Cache块),一行又包含了很多字。如现在主流的设计是一行包含64Byte。每一行拥有一个Tag。因此,假设CPU需要一个标为Tag 1的行中的数据,它会通过CAM对Cache中的行进行查找,一旦找到相同Tag的行,就对其中的数据进行读取。
A的是15 *4B = 60B,一个Cache行刚好可以存储。B的是17*4B = 68B,超过了一个Cache行所存储的数据。很明显17的时候命中率要低于15的时候。
现在我们先不管A、B的循环嵌套的顺序,仅仅拿A段代码来做个试验,我们将会分三种情况来进行:
[1023][15] [1023][16] [1023][17]
运行结果并没有出乎意料之外 17 的时候的运行时间大概是 15 的时候的1.399倍,除去有因为17的时候多执行循环,17/15 = 1.133 。进行折算,17的时候大概是15的时候的1.265倍。
16的时候的执行时间要比15的时候的执行时间要短,因为是16的时候,Cache命中率更高。16/15 = 1.066 ,而15的执行时间却是16的1.068倍,加上16多执行的消耗,进行折算,15的时候大概是16的时候执行时间的1.134倍。
因为A段代码是15,而B段代码是17,在这一点上B段代码的效率要低于A段代码的效率。这是一个CPU级的错误(或者是Cache级的错误),这里涉及到Cache的块大小,也就涉及到Cache命中率,也就影响到代码效率。
不再假设什么,仅仅对A段和B段代码进行测试,B段代码的执行效率将是A段代码执行效率的3.95倍。当然最大的罪魁祸首就是B中的重复调用strlen()函数。后面两个错误告诉我们当需要对大量数据访问的时候,一定要注意对内存的访问要尽量是连续而且循环内层的访问接近Cache的块大小,以提高Cache的命中率,从而提高程序的运行效率。
所以可以对代码进行一下修改:
#define XX 15
#define YY 1023
int matrix[XX][YY];
const char *str = "this is a str";
int i, j, tmp, sum = 0;
tmp = strlen(str);
for(i = 0; i < XX; i++)
for(j = 0; j < YY; j++)
sum += matrix[i][j] + tmp;
这个程序仅仅是把数组的声明给颠倒了一下,循环也颠倒了一下,看起来和运行起来和上面给出的A段代码没有多大的区别。但是如果当XX很小,比如:8,那么这段程序和给出的A段代码就有区别了。这是因为这样做可以提高Cache的命中率。
评论
2 楼
shansun123
2009-05-11
mengyou0304 写道
这是尹宝玲老师出的题吧?
我个人觉得就现阶段而言 稳定性比效率要高很多
而且这些东西在虚拟机上是不是可以由专门的程序来优化?
孟老大?
1 楼
mengyou0304
2009-05-11
这是尹宝玲老师出的题吧?
我个人觉得就现阶段而言 稳定性比效率要高很多
而且这些东西在虚拟机上是不是可以由专门的程序来优化?
我个人觉得就现阶段而言 稳定性比效率要高很多
而且这些东西在虚拟机上是不是可以由专门的程序来优化?
发表评论
-
错误的结果 2 (从“C:\Program Files\Microsoft Visual Studio 8\VC\bin\cl.exe
2010-05-31 17:59 2127一般是项目的配置出问题了,可以禁用优化试试。 -
C++“读取位置 0x****** 时发生访问冲突”的可能原因
2010-05-31 16:41 18894这种错误的意思一般是指访问了不属于自己的内存空间,出现这种错误 ... -
/MD、MDd 和 /MT、MTd
2010-05-31 14:42 3175这里总结下他们的区别 后面的那个'd'是代表DEBUG版 ... -
如何解决“Invalid Address specified to RtlValidateHeap”错误?
2010-05-31 14:00 4758一个可能的原因:在不同模块(工程)之间传递 ... -
设置C++类库输出类型(DLL or LIB)
2010-05-26 17:00 2529打开工程属性,然后选择“配置属性 --> 常规 --&g ... -
C++如何获取系统进程列表
2010-05-20 16:33 4226PROCESSENTRY32 pe32; // 在使 ... -
【转】OpenCV中IplImage 与 Gdiplus 中Bitmap之间的相互转换
2010-05-19 15:05 4183// pIplImage 需要外部释放 Mosesyua ... -
如何在Visual Studio环境中创建和调用类库(DLL+LIB) + 关于LibSVM的使用
2010-05-09 18:23 8283好久没有使用C++做开发,所以对C++的开发环境( ... -
关于构造函数初始化列表顺序的面试题
2009-06-01 22:46 1521#include <iostream> #i ... -
编写类String的构造函数、析构函数和赋值函数
2009-06-01 22:22 5203这个在面试或笔试的时候常问到或考到。 已知类String的原 ... -
深度探索智能指针(Smart Pointer)
2009-06-01 16:07 1841主题索引: 一、剖析C++标准库智能指针(std::auto ... -
Windows下的Boost库的使用
2009-05-31 17:03 2790我采用的是VC8.0和boost_1_35_0。自己重新编译b ... -
string与char*
2009-05-31 16:50 22171、C++ 里有字符串类型string ,最大可支持1G,可用 ... -
C++语言中数组指针和指针数组彻底分析(系列一)
2009-05-31 16:39 1637近来在论坛中机场经常看到有关数组指针和指针数组的讨论。这个是学 ... -
下面的程序会在哪一行崩溃---指针安全问题
2009-05-31 14:47 1755struct S { int i; int* p ... -
“缓冲区溢出”错误
2009-05-31 13:56 1148试图对不存在的元素进行下标操作是程序设计过程中经常犯的严重错误 ... -
一道关于C++继承的面试题
2009-05-31 13:51 1490#include <iostream> ... -
结构体的大小计算
2009-05-30 18:04 1346示例程序: #include <stdio.h> ... -
指针的大小--sizeof问题
2009-05-30 16:57 12189指针的大小是问:一个指针变量占用多少内存空间? 分析:既然指 ... -
深入理解C++中的mutable关键字
2009-05-30 16:05 1445mutalbe的中文意思是“可变的,易变的”,跟constan ...
相关推荐
cache性能分析实验报告
头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2...
在整体分析部分,学生需要对 Cache 模拟器的性能进行评估和分析,了解三种映射方式对 Cache 效率的影响,block 块大小与 Cache 容量对 Cache 效率的影响,以及 Cache 容量与相连度对 Cache 效率的影响等。...
讲述关于计算机组成与结构中的Cache模块
计算机体系结构存储器的组成Cache的映试题分析.doc
计算机体系结构Cache性能分析实验报告,内含完整实验流程和表格线图的绘制,供参考。
Cache 性能分析报告 Cache 是计算机系统中一种重要的存储器件,负责存储频繁访问的数据,以提高系统的性能。本报告对 Cache 的性能进行了详细的分析,涵盖了 Cache 的基本概念、基本组织结构、基本工作原理、容量...
课程计算机体系结构的实践报告,主题为Cache性能分析,通过设置不同的变量,来观察对Cache命中率的影响,报告内容丰富,得分极高。
计算机体系结构_存储器的组成、Cache的映试题分析报告.doc
本资源为计算机组成原理经典复习题附答案,涵盖了计算机组成原理的基本概念、计算机语言、计算机硬件、存储器、输入/输出系统、指令系统、 Cache 和虚拟存储器等方面的知识点。 1. 计算机语言:机器语言和汇编语言...
该报告利用simple scalar模拟器,针对cache的性能进行分析
计算机组成原理实验报告-Cache模拟器的实现
《计算机体系结构》-张晨曦著 教材整理样例试卷,包含选择题,问答题,分析题和计算题。
3) 改变Cache容量(*2,*4,*8,*64),运行程序(指明所选的测试程序),统计各种失效的次数,并分析Cache容量对Cache性能的影响; 4) 改变Cache的相联度(1路,2路,4路,8路,64路),运行程序(指明所选的测试...
通过程序,模拟cache存储过程,并通过控制变量法模拟分析Cache性能。 我们要通过老师所给程序进行模拟,并通过操作系统试验中老师所给算法生成出project.txt,并通过project.txt里面的数据来模拟程序的局部性等特性...
计算机体系结构,张晨曦那本书对应第四节的Cache性能分析实践报告(报告是精心编写的)。
头歌计算机组成原理直接相联cache设计头歌计算机组成原理直接相联cache设计头歌计算机组成原理直接相联cache设计头歌计算机组成原理直接相联cache设计头歌计算机组成原理直接相联cache设计头歌计算机组成原理直接...
计算机组成原理有关直接相联映射Cache的实验报告