Я тратил много времени на то, чтобы понять, почему алгоритм, который должен быть более эффективным, чем другой, однако, был совершенно одинаковым с точки зрения скорости для другого.Я сделал эти операции: я скомпилировал первый исходный код в отдельном окне терминала;пока второй исходник в другом окне.Я просто использовал:
$ cc number_v1.c
для компиляции первого и a:
$ cc number_v2.c
для второгоисходный код.Я на Mac OS X Дарвин Ядро Версия 18.7.0: Вт 20 августа 16:57:14 PDT 2019;root: xnu-4903.271.2 ~ 2 / RELEASE_X86_64 x86_64.
В ответ у меня был точно такой же результат синхронизации.Что-то невозможное, учитывая лучший алгоритм второго исходного кода.
Затем я выключаю все и пытаюсь снова на следующий день.К моему удивлению, я наконец-то вижу различия: второй исходный код завершен в гораздо более короткие сроки, чем первый.Кажется, что в первый раз компилятор не скомпилировал код листинга и, возможно, все еще считал старую версию;Учтите, что я несколько раз пытался модифицировать исходный код с помощью относительной компиляции, но в результате всегда был один и тот же.
Некоторое время назад мне приходилось работать над другим исходным кодом (с относительной потерей времени).К сожалению, событие не воспроизводимо и не происходит часто.
Кто-нибудь может объяснить, почему это произошло?Есть ли в этих случаях тип кеша для сброса?
Ниже приведены их соответствующие исходные коды;речь идет о поиске простых чисел от 2 до 1000000.
/* cc number_v1.c */
#include <stdio.h>
int main(void) {
int i, j, n = 1000000;
for(i = 2; i <= n; i++) {
for(j = 2; j < i && i % j != 0; j++)
;
if(j >= i) printf("%d ", j);
}
return 0;
}
/* cc number_v2.c */
#include <stdio.h>
int main(void) {
int i, j, n = 1000000;
for(i = 2; i <= n; i++) {
for(j = 2; j * j <= i && i % j != 0; j++)
;
if(j * j > i) printf("%d ", i);
}
return 0;
}