代码的优化 (三)(小疯子)
/*
在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器
用函数内部的代码替换所有对于指出的函数的调用。 这样做在两个方面快于函数
调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;
第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度
的同时,程序长度变大了,因此需要更多的ROM。另外它比宏更安全更容易调试。
不过值得注意的是Inline仅仅是对编译器的建议,编译器有权利忽略这个建议。
比如:函数体的大小,是否有局部对象被声明,函数的复杂性等等。如果当编译器
拒绝内联一个函数的时候,那个函数会像普通函数一样被对待,但是还会出现一些
其他的问题。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最
安全最有效的。
*/
//寄存器变量
void CMainFrame::OnTest5()
{
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
nTestNumber ++;
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
testFunc2(nTestNumber);
}
float IntervalTime1 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(register UINT nIndex = 0;nIndex < 10000000;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,(IntervalTime1/IntervalTime2 - 1)*100);
AfxMessageBox(strOutput);
}
/*
循环计数是应用寄存器变量的最好的候选者。当它们没有被存入一个寄存器中,
大部分的循环时间都被用在了从内存中取出变量和给变量赋新值上。如果把它存入
一个寄存器中的话,将会大大减少这种负担。需要注意的是,register仅仅是对编
译器的一个建议。就好比内联函数一样,编译器可以拒绝把一个对象存储到寄存器
中。另外,现代的编译器都会通过把变量放入寄存器中来优化循环计数。register
并不仅仅局限在基本类型上,它能够被应用于任何类型的对象。如果对象太大而不
能装进寄存器的话,编译器仍然能够把它放入一个高速存储器中,例如cache。
另外:用register声明函数型参将会是建议编译器把实参存入寄存器中而不是堆栈中。
*/
在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器
用函数内部的代码替换所有对于指出的函数的调用。 这样做在两个方面快于函数
调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;
第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度
的同时,程序长度变大了,因此需要更多的ROM。另外它比宏更安全更容易调试。
不过值得注意的是Inline仅仅是对编译器的建议,编译器有权利忽略这个建议。
比如:函数体的大小,是否有局部对象被声明,函数的复杂性等等。如果当编译器
拒绝内联一个函数的时候,那个函数会像普通函数一样被对待,但是还会出现一些
其他的问题。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最
安全最有效的。
*/
//寄存器变量
void CMainFrame::OnTest5()
{
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
nTestNumber ++;
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
testFunc2(nTestNumber);
}
float IntervalTime1 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(register UINT nIndex = 0;nIndex < 10000000;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,(IntervalTime1/IntervalTime2 - 1)*100);
AfxMessageBox(strOutput);
}
/*
循环计数是应用寄存器变量的最好的候选者。当它们没有被存入一个寄存器中,
大部分的循环时间都被用在了从内存中取出变量和给变量赋新值上。如果把它存入
一个寄存器中的话,将会大大减少这种负担。需要注意的是,register仅仅是对编
译器的一个建议。就好比内联函数一样,编译器可以拒绝把一个对象存储到寄存器
中。另外,现代的编译器都会通过把变量放入寄存器中来优化循环计数。register
并不仅仅局限在基本类型上,它能够被应用于任何类型的对象。如果对象太大而不
能装进寄存器的话,编译器仍然能够把它放入一个高速存储器中,例如cache。
另外:用register声明函数型参将会是建议编译器把实参存入寄存器中而不是堆栈中。
*/
...全文
相关推荐
daimafengzi:代码疯子图床
大马风子 代码疯子图床
疯子CMS-轻简小说系统内容管理实战
在现代前端开发中,组件化已经成为一种行业标准。组件是可复用的代码块,它们将用户界面拆分成独立的、可管理的部分。自定义组件开发的步骤通常包括:确定组件需求:明确组件需要完成什么功能,它将如何与其它组件交互。设计组件接口:定义组件的属性(props)、事件(events)和插槽(slots),使其在不同的上下文中能够以不同的方式工作。构建组件结构:使用HTML创建组件的基本结构,并确保结构是语义化的,能够被屏幕阅读器等辅助技术理解。应用样式。
疯子CMS轻简小说系统:原生PHP高并发小说站实战架构
小说CMS系统是中小型内容站点的核心技术选型之一,其本质是围绕章节管理、阅读体验与快速上线构建的垂直化Web应用架构。理解其底层原理需从原生PHP性能优化、MySQL高频查询设计、CSS驱动的响应式排版及无框架缓存策略入手——这些技术共同支撑起日均5万PV的稳定服务。疯子CMS摒弃ORM与重型框架,通过手写SQL控制查询粒度、用LayUI+纯CSS实现跨端阅读体验、以update_sql.sql作为安全热升级通道,并将繁简转换、主题切换等能力下沉为可配置契约。它代表了一类被低估的‘务实型’PHP工程实践:不
疯子扫描器
本扫描器用于扫描设置IP机器的文件内容,可选择需要扫描的内容
疯子:疯子:玩具lua解释器
疯子:疯子:玩具lua解释器


硬件/系统
