Городской леший, вот. "Шедевр" написан за пол-часа, поэтому просьба ногами не бить :
Язык C++, компилировал g++ под Linux на разных 32 и 64 разрядных платформах. Тесты запускались в консоли, все ресурсоёмкие приложения были вырублены. Серьёзной разницы в производительности (по тесту) между многопользовательским и монопольным режимом не замечено.
Код:
#include <deque>
#include <stdio.h>
#include <math.h>
#include <time.h>
using namespace std;
int res;
#define MAX_VAL 4000000
int array1[MAX_VAL];
int array2[MAX_VAL];
int a, b, c, d, e;
float fa, fb, fc, fd, fe;
// Алгоритм: начинаем с числа 2. Выводим текущее число, "вычеркиваем" числа, кратные текущему, ищем следующее невычеркнутое число.
int eratosfen (void)
{
int min_val = 2, max_val = 999999;
// Поиск простых ведем до корня из max_val
int sqrt_max_val = (int)sqrt((double)max_val);
// Признаки "вычеркнутости" чисел (элементы 0 и 1 не используются)
deque<bool> flags (max_val+1, false); // первоначально все числа не перечеркнуты
int current_value (2);
do
{
// if (current_value >= min_val)
// printf("%d\n", current_value);
// Вычеркиваем все числа, кратные current_value, начиная с его квадрата
for (int i = current_value * current_value; i <= max_val; i += current_value)
flags[i] = true;
// Ищем следующее невычеркнутое число
for (++current_value; current_value <= sqrt_max_val && flags[current_value]; ++current_value) ;
} while (current_value <= sqrt_max_val);
// Выведем все невычеркнутые числа больше корня из N, при этом не рассматриваем числа менее min_val
for (current_value = min_val > sqrt_max_val+1 ? min_val : sqrt_max_val+1; current_value <= max_val; ++current_value)
if (!flags[current_value])
res = current_value;
// if (!flags[current_value])
// printf("%d\n", current_value);
return 0;
}
void test_add( int n )
{
int i,j;
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
for( i = 0; i < n; i++ )
{
for( j = 0; j < 1000000; j++ )
{
c = a + b + i;
c = c + i;
c = c + a;
c = c + b;
c = c + d;
c = c + e;
a = a + i;
b = a + i + b;
d = c + e;
e = d + a;
}
}
}
void test_sub( int n )
{
int i,j;
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
for( i = 0; i < n; i++ )
{
for( j = 0; j < 1000000; j++ )
{
c = a - b - i;
c = c - i;
c = c - a;
c = c - b;
c = c - d;
c = c - e;
a = a - i;
b = a - i - b;
d = c - e;
e = d - a;
}
}
}
void test_mul( int n )
{
int i,j;
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
for( i = 0; i < n; i++ )
{
for( j = 0; j < 1000000; j++ )
{
c = a * b * i;
c = c * i;
c = c * a;
c = c * b;
c = c * d;
c = c * e;
a = a * i;
b = a * i * b;
d = c * e;
e = d * a;
}
}
}
void test_fmul( int n )
{
int i,j;
fa = 1.1;
fb = 2.1;
fc = 3.2;
fd = 4.3;
fe = 5.4;
for( i = 0; i < n; i++ )
{
for( j = 0; j < 1000000; j++ )
{
fc = fa * fb * i;
fc = fc * i;
fc = fc * fa;
fc = fc * fb;
fc = fc * fd;
fc = fc * fe;
fa = fa * i;
fb = fa * i * fb;
fd = fc * fe;
fe = fd * fa;
}
}
}
void test_copy( int n )
{
int i,j;
for( i = 0; i < n; i++ )
{
for( j = 0; j < MAX_VAL; j++ )
{
array1[j] = i;
}
for( j = 0; j < MAX_VAL; j++ )
{
array2[j] = j;
}
for( j = 0; j < MAX_VAL; j++ )
{
array1[j] = array2[j];
}
}
}
int main( void )
{
int i;
clock_t t1, t2;
for( i = 0; i < MAX_VAL; i++ )
{
array1[i] = clock() + i;
array2[i] = array1[i] * clock() + i;
}
t1 = clock(); for( i = 0; i < 20; i++ ) eratosfen(); t2 = clock(); printf("eratosfen: %2.3f sec\n", (float)(t2 - t1)/(float)CLOCKS_PER_SEC);
t1 = clock(); test_add(100); t2 = clock(); printf("add : %2.3f sec\n", (float)(t2 - t1)/(float)CLOCKS_PER_SEC);
t1 = clock(); test_sub(100); t2 = clock(); printf("sub : %2.3f sec\n", (float)(t2 - t1)/(float)CLOCKS_PER_SEC);
t1 = clock(); test_mul(50); t2 = clock(); printf("mul : %2.3f sec\n", (float)(t2 - t1)/(float)CLOCKS_PER_SEC);
t1 = clock(); test_fmul(50); t2 = clock(); printf("fmul : %2.3f sec\n", (float)(t2 - t1)/(float)CLOCKS_PER_SEC);
t1 = clock(); test_copy(10); t2 = clock(); printf("copy : %2.3f sec\n", (float)(t2 - t1)/(float)CLOCKS_PER_SEC);
}