| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 755 人关注过本帖
标题:关于利用CPU时钟计算一个程序的运行时间问题
只看楼主 加入收藏
fuyang163
Rank: 2
等 级:论坛游民
帖 子:36
专家分:59
注 册:2009-4-13
结帖率:80%
收藏
 问题点数:0 回复次数:0 
关于利用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位,按照这个算计算机开上十年都跑不完这个时间,但是我的为什么会越界出现负值?请大虾们,指点指点~~

搜索更多相关主题的帖子: 时间 
2011-03-29 17:09
快速回复:关于利用CPU时钟计算一个程序的运行时间问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015537 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved