#include <stdio.h>
#include <stdlib.h>
#include <string.h>
inline unsigned long long rdtsc() {
unsigned long long ret;
__asm__ volatile ("rdtsc" : "=A" (ret));
return ret;
}
char *times_simple(char *str, size_t times) {
size_t i, len = strlen(str);
char *str2 = malloc(len*times + 1);
for(i=0;i<len*times;i+=len) {
memcpy(str2+i, str, len);
}
str2[len*times] = '\0';
return str2;
}
char *times_log(char *str, size_t times) {
size_t n, len = strlen(str);
char *str2 = malloc(len*times + 1);
n = len;
memcpy(str2, str, n);
while(n <= len*times/2) {
memcpy(str2+n, str2, n);
n *= 2;
}
memcpy(str2+n, str2, len*times-n);
str2[len*times] = '\0';
return str2;
}
int main(int argc, char **argv) {
static char *str = "hoge";
char *str2;
size_t times = 100;
unsigned long long start, end;
start = rdtsc();
str2 = times_simple(str, times);
end= rdtsc();
printf("%s x %d = %s\n", str, times, str2);
printf("time stamp counter: %llu\n", end - start);
start = rdtsc();
str2 = times_log(str, times);
end= rdtsc();
printf("%s x %d = %s\n", str, times, str2);
printf("time stamp counter: %llu\n", end - start);
return 0;
}