История изменений
Исправление soomrack, (текущая версия) :
Коротко: тест ничего не тестирует.
Судя по коду С++ проверяется первые 10000000 числе без какой-либо серьезной оптимизации (с этой т.з. этот тест на простоту это просто дно, ну да ладно, не в этом дело). С т.з. оптимизации программа может выкинуть главный цикл, т.к. результаты функции нигде не используются, поэтому с -O2 результат смотреть некорректно, а вот если бы выводилось количество найденных простых чисел, то тогда да.
Кеш тут роли не играет, т.к. нет никаких объемов, в каждый момент времени хранится только несколько чисел – которое проверяют на простоту, предполагаемый делитель и два счетчика циклов.
Поэтому тест будет упираться в то, как микрокод процессора оптимизирует поток инструкций (видимо в большей степени, т.к. результат работы функции не используется, циклы параллелятся и пр.) и в частоту проца. Можно посмотреть в какие инструкции превращает компилятор эту программу без оптимизации…
Вывод: никаких выводов сделать нельзя ввиду некорректности теста.
Для Ъ (код из ссылки):
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
bool isPrime(int num)
{
if (num == 2) {
return true;
}
if (num <= 1 || num % 2 == 0) {
return false;
}
double sqrt_num = sqrt(double(num));
for (int div = 3; div <= sqrt_num; div +=2)
{
if (num % div == 0) {
return false;
}
}
return true;
}
int main()
{
int N = 10000000;
clock_t start, end;
start = clock();
for (int i = 0; i < N; i++) {
isPrime(i);
}
end = clock();
cout << (end - start) / ((double) CLOCKS_PER_SEC);
cout << " sec \n";
return 0;
}
Исправление soomrack, :
Коротко: тест ничего не тестирует.
Судя по коду С++ проверяется первые 10000000 числе без какой-либо серьезной оптимизации (с этой т.з. этот тест на простоту это просто дно, ну да ладно, не в этом дело). С т.з. оптимизации программа может выкинуть главный цикл, т.к. результаты функции нигде не используются, поэтому с -O2 результат смотреть некорректно, а вот если бы выводилось количество найденных простых чисел, то тогда да.
Кеш тут роли не играет, т.к. нет никаких объемов, в каждый момент времени хранится только несколько чисел – которое проверяют на простату, предполагаемый делитель и два счетчика циклов.
Поэтому тест будет упираться в то, как микрокод процессора оптимизирует поток инструкций (видимо в большей степени, т.к. результат работы функции не используется, циклы параллелятся и пр.) и в частоту проца. Можно посмотреть в какие инструкции превращает компилятор эту программу без оптимизации…
Вывод: никаких выводов сделать нельзя ввиду некорректности теста.
Для Ъ (код из ссылки):
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
bool isPrime(int num)
{
if (num == 2) {
return true;
}
if (num <= 1 || num % 2 == 0) {
return false;
}
double sqrt_num = sqrt(double(num));
for (int div = 3; div <= sqrt_num; div +=2)
{
if (num % div == 0) {
return false;
}
}
return true;
}
int main()
{
int N = 10000000;
clock_t start, end;
start = clock();
for (int i = 0; i < N; i++) {
isPrime(i);
}
end = clock();
cout << (end - start) / ((double) CLOCKS_PER_SEC);
cout << " sec \n";
return 0;
}
Исходная версия soomrack, :
Коротко: тест ничего не тестирует.
Судя по коду С++ проверяется первые 10000000 числе без какой-либо оптимизации (с т.з. тест на простоту это просто дно, ну да ладно, не в этом дело). С т.з. оптимизации программа может выкинуть главный цикл, т.к. результаты функции нигде не используются, поэтому с -O2 результат смотреть некорректно, а вот если бы выводилось количество найденных простых чисел, то тогда да.
Кеш тут роли не играет, т.к. нет никаких объемов, в каждый момент времени хранится только несколько чисел – которое проверяют на простату, предполагаемый делитель и два счетчика циклов.
Поэтому тест будет упираться в то, как микрокод процессора оптимизирует поток инструкций (видимо в большей степени, т.к. результат работы функции не используется, циклы параллелятся и пр.) и в частоту проца. Можно посмотреть в какие инструкции превращает компилятор эту программу без оптимизации…
Вывод: никаких выводов сделать нельзя ввиду некорректности теста.
Для Ъ (код из ссылки):
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
bool isPrime(int num)
{
if (num == 2) {
return true;
}
if (num <= 1 || num % 2 == 0) {
return false;
}
double sqrt_num = sqrt(double(num));
for (int div = 3; div <= sqrt_num; div +=2)
{
if (num % div == 0) {
return false;
}
}
return true;
}
int main()
{
int N = 10000000;
clock_t start, end;
start = clock();
for (int i = 0; i < N; i++) {
isPrime(i);
}
end = clock();
cout << (end - start) / ((double) CLOCKS_PER_SEC);
cout << " sec \n";
return 0;
}