fork(1) 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. int cnt[N];
  40. int sum = 0;
  41.  
  42. void func1()
  43. {
  44. sum++;
  45. }
  46.  
  47. void func2()
  48. {
  49. sum--;
  50. }
  51.  
  52. clock_t now(void)
  53. {
  54. return clock();
  55. }
  56.  
  57. double ms(clock_t t1, clock_t t2)
  58. {
  59. return (t2 - t1) / (double)CLOCKS_PER_SEC;
  60. }
  61.  
  62. int main(void)
  63. {
  64. void (*func[])(void) = { func1, func2 };
  65. int i, j;
  66. clock_t beg;
  67.  
  68. for (i = 0; i < N; i++)
  69. cnt[i] = i % 2; // call altenatively
  70.  
  71. puts("Call 0101010101....");
  72. beg = now();
  73. for (j = 0; j < M; j++)
  74. for (i = 0; i < N; i++)
  75. func[cnt[i]]();
  76. printf("%.3fms\n", ms(beg, now()));
  77.  
  78. printf("sum = %d\n", sum);
  79. sum = 0;
  80.  
  81. for (i = 0; i < N; i++)
  82. cnt[i] = (i % 3) ? 1 : 0; // call one in three times
  83.  
  84. puts("Call 001001001....");
  85. beg = now();
  86. for (j = 0; j < M; j++)
  87. for (i = 0; i < N; i++)
  88. func[cnt[i]]();
  89. printf("%.3fms\n", ms(beg, now()));
  90.  
  91. printf("sum = %d\n", sum);
  92. sum = 0;
  93.  
  94. for (i = 0; i < N; i++)
  95. cnt[i] = ((i % 4) == 0 || (i % 4) == 1) ? 1 : 0;
  96.  
  97. puts("Call 00110011....");
  98. beg = now();
  99. for (j = 0; j < M; j++)
  100. for (i = 0; i < N; i++)
  101. func[cnt[i]]();
  102. printf("%.3fms\n", ms(beg, now()));
  103.  
  104. printf("sum = %d\n", sum);
  105. sum = 0;
  106.  
  107. srand(time(NULL));
  108. for (i = 0; i < N; i++)
  109. cnt[i] = (rand() >> 3) % 2; // call in random
  110.  
  111. puts("Call in Random");
  112. beg = now();
  113. for (j = 0; j < M; j++)
  114. for (i = 0; i < N; i++)
  115. func[cnt[i]]();
  116. printf("%.3fms\n", ms(beg, now()));
  117.  
  118. printf("sum = %d\n", sum);
  119.  
  120. return 0;
  121. }
  122.  
Success #stdin #stdout 2.27s 41312KB
stdin
Standard input is empty
stdout
Call 0101010101....
0.620ms
sum = 0
Call 001001001....
0.520ms
sum = -19999992
Call 00110011....
0.350ms
sum = 0
Call in Random
0.430ms
sum = 4152