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毫秒