【发布时间】:2014-07-03 13:46:36
【问题描述】:
我一直在用下面的代码测量初始化字符串的速度,发现有些奇怪:
#include <stdio.h>
#include <time.h>
#define START_COUNTING clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start)
#define END_COUNTING clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end)
#define NUM_OF_LOOPS 8192
long time_difference(struct timespec end, struct timespec beginning) {
long long diff = (long long)end.tv_sec - (long long)beginning.tv_sec;
return(end.tv_nsec - beginning.tv_nsec + ((diff > 0) ? 1000000L : 0));
}
long average(long numbers[NUM_OF_LOOPS]) {
long long sum = 0;
int i;
for(i = 0; i < NUM_OF_LOOPS; i++)
sum += numbers[i];
return sum / NUM_OF_LOOPS;
}
int main(void) {
struct timespec start;
struct timespec end;
long time_diffs[NUM_OF_LOOPS];
int i;
char * str = NULL;
for(i = 0; i < NUM_OF_LOOPS; i++) {
START_COUNTING;
str = "T";
END_COUNTING;
time_diffs[i] = time_difference(end, start);
}
printf("%li ns - assigning 2 chars to a string\n", average(time_diffs));
for(i = 0; i < NUM_OF_LOOPS; i++) {
START_COUNTING;
str = "Testing";
END_COUNTING;
time_diffs[i] = time_difference(end, start);
}
printf("%li ns - assigning 8 chars to a string\n", average(time_diffs));
for(i = 0; i < NUM_OF_LOOPS; i++) {
START_COUNTING;
str = "Testing it here";
END_COUNTING;
time_diffs[i] = time_difference(end, start);
}
printf("%li ns - assigning 16 chars to a string\n", average(time_diffs));
for(i = 0; i < NUM_OF_LOOPS; i++) {
START_COUNTING;
str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit nullam.";
END_COUNTING;
time_diffs[i] = time_difference(end, start);
}
printf("%li ns - assigning 64 chars to a string\n", average(time_diffs));
for(i = 0; i < NUM_OF_LOOPS; i++) {
START_COUNTING;
str = ""; // String omitted because it would waste a lot of space
END_COUNTING;
time_diffs[i] = time_difference(end, start);
}
printf("%li ns - assigning 1024 chars to a string\n", average(time_diffs));
return 0;
}
在分析它时,我总是想出这个结果:
1126 ns - assigning 2 chars to a string
828 ns - assigning 8 chars to a string
832 ns - assigning 16 chars to a string
834 ns - assigning 64 chars to a string
857 ns - assigning 1024 chars to a string
无论是分配 2 个字符、8 个字符还是很多,第一个结果总是比其余的要慢得多。我曾尝试在循环之前放置 1 个作业,但结果仍然没有太大变化。
有谁知道为什么分配到字符串的前几次比较慢?我环顾四周,但只找到了由于 JIT 编译器而发生的答案,但 C 不使用这些。
【问题讨论】:
-
CPU 缓存可能吗?按需加载数据?
-
字符数无关紧要 - 在任何情况下它只是分配一个指针。函数的第一次执行可能会比较慢,因为需要的数据应该被加载到内存中。
标签: c string performance initialization