Programming 版 (精华区)

发信人: JJason (总统~~), 信区: Programming
标  题: [合集]C语言中如何测定一个程序运行的时间(转载)
发信站: 哈工大紫丁香 (2003年03月20日17:12:51 星期四), 站内信件


────────────────────────────────────────
 ssos (存在与虚无·守拙)              于 2003年03月02日20:30:57 星期天 说道:

time函数好像不行
最好不要用MFC,能精确到微秒级别

────────────────────────────────────────
 tth (bear)                           于 2003年03月02日21:28:30 星期天 说道:

关注!我也想知道!
time只能精确到秒,很多情况下不能满足需要!
记得以前看到过一个计算CPU时钟周期的函数,只要把程序使用的时
钟周期除以CPU的主频,就可以得到程序的运行时间了。但是我忘了
是什么函数了,哪位高手知道请告知。

────────────────────────────────────────
 ghl (量子)                           于 2003年03月02日21:45:19 星期天 说道:

可以试试“高精度计数器”,
即使用API函数QueryPerformanceFrequency()取得系统CPU计数器频率,
QueryPerformanceCounter()取得计数器数值
然后计算出程序运行时间。

────────────────────────────────────────
 ghl (量子)                           于 2003年03月02日21:46:12 星期天 说道:

有关具体使用可以参考一下msdn

────────────────────────────────────────
 xp (日尧 月月鸟)                     于 2003年03月02日21:50:37 星期天 说道:

ftime

────────────────────────────────────────
 valley (天音)                        于 2003年03月03日13:41:54 星期一 说道:

这是获取CPU频率和计时的Delphi源程序,稍作修改可用于VC.
{*********** GetCPUClock ***********}
procedure TMainForm.GetCPUClock();
const  DelayTime = 2000; // measure time in ms
var
  StartTime,EndTime: Int64;
  PriorityClass,Priority: Integer;
begin
  PriorityClass:=GetPriorityClass(GetCurrentProcess);
  Priority:=GetThreadPriority(GetCurrentThread);
  SetPriorityClass(GetCurrentProcess,REALTIME_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread,{THREAD_PRIORITY_TIME_CRITICAL}31);
  Application.ProcessMessages;
  StartTime := GetTSC;
  Sleep(DelayTime);
  EndTime := GetTSC;
  SetThreadPriority(GetCurrentThread,Priority);
  SetPriorityClass(GetCurrentProcess,PriorityClass);
  CPUClock := Trunc((EndTime-StartTime)/(1000.0*DelayTime)); //单位:MHz
end;
{********* 读CPU脉冲数 ***********}
function GetTSC: Int64; stdcall;      // because the inline assembler
asm              // has no mnemonic for "rdtsc" we have to take the op-codes
  db    0Fh      // 1. op-code byte for "rdtsc" - Operation Code for 'ReadTSC'
  db    31h      // 2. op-code byte for "rdtsc"
end;             // EDX:EAX 存放TSC的高32位和低32位
{********* 读CPU脉冲数低16位 ***********}
function GetTSCLow: Cardinal;
begin
  Result:=Cardinal(GetTSC);
end;
{********* 读CPU脉冲数高16位 ***********}
function GetTSCHigh: Cardinal;
begin
  Result:=GetTSC shr 32;
end;
 {----------------- 工作程序 -----------------}
 StartTime := GetTSC;
 DeltaTime := 微秒 * CPU频率(MHz); // 脉冲数
 for i := 0 to ParaForm.SamplePointNumber-1 do
 begin
  //do some work
  while((GetTSC-StartTime)<DeltaTime) do Application.ProcessMessages; //wait
  StartTime := GetTSC;
 end;
 注意:当StartTime很大,会被当做负数处理,则这段代码出错。
 解决方法是 把 GetTSC-StartTime 指令用汇编语言编一个函数,进行无符号减法运算,
 可以进行长时间无故障地运算。
 代码不在手边,以后若需要再贴。

────────────────────────────────────────
 valley (天音)                        于 2003年03月03日13:56:20 星期一 说道:

TC2.0好像难以定时到微秒。除非调用汇编语言写的函数。总之有点难。
实在要做,可以考虑给已知机器主频的情况下,编写一段微秒级的指令,
如 sin(cos(sqrt(1.335360956)*tan(2.645243)),每运算一次相当于
若干微秒的定时。

────────────────────────────────────────
 leecxws (lovekiller)                 于 2003年03月04日20:06:37 星期二 说道:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~呵呵,这样也行啊。可以试试

────────────────────────────────────────
 coolren (coolren)                    于 2003年03月06日18:21:38 星期四 说道:

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这个地方是什么意思?能解释一下吗?

────────────────────────────────────────
 valley (天音)                        于 2003年03月06日19:08:47 星期四 说道:

执行数学函数一般比较费时间,比如这条指令
sin(cos(sqrt(1.335360956)*tan(2.645243))
可能需要一点几个微秒的时间。
我们先执行十万次这条指令,计时,然后除以
十万得到每条指令的平均时间。这样的话,如
果我们需要百微秒或毫秒级的延时,只要计算
出执行多少次这个函数就可以了。

────────────────────────────────────────
 tth (更深的蓝)                       于 2003年03月09日15:44:10 星期天 说道:

用API行不行?有一个API可以精确到毫秒,GetTickCount()。

────────────────────────────────────────
 llhhxht (绿林好汉--努力学习中)       于 2003年03月09日19:17:26 星期天 说道:

精华区的
不知道有没有用
http://bbs.hit.edu.cn/cgi-bin/bbs/bbsanc?/groups/GROUP_3/Programming/D97E048
16/M.1015475006.A

────────────────────────────────────────
 valley (天音)                        于 2003年03月10日12:28:22 星期一 说道:

你老兄真逗,如果TC2.0能用API,还用费这么大劲吗?
若在 windows 环境下,用CPU TSR 脉冲的技术可以精确到微秒.
可惜这种技术TC2.0用不了

────────────────────────────────────────
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.052毫秒