在这篇博客中的(http://coolshell.cn/articles/10249.html)
实例一中的例子说两的for循环的运行时间是基本相同的
我在VS2010改成C++的代码
int size=64 * 1024 * 1024;
int *arr = new int[size];
// Loop 1
for (int i = 0; i < size; i++) arr[i] *= 3;
// Loop 2
for (int i = 0; i < size; i += 16) arr[i] *= 3;
用几种方式测,为什么两个for循环的时间都是不同的,为什么会这样。
方法来源(http://hi.baidu.com/kuye1105/item/7848476eb77d0b1f6895e6a0)
----------------------------------
法一:
使用GetTickCount函数
#include<iostream>
#include<windows.h>
int main()
{
DWORD start_time=GetTickCount();
{
//此处为被测试代码
}
DWORD end_time=GetTickCount();
cout<<"The run time is:"<<(end_time-start_time)<<"ms!"<<endl;//输出运行时间
return 0;
}
-----------------------------------
法二:
使用clock()函数
#include<iostream>
#include<time.h>
int main()
{
clock_t start_time=clock();
{
//被测试代码
}
clock_t end_time=clock();
cout<< "Running time is: "<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<<endl;//输出运行时间
return 0;
}
----------------------------------
法三:
//用汇编实现获取一段代码运行的时间
#include<iostream>
using namespace std;
int main()
{
long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow;
//获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
}
for(int i= 0; i<100000; i++ )
{
for(int i= 0; i<100000; i++ )
{
}
}
//获取代码结束时cpu内部计数器的值,并减去初值
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
;获取两次计数器值得差
sub eax, LowStart
cmp eax, 0 ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
}
//把两个计数器值之差放在一个64位的整形变量中
//先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow;
//输出代码段运行的时钟周期数
//以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^
cout<< (double) (timer /1.1/1000000000) << endl;
return 0;
}
------解决方案--------------------
人家说得很清楚,这些代码正好和他的处理器的缓存大小相符。
但是和你的处理器未必相符。
不同的CPU缓存区别大了。
听说过“刻舟求剑”这个成语么?
------解决方案--------------------
一个处理器有32KB的L1和4MB的L2
这很可能是Intel Core 2 Duo E6xxx 系列。