#if 0
以下のようなコードがあったとする

for(i=0;i<100;i++){
　　　/*
　　　　コード20行
　　　*/
}

この20行のコードの最後に、変数xによって二分岐させたい部分が1行だけある
この場合、コードの見やすさを優先すべきか、処理効率を優先すべきか

コードの見やすさ優先
for(i=0;i<100;i++){
　　　/* コード19行 */
　　　if (x==0) /* 処理 */
　　　else /* 処理 */
}

処理効率優先
if (x=0){
　　　for(i=0;i<100;i++){
　　　　　　/* コード20行 */
　　　}
}else{
　　　for(i=0;i<100;i++){
　　　　　　/* コード20行 */
　　　}
}
#endif

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

#define N 10000000
#define M 6

typedef int  (*IndexGenerator)(int);
typedef void (*BenchProcessor)(void);
typedef struct {
	const char* tag;
	IndexGenerator generator;
} BenchType;

double bm_clock_mark(){
	static clock_t certain_time;
	clock_t previous;

	previous = certain_time;
	certain_time = clock();

	return (double)(certain_time - previous)/(CLOCKS_PER_SEC);
}

double do_bench( BenchProcessor procs[], IndexGenerator gen, int rounds, int loops ){
	static int induces[N];
	int i, j;
	
	// prepare induces.
	for (i = 0; i < loops; i++)
		induces[i] = gen(i);

	bm_clock_mark();
	for( i = 0; i < rounds; i++ )
		for( j = 0; j < loops; j++ )
			procs[ induces[j] ]();

	return bm_clock_mark();
}


// actual functions
static int sum = 0;
void func1(){ sum++; }
void func2(){ sum--; }

// index generators (i = 1 ... N-1)
int gen_0101(int i){ return (i % 2); }
int gen_0011(int i){ return (i % 4) <  2 ? 0 : 1; }
int gen_001 (int i){ return (i % 3) != 0 ? 0 : 1; }
int gen_rand(int i){ return ( rand() & 0x01 ); }

int main(void){
	int i;
	double elapsed;
	BenchType b;
	
	BenchProcessor procs[] = { func1, func2 };
	
	BenchType stages[] = {
		{"0101010101", gen_0101},
		{"001001001",  gen_001 },
		{"00110011",   gen_0011},
		{"randomized", gen_rand}
	};

 	srand(time(NULL));
  
	printf("N = %d, M = %d\n",N,M);
	printf("%16s      %8s %12s\n","pattern","time(s)","sum");

	for( i = 0; i < (sizeof(stages)/sizeof(BenchType)); i++ ){
		b = stages[i];
		sum = 0;
		elapsed = do_bench(procs,b.generator,M,N);
		printf("%16s .... %8.2f %12d\n",b.tag, elapsed, sum);
	}

	return 0;
}
