代码的优化 (一)(小疯子)
/*
提高代码的运行速度:不要让你的IP跳来跳去。
IP(Extern instruction Pointer)为指针寄存器,他用来存放代码段中的偏移地址。
在程序运行的过程中,它始终指向下一条指令的首地址,
它与CS(Code Segment)(代码段)寄存器联用确定下一条指令的物理地址.
如果程序运行中,过多地使用JMP(跳转)指令,会影响到程序的执行速度,
在一个大型的循环里面尤为明显。
*/
LARGE_INTEGER n64StartCount={0},n64StopCount,n64Frequency = {0};
DWORD dwTotalTime = 0;
DWORD dwIndex = 0;
int nTestNumber = 0;
CString strOutput;
//段内跳转:
void CMainFrame::OnTest1()
{
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
nTestNumber++;
nTestNumber++;
nTestNumber++;
nTestNumber++;
nTestNumber++;
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
dwTotalTime += 2^32;
}
float IntervalTime1 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
for(UINT nIndex = 0;nIndex < 5;nIndex++)
{
nTestNumber++;
}
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
dwTotalTime += 2^32;
}
float IntervalTime2 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
strOutput.Format("例子1所消耗的时间是:%f,例子2所消耗的时间是:%f。\r\n代码运行速度提高%.2f%%",
IntervalTime1,IntervalTime2,(1-IntervalTime1/IntervalTime2)*100);
AfxMessageBox(strOutput);
//经测试:代码运行速度提高 20%+
}
//段间跳转:
void testFunc(int &nTestNumber)
{
nTestNumber++;
}
void CMainFrame::OnTest2()
{
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
nTestNumber++;
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
dwTotalTime += 2^32;
}
float IntervalTime1 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
testFunc(nTestNumber);
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
dwTotalTime += 2^32;
}
float IntervalTime2 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
strOutput.Format("例子1所消耗的时间是:%f,例子2所消耗的时间是:%f。\r\n代码运行速度提高%.2f%%",
IntervalTime1,IntervalTime2,(1-IntervalTime1/IntervalTime2)*100);
AfxMessageBox(strOutput);
//经测试:代码运行速度提高 90%+
}