#include #include "rdtick.h" extern int test(int arg, ...); #define zero 0 #define zerox2 zero, zero #define zerox4 zerox2, zerox2 #define zerox8 zerox4, zerox4 #define zerox16 zerox8, zerox8 #define zerox32 zerox16, zerox16 #define zerox64 zerox32, zerox32 #define zerox128 zerox64, zerox64 #define zerox256 zerox128, zerox128 #define zerox512 zerox256, zerox256 #define zerox1024 zerox512, zerox512 #define zerox2046 zerox1024, zerox1024 #define loop(i, ...) \ start = rdtick(); \ for (j = 0; j < 0x400; j++) { \ test(__VA_ARGS__); \ } \ end = rdtick(); \ printf("%d %lld\n", i, end - start); #define loopx2(i, ...) \ loop(i, __VA_ARGS__) \ loop(i + 1, __VA_ARGS__, zero) #define loopx4(i, ...) \ loopx2(i, __VA_ARGS__) \ loopx2(i + 2, __VA_ARGS__, zerox2) #define loopx8(i, ...) \ loopx4(i, __VA_ARGS__) \ loopx4(i + 4, __VA_ARGS__, zerox4) #define loopx16(i, ...) \ loopx8(i, __VA_ARGS__) \ loopx8(i + 8, __VA_ARGS__, zerox8) #define loopx32(i, ...) \ loopx16(i, __VA_ARGS__) \ loopx16(i + 16, __VA_ARGS__, zerox16) #define loopx64(i, ...) \ loopx32(i, __VA_ARGS__) \ loopx32(i + 32, __VA_ARGS__, zerox32) #define loopx128(i, ...) \ loopx64(i, __VA_ARGS__) \ loopx64(i + 64, __VA_ARGS__, zerox64) #define loopx256(i, ...) \ loopx128(i, __VA_ARGS__) \ loopx128(i + 128, __VA_ARGS__, zerox128) #define loopx512(i, ...) \ loopx256(i, __VA_ARGS__) \ loopx256(i + 256, __VA_ARGS__, zerox256) #define loopx1024(i, ...) \ loopx512(i, __VA_ARGS__) \ loopx512(i + 512, __VA_ARGS__, zerox512) #define loopx2048(i, ...) \ loopx1024(i, __VA_ARGS__) \ loopx1024(i + 1024, __VA_ARGS__, zerox1024) int main() { int j; long long start, end; loopx2048(1, 0); return 0; }