CHU_overlord CHU_overlord
关注数: 5 粉丝数: 70 发帖数: 1,378 关注贴吧数: 5
【分享+开源+教程】用FreePascal计算算法时长(精确到微秒级别!) 对于一个算法而言,运行时所花费的时间越短,算法的质量自然越佳。 (算法时长对于大型3D游戏非常重要,当然了,有时候也不必过分计较) 但是如何计算我的算法时长呢?掐秒表?显然不可能。 方法肯定是有的,就是调用Windows的API。 FreePascal提供了Windows单元,其中封装了绝大部分的常用API。 其中就有我们需要用到的这几个命令。 命令名称=================来自单元========说明========用法 QueryPerformanceFrequency==Windows========取得CPU的频率(你可以在我的电脑-属性看到他的大致值,这里是精确值) QueryPerformanceFrequency(某变量:Int64) //这个变量用于储存返回值 QueryPerformanceCounter====Windows========取得系统的时钟值 QueryPerformanceCounter(某变量:Int64) //这个变量用于储存返回值 Exec===================Dos============运行外部程序 Exec(程序,参数); 简单说明下方法。Windows自带一个计时器,处理器每运行一个周期,计时器就会加1。注意这个计时器一开机就会不断运行,不会停止,所以数值很大,要用Int64来储存。 那么要知道我程序运行的时长就要这样,弄两个变量a,b QueryPerformanceCounter(a); 运行程序…………………… QueryPerformanceCounter(b); 再b-a就是运行这个程序所花费的时间了。 但是这个结果还不是时间,准确的说是处理器经过的周期。 于是时间就是 (b-a)/处理器频率 下面是源码: program ProgramTimer;//名称随便 uses Windows,Dos;//用到了这两个单元 Var CPUFrq:Int64;//储存处理器频率      TimeS:Int64;//记录开始的时间      TimeE:Int64;//记录结束的时间      ElapsedTime:Double;//计算流逝时间 begin    QueryPerformanceFrequency(CPUFrq);//取得处理器频率    QueryPerformanceCounter(TimeS);//取得计数器的值    Exec('C:\1.exe','');//这里执行你的程序、过程、函数    QueryPerformanceCounter(TimeE);//取得计数器的值    ElapsedTime:=(TimeE-TimeS)/CPUFrq;//计算流逝时间 //注意:最后的结果精确到微秒级别,乘上1000就是毫秒,以此类推    writeln(ElapsedTime);//输出,不多说了 end. 呼呼 终于写完了~~~
1 下一页