fork download
  1. #if 0
  2. 以下のようなコードがあったとする
  3.  
  4. for(i=0;i<100;i++){
  5.    /*
  6.     コード20行
  7.    */
  8. }
  9.  
  10. この20行のコードの最後に、変数xによって二分岐させたい部分が1行だけある
  11. この場合、コードの見やすさを優先すべきか、処理効率を優先すべきか
  12.  
  13. コードの見やすさ優先
  14. for(i=0;i<100;i++){
  15.    /* コード19行 */
  16.    if (x==0) /* 処理 */
  17.    else /* 処理 */
  18. }
  19.  
  20. 処理効率優先
  21. if (x=0){
  22.    for(i=0;i<100;i++){
  23.       /* コード20行 */
  24.    }
  25. }else{
  26.    for(i=0;i<100;i++){
  27.       /* コード20行 */
  28.    }
  29. }
  30. #endif
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <time.h>
  35.  
  36. #define N 10000000
  37. #define M 6
  38.  
  39. typedef int (*IndexGenerator)(int);
  40. typedef void (*BenchProcessor)(void);
  41. typedef struct {
  42. const char* tag;
  43. IndexGenerator generator;
  44. } BenchType;
  45.  
  46. double bm_clock_mark(){
  47. static clock_t certain_time;
  48. clock_t previous;
  49.  
  50. previous = certain_time;
  51. certain_time = clock();
  52.  
  53. return (double)(certain_time - previous)/(CLOCKS_PER_SEC);
  54. }
  55.  
  56. double do_bench( BenchProcessor procs[], IndexGenerator gen, int rounds, int loops ){
  57. static int induces[N];
  58. int i, j;
  59.  
  60. // prepare induces.
  61. for (i = 0; i < loops; i++)
  62. induces[i] = gen(i);
  63.  
  64. bm_clock_mark();
  65. for( i = 0; i < rounds; i++ )
  66. for( j = 0; j < loops; j++ )
  67. procs[ induces[j] ]();
  68.  
  69. return bm_clock_mark();
  70. }
  71.  
  72.  
  73. // actual functions
  74. static int sum = 0;
  75. void func1(){ sum++; }
  76. void func2(){ sum--; }
  77.  
  78. // index generators (i = 1 ... N-1)
  79. int gen_0101(int i){ return (i % 2); }
  80. int gen_0011(int i){ return (i % 4) < 2 ? 0 : 1; }
  81. int gen_001 (int i){ return (i % 3) != 0 ? 0 : 1; }
  82. int gen_rand(int i){ return ( rand() & 0x01 ); }
  83.  
  84. int main(void){
  85. int i;
  86. double elapsed;
  87. BenchType b;
  88.  
  89. BenchProcessor procs[] = { func1, func2 };
  90.  
  91. BenchType stages[] = {
  92. {"0101010101", gen_0101},
  93. {"001001001", gen_001 },
  94. {"00110011", gen_0011},
  95. {"randomized", gen_rand}
  96. };
  97.  
  98. srand(time(NULL));
  99.  
  100. printf("N = %d, M = %d\n",N,M);
  101. printf("%16s %8s %12s\n","pattern","time(s)","sum");
  102.  
  103. for( i = 0; i < (sizeof(stages)/sizeof(BenchType)); i++ ){
  104. b = stages[i];
  105. sum = 0;
  106. elapsed = do_bench(procs,b.generator,M,N);
  107. printf("%16s .... %8.2f %12d\n",b.tag, elapsed, sum);
  108. }
  109.  
  110. return 0;
  111. }
  112.  
Success #stdin #stdout 2.72s 41352KB
stdin
Standard input is empty
stdout
N = 10000000, M = 6
         pattern       time(s)          sum
      0101010101 ....     0.61            0
       001001001 ....     0.49     19999992
        00110011 ....     0.70            0
      randomized ....     0.54        23028