我们的计算机科学老师曾经说过,由于某些原因,倒计时比计数更有效率.例如,如果你需要使用FOR循环并且某个地方没有使用循环索引(比如在屏幕上打印一行N*),我的意思是这样的代码:
for (i = N; i >= 0; i--)
putchar('*');
Run Code Online (Sandbox Code Playgroud)
比以下更好:
for (i = 0; i < N; i++)
putchar('*');
Run Code Online (Sandbox Code Playgroud)
这是真的吗?如果是这样,有谁知道为什么?
我有许多紧凑的循环,我正在尝试使用GCC和内在函数进行优化.考虑例如以下功能.
void triad(float *x, float *y, float *z, const int n) {
float k = 3.14159f;
int i;
__m256 k4 = _mm256_set1_ps(k);
for(i=0; i<n; i+=8) {
_mm256_store_ps(&z[i], _mm256_add_ps(_mm256_load_ps(&x[i]), _mm256_mul_ps(k4, _mm256_load_ps(&y[i]))));
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生这样的主循环
20: vmulps ymm0,ymm1,[rsi+rax*1]
25: vaddps ymm0,ymm0,[rdi+rax*1]
2a: vmovaps [rdx+rax*1],ymm0
2f: add rax,0x20
33: cmp rax,rcx
36: jne 20
Run Code Online (Sandbox Code Playgroud)
但是cmp指令是不必要的.而不是具有rax在零开始和结束在sizeof(float)*n我们可以设置基指针(rsi,rdi,和rdx),以阵列的端部,并设置rax到-sizeof(float)*n然后测试为零.我可以用我自己的汇编代码这样做
.L2 vmulps ymm1, ymm2, [rdi+rax]
vaddps ymm0, ymm1, [rsi+rax]
vmovaps [rdx+rax], ymm0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试重复一段代码,不使用条件,但仍然只重复特定次数.
基本上,这样的事情:
repeat(50)
{
//Do stuff here.
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?除了复制和粘贴50次?
我这样做是因为我想如果我知道有多少次我想重复一些事情,那么每次检查一个条件要快得多.那是准确的吗?或者我还会检查它重复了多少次?
基本上,它是否更快?
c ×2
performance ×2
assembly ×1
c++ ×1
gcc ×1
intrinsics ×1
loops ×1
optimization ×1
repeat ×1