我有以下简单的代码,当我在GCC和Clang中编译它们时,它们的执行时间之间存在巨大的性能差异,因为您可以看到下面的结果和编译器的版本。
char* strchr_x(register const char* s,int c) {
do {
if (*s == c) {
return (char*)s;
}
} while (*s++);
return 0;
}
char* get(char* value,const char separator) {
int separator_index = strchr(value,separator) - value;
char* result = malloc(separator_index);
memcpy(result,value,separator_index);
result[separator_index] = '\0';
return result;
}
int main() {
const char separator = ',';
clock_t t = clock();
for (size_t i = 0; i < 100000000; ++i) {
free(get("127.0.0.1,127.0.0.2:1111",separator));
}
float elapsed_seconds = (((double)(clock() - t)) / CLOCKS_PER_SEC);
printf("%f seconds.\n",elapsed_seconds);
return 0;
}
gcc version 8.1.0 (Ubuntu 8.1.0-5ubuntu1~16.04)
# gcc main.c -O3 -o gcc-main
# 1.968750 seconds.
clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
# clang main.c -O3 -o clang-main
# 0.000000 seconds.
此外,“ strchr_x”实现与原始GCC实现完全相同。您可以在https://github.com/gcc-mirror/gcc/blob/master/libiberty/strchr.c
上看到它当我在标准库中使用'strchr'方法时; GCC的运行时间减少到0.015625秒。
所以,我的问题是:
- 在GCC中,为什么我的'strchr_x'与标准库的'strchr'在性能上有巨大差异?
- 为什么在GCC和Clang之间存在巨大的性能差距?