У меня есть следующий простой код, и когда я компилирую их в 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 seperator) {
int seperator_index = strchr(value, seperator) - value;
char* result = malloc(seperator_index);
memcpy(result, value, seperator_index);
result[seperator_index] = '\0';
return result;
}
int main() {
const char seperator = ',';
clock_t t = clock();
for (size_t i = 0; i < 100000000; ++i) {
free(get("127.0.0.1, 127.0.0.2:1111", seperator));
}
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 секунд.
Итак, мои вопросы:
- Почему существует огромная разница в производительности между моим 'strchr_x' и 'strchr' стандартной библиотеки в GCC?
- Почему существует огромный разрыв производительности между GCC и Clang?