关于C++ 精确计时

wcl1986_1 2008-08-24 02:10:00
使用clock()计时单位是多少?---是毫秒吗?
它的运行机制似乎不是简单的取时间。
以下程序为什么出现的计时最小是15ms。在1000次以下都是0ms
(以下程序使用随机数生成序列,排序前一半的序列)
time()计时似乎以秒为单位,不够精确。
好像还有微妙单位的。
//N个数去前K个最大的。部分排序
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

const size_t size=900;
const size_t K=size/2;

int main()
{
//输入数,用随机数模拟,保存在文件中,vector中
//并显示出来,验证
ofstream src("forwardN_PartionSort_src.txt");
if(!src)
{
cout<<"open fail"<<endl;
return 0;
}
time_t seed=0;
srand(time(&seed));
int temp=0;
vector<int>* pv=new vector<int>;
pv->reserve(size+10);
for(int i=0;i<size;++i)
{
temp=rand();
src<<temp<<endl;
pv->push_back(temp);
cout<<temp<<endl; //display prove
}
src.close();

//前K个部分排序
cout<<endl<<"Wait sorting..."<<endl;
vector<int>::iterator cur=pv->begin();
vector<int>::iterator subcur(cur);
vector<int>::iterator maxit(cur);
unsigned long compTimes=0; //记录比较次数
unsigned long swapTimes=0; //记录交换次数
clock_t start=0,end=0;
start=clock();
for(;cur!=pv->begin()+K-1;++cur)
{
maxit=cur;
for(subcur=cur;subcur!=pv->end();++subcur)
if(*subcur>*maxit) //从大到小排列
{ maxit=subcur;++compTimes; }
if(maxit!=cur)
{ int temp=*cur;*cur=*maxit;*maxit=temp;++swapTimes; }
}
end=clock();
double during=static_cast<double>(end-start);

//输出到文件forwardN_sort.txt
ofstream sort("forwardN_PartionSort_result.txt");
cout<<"Result========================="<<endl;
for(cur=pv->begin();cur!=pv->end();++cur)
{
sort<<*cur<<endl;
cout<<*cur<<endl;
}
sort<<endl<<"Total "<<size<<" elems"<<endl
<<"Sort "<<K<<" elems"<<endl
<<"Compare times: "<<compTimes<<endl
<<"Swap times: "<<swapTimes<<endl
<<"Sort using time: "<<during<<" milliseconds"<<endl;
cout<<endl<<"Total "<<size<<" elems"<<endl
<<"Sort "<<K<<" elems"<<endl
<<"Compare times: "<<compTimes<<endl
<<"Swap times: "<<swapTimes<<endl
<<"Sort using time: "<<during<<" milliseconds"<<endl;


sort.close();
delete pv;

return 0;
}
...全文
763 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Silitex 2008-08-25
  • 打赏
  • 举报
回复
clock()函数有55毫秒的误差,因为它用的是16位1193180Hz的计时器,计数了一整圈才滴答一下,滴答一下就是55ms,1s中只能够滴答18.2下。
在工业控制系统里面用这个函数是会被枪毙的!必须自己去读写那个计时器然后与clock函数相加就可以比较准确了
/***
*void xdelay(unsigned int ms)
*
*Purpose:
* Make an exactly millisecond delay
*
*Entry:
* unsigned int ms - The delay time (millisecond)
*
*Exit:
* void
*
*Exceptions:
* Note:
* .This function was created by Denny at Jun/26/2008
* .Dongguan Siliten Electronics CO., LTD.
* .The timer frequency is 1193180Hz
* .The timer counter is 16bits, so only elapsed 55ms for\
* counter a circle.
*
*******************************************************************************/
void xdelay(unsigned int ms)
{
unsigned int base_counter;
unsigned int circle;
unsigned int counter;
unsigned int last_counter;
unsigned long end;
unsigned long cur;

disable();
//outportb(0x43, 0x30);
base_counter = inportb(0x40);
base_counter += inportb(0x40)<<8;
enable();
circle = 0;
last_counter = 0;
end = (unsigned long)ms*1193;
cur = 0;
while (end > cur)
{
disable();
counter = inportb(0x40);
counter += inportb(0x40)<<8;
enable();
counter = base_counter - counter;
if (counter-last_counter > 50) // Illegal data
{
last_counter = counter;
continue;
}
if ( (counter < last_counter) && (last_counter > 65000) && (counter < (65536-65000)) )
circle++;
cur = ((unsigned long)circle<<16) + counter;
//printf("base:%u|cir:%u|cnt:%u|last:%u|end:%lu|cur:%lu\n", base_counter, circle, counter, last_counter, end, cur);
last_counter = counter;
}
}

在windows程序中用这个clock函数也足够了
linfengc 2008-08-24
  • 打赏
  • 举报
回复
可以通过cpu的主频计算时间,应该可以很精确吧
herman~~ 2008-08-24
  • 打赏
  • 举报
回复
clock函数是毫秒
楼上gg用的QueryPerformanceFrequency是微妙级别,应该是目前最小单位的计时了

另外由于window是抢占式操作系统,并不是实时操作系统,所以计时必然会存在误差。只要在可接受的误差范围内就可以了
K行天下 2008-08-24
  • 打赏
  • 举报
回复
ms
本来就有误差,下面是一个微秒级的延时函数(VC)

#include <windows.h>
#include <time.h>
#include <stdio.h>


ULONG GetTimeDis(struct tm first, struct tm second) //计算两次时间差
{
return abs((first.tm_hour * 3600 + first.tm_min * 60 + first.tm_sec)
- (second.tm_hour * 3600 + second.tm_min * 60 + second.tm_sec));
}

void Delay(ULONG ulMicroSeconds)
{
LARGE_INTEGER timeStop;
LARGE_INTEGER timeStart;
LARGE_INTEGER Freq;
ULONG ulTimeToWait;

if (!QueryPerformanceFrequency( &Freq ))
return;

ulTimeToWait = Freq.QuadPart * ulMicroSeconds / 1000 / 1000;

QueryPerformanceCounter ( ×tart );

timeStop = timeStart;

while( timeStop.QuadPart - timeStart.QuadPart < ulTimeToWait )
{
QueryPerformanceCounter( ×top );
}
}



int main(void)
{
struct tm timeStart, timeEnd;

_getsystime(×tart);


Delay(1000 * 1000 * 3); //3秒


_getsystime(&timeEnd);

printf("用时:%d秒\n", GetTimeDis(timeStart, timeEnd));

return 0;
}

wcl1986_1 2008-08-24
  • 打赏
  • 举报
回复
有偏差是可以
可是赋给size不同数值,大的总应该比小的用时短。
我这个程序有点离奇。
size在1000以下 不正常。
你们可以试试,修改开头的size来重新编译。
wangtk 2008-08-24
  • 打赏
  • 举报
回复
clock()是毫秒

C/C++下最小计时单位都是毫秒 没有微秒的
chlaws 2008-08-24
  • 打赏
  • 举报
回复
clock 没有能精确你所想象的
wangdeqie 2008-08-24
  • 打赏
  • 举报
回复
是毫秒,有偏差是正常的,不必太在意

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧