关于利用CPU时钟计算一个程序的运行时间问题
我的程序代码如下:#include<iostream>
using namespace std;
#include<malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 10000
typedef struct node
{
int key;
struct node * next;
}KeyNode;
void inc_sort(int keys[],int size,int bucket_size)
{
KeyNode **bucket_table=(KeyNode **)malloc(bucket_size*sizeof(KeyNode *));
for(int i=0;i<bucket_size;i++)
{
bucket_table[i]=(KeyNode *)malloc(sizeof(KeyNode));
bucket_table[i]->key=0; //记录当前桶中的数据量
bucket_table[i]->next=NULL;
}
for(int j=0;j<size;j++)
{
KeyNode *node=(KeyNode *)malloc(sizeof(KeyNode));
node->key=keys[j];
node->next=NULL;
//映射函数计算桶号
int index=keys[j]/bucket_size; //对桶分组编号,此处为十个桶
//初始化P成为桶中数据链表的头指针
KeyNode *p=bucket_table[index];
//该桶中还没有数据
if(p->key==0)
{
bucket_table[index]->next=node;
(bucket_table[index]->key)++;
}
else
{
//链表结构的插入排序
while(p->next!=NULL&&p->next->key<=node->key)
p=p->next;
node->next=p->next;
p->next=node;
(bucket_table[index]->key)++;
}
}
//打印结果
for(int b=0;b<bucket_size;b++)
{
for(KeyNode *k=bucket_table[b]->next; k!=NULL; k=k->next)
{
cout<<k->key<<" ";
}
cout<<endl;
}
}
void randomnum(int a[],int n)
{
int i;
srand((unsigned)time(NULL));//initial the random number
for(i=0;i<n;++i)
{
a[i]=rand()%n;
}
}
int main()
{
long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow;
//获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
}
// for(int i= 0; i<10000; i++ )
// {
// for(int j= 0; j<10000; j++ )
// {
//
// }
//
// }
int n=100;
int raw[N];
randomnum(raw,N);
inc_sort(raw,N,100);
//获取代码结束时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;
//输出代码段运行的时钟周期数
//以频率2.33Gcpu为例,如果换计算机把其中的2.33改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^
cout<< ( double ) (timer /2.33/1000000) << endl;
return 0;
}
-368.667
主要问题是当我的程序中宏定义的N大于10000后,这个程序运行后得到的时间值成为负值,对于CPU中的寄存存储时间是64位,按照这个算计算机开上十年都跑不完这个时间,但是我的为什么会越界出现负值?请大虾们,指点指点~~