相关疑难解决方法(0)

倒计时比倒数更快吗?

我们的计算机科学老师曾经说过,由于某些原因,倒计时比计数更有效率.例如,如果你需要使用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)

这是真的吗?如果是这样,有谁知道为什么?

c performance loops

130
推荐指数
7
解决办法
2万
查看次数

在GCC中生成没有cmp指令的循环

我有许多紧凑的循环,我正在尝试使用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)

c optimization assembly gcc intrinsics

12
推荐指数
1
解决办法
847
查看次数

重复一段代码固定次数

我正在尝试重复一段代码,不使用条件,但仍然只重复特定次数.

基本上,这样的事情:

repeat(50)
{
    //Do stuff here.
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?除了复制和粘贴50次?

我这样做是因为我想如果我知道有多少次我想重复一些事情,那么每次检查一个条件要快得多.那是准确的吗?或者我还会检查它重复了多少次?

基本上,它是否更快?

c++ performance repeat

8
推荐指数
1
解决办法
2万
查看次数

标签 统计

c ×2

performance ×2

assembly ×1

c++ ×1

gcc ×1

intrinsics ×1

loops ×1

optimization ×1

repeat ×1