如何测定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<=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(&tv1, NULL);
36
37memset(...);
38
39gettimeofday(&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)>