gpt4 book ai didi

c - 为什么前几个字符串赋值比较慢?

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:11 25 4
gpt4 key购买 nike

我一直在用下面的代码测量初始化字符串的速度,发现了一些奇怪的东西:

#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 不使用这些。

最佳答案

您的代码实际上并没有复制任何字符数据,因为您只是设置了一个指向字符串文字的指针。

因此,整个前提是错误的,“分配”的字符数与花费的时间之间没有相关性。

这是一个超微基准,很难做到正确,因为您实际上是在尝试测量单个指针大小赋值所花费的时间,这实际上不是很多代码。

速度差异可能是由缓存/内存延迟引起的。您可以阅读生成的代码以确定 str 是否存储在寄存器中,当然也可以使用优化设置。

注意:您的测量方法,平均,意味着开销的缓存占用空间(time_diffs 数组)比测试本身的占用空间大很多,所以这是可能是什么导致了不规则,第一次 time_diffs 没有被缓存。

关于c - 为什么前几个字符串赋值比较慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24555453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com