c语言中for优化,c – 在For循环中发生了什么GCC优化?
使用
gcc 4.6和-O3,我使用簡單的時間命令計時以下四個代碼
#include
int main(int argc, char* argv[])
{
double val = 1.0;
unsigned int numIterations = 1e7;
for(unsigned int ii = 0;ii < numIterations;++ii) {
val *= 0.999;
}
std::cout<
}
案例1在0.09秒內運行
#include
int main(int argc, char* argv[])
{
double val = 1.0;
unsigned int numIterations = 1e8;
for(unsigned int ii = 0;ii < numIterations;++ii) {
val *= 0.999;
}
std::cout<
}
案例2運行時間為17.6秒
int main(int argc, char* argv[])
{
double val = 1.0;
unsigned int numIterations = 1e8;
for(unsigned int ii = 0;ii < numIterations;++ii) {
val *= 0.999;
}
}
案例3在0.8秒內運行
#include
int main(int argc, char* argv[])
{
double val = 1.0;
unsigned int numIterations = 1e8;
for(unsigned int ii = 0;ii < numIterations;++ii) {
val *= 0.999999;
}
std::cout<
}
案例4在0.8秒內運行
我的問題是為什么第二種情況比其他所有情況都慢得多?案例3顯示刪除cout使運行時恢復與預期的一致.案例4表明,改變乘數也大大減少了運行時間.在案例2中沒有進行哪些優化或優化以及為什么?
更新:
當我最初運行這些測試時,沒有單獨的變量numIterations,該值在for循環中被硬編碼.通常,對此值進行硬編碼會使得運行速度比此處給出的情況慢.對于案例3來說尤其如此,它幾乎立即使用如上所示的numIterations變量運行,表明James McNellis對于整個循環的優化是正確的.我不確定為什么將1e8硬編碼到for循環中會阻止在案例3中刪除循環或在其他情況下使事情變慢,但是,案例2的基本前提明顯更慢更為真實.
區分裝配輸出給出了上面給出的情況
案例2和案例1:
movl $100000000,16(%esp)
movl $10000000,16(%esp)
案例2和案例4:
.long -652835029
.long 1072691150
.long -417264663
.long 1072693245
總結
以上是生活随笔為你收集整理的c语言中for优化,c – 在For循环中发生了什么GCC优化?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 建立索引的例子_mysql建
- 下一篇: java数据段 静态区_回顾一下基础,关