当前位置: 代码迷 >> VC >> VS2010中计算程序运行的时间解决方法
  详细解决方案

VS2010中计算程序运行的时间解决方法

热度:241   发布时间:2016-05-05 00:04:56.0
VS2010中计算程序运行的时间
在这篇博客中的(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 系列。

  相关解决方案