2016-12-28 3 views
-3

受信したコメントに基づいてこの質問を言い換えています。ループに条件が含まれているときにCプログラムが遅くなる理由

私は300億回実行され、malloc()を使用して割り当てられたメモリのチャンクに値を割り当てます。

ループに条件が含まれている場合、条件が存在しない場合よりもはるかに遅く実行されます。

シナリオA:(43秒)状態が存在すると、プログラムが遅い

シナリオB:条件は存在せず、プログラムがはるかに高速である(4秒)

// gcc -O3 -c block.c && gcc -o block block.o 



#include <stdio.h> 
#include <stdlib.h> 


#define LEN 3000000000 

int main (int argc, char** argv){ 

    long i,j; 

    unsigned char *n = NULL; 
    unsigned char *m = NULL; 

    m = (unsigned char *) malloc (sizeof(char) * LEN); 

    n = m; 

    srand ((unsigned) time(NULL)); 

    int t = (unsigned) time(NULL); 

    for (j = 0; j < 10; j++){ 

     n = m; 

     for (i = 0; i < LEN; i++){ 


      //////////// A: THIS IS SLOW 
      /* 
      if (i % 2){ 
       *n = 1;   

      } else { 
       *n = 0; 
      } 
      */ 
      /////////// END OF A 


      /////////// B: THIS IS FAST 

      *n = 0; 

      i % 2; 

      *n = 1; 

      /////////// END OF B 

      n += 1; 

     } 
    } 


    printf("Done. %d sec \n", ((unsigned) time(NULL)) - t); 

    free(m); 

    return 0; 
} 

以下のシナリオを確認よろしくお願いします。 KD

+1

私たちは推測できる文脈が一切ありません。 1つの推測では、0は文字列の終端文字として使用されますが、文脈が必要です。 – Gerhardh

+4

透視部は産休中です。非作業コードに関するすべての質問には、[mcve]が付いている必要があります。経営陣は、生じた不便をお詫びしたい。 –

+0

実行してコンパイルできる最小限の簡略化されたコードを投稿してください。そして、あなたが正しいとすれば、私は多くの投票を予測します。 –

答えて

0

gcc -S -O3を使用すると、結果のアセンブラを見ることができます。

高速バージョン:

movl %eax, %r12d 
    .p2align 4,,10 
    .p2align 3 
.L2: 
    movl $3000000000, %edx 
    movl $1, %esi 
    movq %rbp, %rdi 
    call memset 
    subq $1, %rbx 
    jne .L2 

スローバージョン:

movl $10, %edi 
    movl %eax, %ebp 
    movl $3000000000, %esi 
    .p2align 4,,10 
    .p2align 3 
.L2: 
    xorl %edx, %edx 
    .p2align 4,,10 
    .p2align 3 
.L5: 
    movq %rdx, %rcx 
    andl $1, %ecx 
    movb %cl, (%rbx,%rdx) 
    addq $1, %rdx 
    cmpq %rsi, %rdx 
    jne  .L5 
    subq $1, %rdi 
    jne  .L2 

結論:コンパイラはあなたが思うよりも賢くです。ここ は、Intelボックスの一例です。内部ループをmemsetとして最適化することができます(これはIntel上でSSE/AVXまたはREP命令を使用するため高速です)。しかし、結果が異なるため、この最適化は条件が保持されている場合には実行できません。

関連する問題