如何测定memset函数执行所需的时间?

如何测定memset函数执行所需的时间?

---------------------------------------------------------------

用 rdtsc 汇编指令可以得到 CPU 内部定时器的值, 每经过一个 CPU 周期, 这个定时器就加一。
如果在一段时间内数得 CPU 的周期数, CPU工作频率 = 周期数 / 时间

为了不让其他进程和线程打扰, 必需要设置最高的优先级
以下函数设置当前进程和线程到最高的优先级。
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

CPU 测速程序的源代码, 这个程序通过 CPU 在 1/16 秒的时间内经过的周期数计算出工作频率, 单位 MHz:

int CPU_Frequency(void) //MHz
{
LARGE_INTEGER CurrTicks, TicksCount;
__int64 iStartCounter, iStopCounter;

DWORD dwOldProcessP = GetPriorityClass(GetCurrentProcess());
DWORD dwOldThreadP = GetThreadPriority(GetCurrentThread());

SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

QueryPerformanceFrequency(&TicksCount);
QueryPerformanceCounter(&CurrTicks);

TicksCount.QuadPart /= 16;
TicksCount.QuadPart += CurrTicks.QuadPart;

asm rdtsc
asm mov DWORD PTR iStartCounter, EAX
asm mov DWORD PTR (iStartCounter+4), EDX

while(CurrTicks.QuadPart

 1<tickscount.quadpart) (icounter+4),="" (int)((istopcounter-istartcounter)="" (istopcounter="" (mhz)="" +="" 4),="" 62500);="" __int64="" _cpu_freq="0;" api="" asm="" cpu="" cpudelayus(__int64="" dwoldprocessp);="" dwoldthreadp);="" dword="" eax="" edx="" icounter,="" int="" istopcounter="iCounter" istopcounter,="" istopcounter;="" mov="" ptr="" queryperformancecounter(&currticks);="" rdtsc="" return="" setpriorityclass(getcurrentprocess(),="" setthreadpriority(getcurrentthread(),="" us)="" us*_cpu_freq;="" void="" while(istopcounter-icounter="" {="" }="" 也可以得到高精度的延时="" 函数进行延时,="" 利用循环,="" 利用循环和="" 前面是用="" 参数:="" 如果知道了="" 定义一个全局变量保存="" 微秒="" 的工作频率,="" 的频率延时,="" 频率="">0)   
 2{   
 3asm rdtsc   
 4asm mov DWORD PTR iCounter, EAX   
 5asm mov DWORD PTR (iCounter+4), EDX   
 6}   
 7}   
 8  
 9void TestDelay(void)   
10{   
11_CPU_FREQ = CPU_Frequency(); //利用 CPU 频率初始化定时   
12CpuDelayUs(1000000); //延时 1 秒钟   
13}   
14\---------------------------------------------------------------   
15  
16可以这样么?   
17for( i=0;i&lt;=1000000;i++)   
18memset();   
19然后time 可执行程序。   
20然后所用时间/memset次数。呵呵   
21\---------------------------------------------------------------   
22  
23学习,我的想法跟9653013(csL阴转晴)一样   
24\---------------------------------------------------------------   
25  
26up 三楼的,可以, memset 多次,取个平均值.   
27\---------------------------------------------------------------   
28  
29If you program under linux, you can try gettimeofday function.   
30For example:   
31  
32struct timeval tv1, tv2;   
33long interval;   
34  
35gettimeofday(&amp;tv1, NULL);   
36  
37memset(...);   
38  
39gettimeofday(&amp;tv2, NULL);   
40  
41interval = (tv2.tv_sec - tv1.tv_sec) * 1000000 + (tv2.tv_usec - tv1.tv_usec); // unit: microsecond   
42// note: gettimeofday will expend 1 microsecond.</tickscount.quadpart)>
Published At
Categories with 服务器类
Tagged with
comments powered by Disqus