LINUX.ORG.RU
ФорумTalks

Решето. Тест на C. Как оптимизировать?


0

0

void runSieve()
{
    int SIZE = 8190;
    char flags[SIZE + 1];
    register int i, prime, k, iter, count;
    register int iterations = 0;
    double seconds = 0.0;
    int score = 0;
    long startTime, elapsedTime;

    time(&startTime);
    while (1) {
    count = 0;
    for (i = 0; i <= SIZE; i++)
        flags[i] = 1;
    for (i = 0; i <= SIZE; i++) {
        if (flags[i]) {
        prime = i + i + 3;
        for (k = i + prime; k <= SIZE; k += prime)
            flags[k] = 0;
        count++;
        }
    }
    iterations++;
    time(&elapsedTime);
    elapsedTime -= startTime;
    if (elapsedTime >= 10)
        break;
    }
    seconds = elapsedTime;
    if (count != 1899)
    perror("Error: count <> 1899");
    else {
       score = (int) (iterations / seconds);
       printf("%d iterations in %f seconds\n", iterations,seconds);
       printf("Sieve score = %d\n", score);
    }
}

main(int argc, char *argv)
{
    puts("Running Sieve benchmark.");
    puts("This will take about 10 seconds.");
    runSieve();
}

Результаты - количество итераций за 10 секунд. По простому, чем
больше число, тем круче:

Для явы получаем при

gcj --main=Sieve Sieve.java

3968 итераций в секунду.
С оптимизацией, то есть gcj --main=Sieve -O2 Sieve.java, - 8937
итераций в секунду.

Для gcc sieve.c (без оптимизации) 4870 ит/сек
С оптимизацией (gcc -O2 ) - 10503 ит/сек

Для сравнения на обычной яве - примерно 7026 ит/сек (java -Xms50M
-Xmx200M --server, транслировалось с -g:none, java
-version 1.5.0_04 от Sun )
anonymous

Зато стоимость разработки на Java будет ниже. Не понятно, а что тут оптимизировать? Купи процессор самый мощный - и будет тебе оптимизация.

Selecter ★★★★
()

memset вместо for (i = 0; i <= SIZE; i++)flags[i] = 1; и ассемблерные вставки должны помочь!

W98
()
Ответ на: комментарий от Selecter

>Не понятно, а что тут оптимизировать? Купи процессор самый мощный - и будет тебе оптимизация.

математику изучать не пробовал?

Unforgiven
()
Ответ на: комментарий от Selecter

> Купи процессор самый мощный - и будет тебе оптимизация.

Глубочайшее заблуждение. Но автор темы тоже не совсем прав -- оптимизировать нужно алгоритмы, а не код ассемблерными вставками. подумай на досуге, насколько быстрее линейный алгоритм (временная сложность O(n)) обгонит экспоненциальный (временная сложность O(e^x)), даже если линейный пускать на 386том, а экспоненциальный на 64-том атлоне. Рассуждения об оптимизации использования памяти оставляю тебе в качестве легкого упражнения.

nsav-ng
()

Анализировать лень. Начини хотябы с того, что используй не пост, а пре инкрементацию.

linux_newbe
()

с месяц назад на lkml обсуждали бенчмарки итераций с помощью time() - они бесполезны. Смысл в том, что при большом количестве итераций ты замеряешь скорость работы не алгоритма, а скорость работы тормозной функции time().

logIN
()
Ответ на: комментарий от nsav-ng

Есть низкоуровневая и высокоуровневая оптимизация. Они обе имеют значение. На языке C низкоуровневой занимается компилятор.

unnamed
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.