我正在查看一些代码进行审核,并且遇到了繁忙的等待:
int loop = us*32;
int x;
for(x = 0;x<loop;x++)
{
/*do nothing*/
}
Run Code Online (Sandbox Code Playgroud)
我似乎记得读过这些空循环可以被优化掉.这是在这里发生的事情还是可以的?
有没有一种简单的方法可以在执行C程序时快速计算执行的指令数量(x86指令 - 每个指令的数量和数量)?
我gcc version 4.7.1 (GCC)在x86_64 GNU/Linux机器上使用.
我使用for/while循环来实现代码中的延迟.延迟的持续时间在这里并不重要,尽管它足够大而值得注意.这是代码片段.
uint32_t i;
// Do something useful
for (i = 0; i < 50000000U; ++i)
{}
// Do something useful
Run Code Online (Sandbox Code Playgroud)
我观察到的问题是这个for循环不会被执行.它可能会被编译器忽略/优化.但是,如果我i通过volatile 限定循环计数器,则for循环似乎执行,我确实注意到执行中所需的延迟.
对于使用/不使用volatile关键字的编译器优化的理解,这种行为似乎有点违反直觉.
即使循环计数器得到优化并存储在处理器寄存器中,计数器是否仍然可以工作,也许延迟较小?(因为内存提取开销被废除了.)
我正在构建的平台是Xtensa处理器(由Tensilica提供),C编译器是由Tensilica提供的,Xtensa C/C++编译器以最高级别的优化运行.
我尝试使用gcc 4.4.7with -o3和ofast优化级别.在这种情况下,延迟似乎有效.
long long r = 0;
long long k = 0;
for (; k < 9999999999999; k++)
{
for (long long i = 0; i < 9999999999999; i++)
{
for (long long j = 0; j < 9999999999999; j++)
{
r = (r + (i * j) % 100) % 47;
if (r != 0)
{
r++;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码在i3Core上以0.000001壁秒执行,在i7Core boost::timer::auto_cpu_timer上检查.
但是对于visual studio 2010来说,它似乎在无限的时间里运行.
GCC或VS出了什么问题?GCC优化太多了吗?
实现繁忙循环的最佳方法是什么?如果我错了,请纠正我?
while (1); // obviously eats CPU.
while (1) { sleep(100); } // Not sure if it is the correct way ?
Run Code Online (Sandbox Code Playgroud) 我需要一个功能忙等待。
for(long int j=0; j<50000000; ++j)
;
Run Code Online (Sandbox Code Playgroud)
当我在发布模式下编译时,这会得到优化。除了在调试模式下编译之外,是否有某种方法可以导致它没有得到优化?我并不特别关心循环的实际数量,但它必须是一个明显的忙延迟。
它可以是带或不带语句的循环吗?
while (1)
{
//Empty
}
Run Code Online (Sandbox Code Playgroud)
要么
int i = 0;
while (1)
{
i++;
}
Run Code Online (Sandbox Code Playgroud) 我编写了一个非常简单的程序来测试gcc -O2选项,它会产生错误的行为.这是gcc的bug吗?
我的C程序:
#include <stdio.h>
int main(int argc, char **argv)
{
unsigned long i = 0;
while (1) {
if (++i > 0x1fffffffUL) {
printf("hello\n");
i = 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我用-O1编译它时,一切都是正确的,我在每个循环中加1.但是当我用-O2编译它时,我被忽略,在每个循环中输出"hello".为什么-O2会导致这种错误行为?是gcc的明显错误吗?我的gcc版本对于cygwin是4.8.3,我尝试了一个新版本,它也有同样的问题.
用-O1编译,汇编代码是:
Disassembly of section .text:
00000000 <_main>:
#include <stdio.h>
int main(int argc, char **argv)
{
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 10 sub $0x10,%esp
9: e8 00 00 00 00 call e <_main+0xe>
e: b8 00 …Run Code Online (Sandbox Code Playgroud)