代码的优化 (一)(小疯子)

EnochShen 2004-12-17 02:33:40
/*
提高代码的运行速度:不要让你的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%+
}
...全文
185 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
EnochShen 2004-12-20
  • 打赏
  • 举报
回复
你好,我是小疯子,你对我的FAQ有什么意见,欢迎提出。呵呵,小弟一定虚心接受
jink 2004-12-20
  • 打赏
  • 举报
回复
谁通过这个帖子上faq的?
1.帖主连c里一般函数生成的汇编指令为call都搞错.
2.大型的循环使用函数产生无用的额外花销也是指call的压栈和返回时的处理,与jmp有毛个关系.
3.看你的代码是mfc程序->win32程序,使用32位flat地址,已不用ip用的是eip,cs还有个毛用.


误人子弟误人子弟误人子弟
哪个版主通过这个faq的?真tmd不象话
EnochShen 2004-12-20
  • 打赏
  • 举报
回复
jink大哥说得对我这个确实不对,近日我就会把它重写一遍,希望jink大哥批评,多骂我两句,我就是欠骂.
再次谢谢jink大哥.
EnochShen 2004-12-20
  • 打赏
  • 举报
回复
如果你看到我其他的帖子里面有错误的话,直接回复在帖子里面好了,让所有的人都看见,
我宁愿丢人也不愿意误人子弟,再次谢谢jink大哥
EnochShen 2004-12-17
  • 打赏
  • 举报
回复
呵呵,自己先顶一下。

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧