在JE上看到了一个帖子讨论下面这种代码的优化问题的:
- int main(int argc, char *argv[])
- {
-
int i;
-
for (i = 0; i < 20000; i++) {
-
int j;
-
for (j = 0; j < 2000; j++) {
-
int k;
-
for (k = 0; k < 200; k++);
- }
- }
-
return 0;
- }
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 20000; i++) {
int j;
for (j = 0; j < 2000; j++) {
int k;
for (k = 0; k < 200; k++);
}
}
return 0;
}
显然是在考查要把循环次数少的放在外层,理由是这样可以减少变量实例话的次数。原理如此,我只是想更加清楚地知道这样做有多大的作用,于是我用gcc的profile工具测试了一下。
把上面的代码用 gcc -pg 编译,profile结果显示整个程序用时32.68秒,多次运行有不到0.1秒的浮动误差。
如果改成
- int main(int argc, char *argv[])
- {
-
int i;
-
for (i = 0; i < 200; i++) {
-
int j;
-
for (j = 0; j < 2000; j++) {
-
int k;
-
for (k = 0; k < 20000; k++);
- }
- }
-
return 0;
- }
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 200; i++) {
int j;
for (j = 0; j < 2000; j++) {
int k;
for (k = 0; k < 20000; k++);
}
}
return 0;
}
用时32.20秒,效率大约提升了1.5%。
以上并没有使用编译器自身的优化选项。下面来看看如果使用了 gcc -O3 (第三级优化)编译会有什么样的结果。
结果表明有很大的改观:前者用时5.07秒,后者用时4.54秒。
如果启用了 -O9 最高级别的优化,后者用时4.60秒,前者用时5.12秒,可见 -O9 并不比 -O3 强。
别忘了这里面的循环要执行 200*2000*20000 = 8000000000,80亿次!即使不用编译器优化,那种被认为是“低效率”的代码也可以32秒多执行完,而那种“高效率”的代码不过把时间减少了1.5%。在实际情况下,调整内外循环顺序可能会严重降低代码的可读性。
而只是简单地加了一个编译器优化,立刻就能把速度提高5倍多。人脑终归不能像编译器一样理解代码。
此文转自: http://www.iteye.com/topic/762637
分享到:
相关推荐
### 多重For循环优化分析 #### 原始代码分析 原始代码示例如下: ```java for(int i = 0;...总之,在实际开发中,我们可以通过调整循环顺序、减少变量实例化等方式来优化多重循环,以提升程序的整体性能。
总的来说,这个“开机次数记忆”的实例涵盖了单片机C语言编程、非易失性存储器操作、中断处理等多个方面的知识,是学习和实践单片机开发的好素材。通过理解和实现这样的例子,开发者可以更好地掌握单片机编程的技巧...
在这个实例中,定时器会被用来每隔一定时间减少下载次数。 - DOM操作:JavaScript通过DOM(Document Object Model)接口可以操作HTML元素。我们需要找到显示下载次数的元素,并修改其内容以展示倒计时。 3. **基本...
Oracle中的变量绑定是一种重要的数据库操作优化技术,尤其在处理大量...通过理解其工作原理,并在编程时正确使用,我们可以有效地减少SQL解析次数,提高SQL语句的复用率,减少共享池的碎片,从而优化整个系统的性能。
这是因为静态方法在调用时不需要通过对象实例来进行,减少了对象实例化的过程,从而加快了调用的速度。 **实践建议**: - 在设计类和方法时,考虑哪些方法适合静态化。例如,那些不依赖于对象状态的方法,如工具类...
例如,假设有一个大型的数据集需要在多个任务中被多次使用,那么可以将其广播到每个执行器节点上。这样每个节点只需要保存一份副本,而不是每个任务都单独传输数据。 广播变量的主要功能如下: - `.destroy()`:...
- **作用**:采用绑定变量减少解析次数。 #### 11. 游标观察 - **定义**:监视游标的使用情况。 - **作用**:优化游标性能。 #### 12. 当前用户执行的SQL - **定义**:当前用户执行的SQL语句。 - **作用**:追踪...
### VB程序实例知识点详解 #### 一、宏的应用技巧 **知识点1:宏的概念与作用** - **定义**: 宏是一种存储在Excel中的自动化指令序列,由一系列命令组成,能够执行重复性的任务。 - **作用**: 减少手动操作的工作...
综上所述,Bourne Shell 作为经典的 Unix Shell,在系统管理和自动化任务处理中发挥着重要作用。了解其基础概念、环境变量以及脚本编程技术对于有效地利用 Shell 编写高质量的脚本至关重要。通过学习和实践这些知识...
在本压缩包“基于遗传算法的优化计算——建模自变量降维matlab代码.zip”中,包含了一个使用MATLAB实现的遗传算法(Genetic Algorithm, GA)进行模型自变量降维的应用实例。遗传算法是一种搜索优化技术,源于生物...
3. **原型和继承**:JavaScript的面向对象编程特性,如原型链、构造函数和实例化。 4. **异步编程**:讨论事件循环、回调函数、Promise和async/await,这些都是JavaScript处理非阻塞I/O操作的关键。 5. **错误处理...
1. 初始化:循环变量取得初值。 2. 比较:检查循环变量是否超过终值(根据步长的正负判断大于还是小于)。 3. 如果未超过终值,执行循环体。 4. 更新:循环变量增加或减少步长值。 5. 回到步骤2,重复以上过程,直至...
然而,当自变量数量较多时,网络可能会过拟合,或者训练时间过长。这时,降维就显得尤为重要,它可以帮助我们减少输入变量的数量,提高模型的泛化能力,同时降低计算复杂度。 在这个压缩包中,源程序代码可能包含...
- **缓存管理**:合理配置缓存,减少模板的解析次数。 - **错误处理**:捕获并处理模板执行中的异常,提供友好的错误信息。 总结,Freemarker是一个功能强大的模板引擎,通过与后端数据模型的结合,能够灵活地生成...
在C和C++编程语言中,`static`关键字有着重要的作用,它主要用于控制变量和函数的作用域和生命周期。下面将详细介绍`static`关键字的三种主要用法以及相关的知识点。 ### 1. 局部静态变量 局部变量通常在函数内部...
在方案一的基础上,将循环变量i, j, k的实例化移出循环体,减少实例化次数: ```java int i, j, k; for (i = 0; i ; i++) for (j = 0; j ; j++) for (k = 0; k ; k++) testFunction(k, j, i); ``` 为了验证优化...
3. **预设循环次数**:在循环外预先计算循环次数,避免在循环内部计算,减少不必要的计算。 4. **释放内存**:及时销毁变量,尤其是大数组,以释放内存资源。 5. **避免魔术方法**:如__get、__set、__autoload等...
- **作用域控制**:尽量减小变量的作用域,避免不必要的全局变量,这有助于减少内存消耗,并且使得程序更易于理解和维护。 - **循环优化**:通过消除循环中的冗余计算、循环展开等技术来加速循环执行速度。例如,在...
Java代码优化是一个重要的主题,它涉及提升程序性能、减少资源消耗和提高代码可读性等多个方面。以下是对给定文件中提到的一些关键知识点的详细解释: 1. 循环优化: - 消除循环终止判断时的方法调用:在循环中...
1. 大循环体性能优化:在for循环中,如果循环次数较大,应预先计算并存储在变量中,避免每次迭代时重复计算,如:for (var i = 0; i ; i++) {...},其中loopCount是预先计算好的循环次数。 2. 方法绑定:在事件处理...