Почему мой простой код C ++ Sieve of Atkin Algorithm (поиск основных чисел) настолько медленно?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему мой простой код C ++ Sieve of Atkin Algorithm (поиск основных чисел) настолько медленно?

Сообщение Anonymous »

Я решил сравнить только для интереса к производительности базового алгоритма, реализованного в PHP/Lua/Python с той же программой в C ++, что и эталонная точка. Поиск алгоритма Primes и примеров кода здесь. Я написал этот алгоритм в PHP/LUA/PY/C ++ без каких -либо проблем и, кроме того, сделал простой входной вход с числовым поиском для удобства (до тех пор, пока пользователь выходит из «Заглавного цикла»). Здесь мои результаты для поиска всех простых чисел до 1 000 000 (полностью 78498 просты) и для кода C ++ до 100 000 (полностью 9592 PRIME):
предел - 1e6
  • lu : ~0.8 seconds
  • Python3 : ~19 seconds
Limit is 1e5
  • C++ : ~12-13 seconds
Imagine my disappointment, when Я видел производительность кода C ++ с ограничением меньшего числа в 10 раз, потому что он в любом случае должен работать намного быстрее, чем LUA. Я попытался скомпилировать свой код с оптимизацией (см. Ниже), компилировать код в MS Visual Studio 2022 (MSVC ++ 20 ISO), компилируйте и запустите код на ноутбуке и снова на рабочем столе, но под Ubuntu. Я даже отправил свой исполняемый файл в свой родственник, чтобы запустить на его машине, но результаты всегда были одинаковыми: все еще ~ 12-17 секунд в зависимости от машины. < /P>
Что я делаю неправильно или не делаю правильно? Gcc/ubuntu:
g++ -std=c++20 -march=x86-64 -mtune=ivybridge -O3 primenum.cpp -o primenum.exe


[*] msvc ++ 20/win10: релиз, x64, iso c ++ 20 стандарт

Desktop PC: Win10x64/Ubuntu Server 24.04 LTS, Intel I5-3570K Bridge; /> ПК ноутбука: win10x64, intel i7-3537u ivy bridge; < /p>
< /li>
< /ul>
my c ++ Полный код: < /p>
< /p>
3 : ";
getline(cin, input);
str_tolower(input);

// Processing user input string
// ----------------------------
if (!cin or input.empty()) { // if input failed --> repeat 'while' loop
continue;
} else if (input == "exit") {
// Successful program termination
exit(EXIT_SUCCESS);
} else {
try { // if input is float --> OK...
f_limit = stof(input);
} catch (...) { // ...else --> repeat 'while' loop
continue;
}
f_limit = stof(input);

// Check if input is integer
if (floor(f_limit) == f_limit) {
limit = static_cast(f_limit);
start_time = time(NULL);
SieveOfAtkin(limit);
cout

Подробнее здесь: https://stackoverflow.com/questions/795 ... me-numbers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»