Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему VC2005 медленнее D?

23K
22 декабря 2006 года
Pink Demon
3 / / 22.12.2006
Здравствуйте, камрады.

Узнав об обновленном D из "Хакера", я скачал себе компилятор и попробовал для начала написать простую программу, строящую треугольник Паскаля.

Код:
import std.stdio;

/**
 * outputs given line of pascal triangle with center alignment. Offset is calculated using two variables: n - triangle's size and k - current line's length
 */
void output (int[] line, int n, int k)
{
    foreach (num; line)
    {
        if (num == 0)
            break;
        writef ("%d ", num);
    }
    writefln ();
}

int main ()
{
    int n; /// size of pascal triangle to build
    int[] line; /// current pascal triangle line
   
    // get triangle's size and init accordingly
    scanf ("%d", &n);
    line = new int[n];
   
    // build first line as a basis
    line[0] = 1;
    output (line, n, 1);
   
    // build and output pascal triangle line by line
    for (int k = 2; k <= n; ++k)
    {
        int prev = 1;
        for (int i = 1; i < k; ++i)
        {
            int temp = line;
            line += prev;
            prev = temp;
        }
        output (line, n, k);
    }
   
    return 0;
}


Я откомпилировал эту прогу в dmd с ключами -inline -O -release

Затем я решил проверить, насколько бытрый код у меня получился. Я перенес код в С++ (изменения чисто синтактические + stdio сишный).

Я откомпилировал прогу в VC2005 Express со следующими ключами:

/O2 /Ob2 /Ot /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

Но почему-то программа работала в два-три раза медленнее, чем в D! Я пробовал поменять оптимизацию скорость/размер на favor neigher, но получил лишь небольшое улучшение.

Кто-нибудь может мне сказать, почему?
63
22 декабря 2006 года
Zorkus
2.6K / / 04.11.2006
А ты как конкретно время засекал?
9
22 декабря 2006 года
Lerkin
3.0K / / 25.03.2003
Согласен. И покажи исходник на С. Имхо, по конкретному коду судить надо...
23K
23 декабря 2006 года
Pink Demon
3 / / 22.12.2006
2 Zorkus Это не понадобилось. Производительность была ниже в 2 раза.

2 Lerkin

Код:
#include <cstdio>

/**
 * outputs given line of pascal triangle with center alignment. Offset is calculated using two variables: n - triangle's size and k - current line's length
 */
void output (int * line, int n, int k)
{
    for (int i = 0; line != 0 && i < n; ++i)
    {
        printf ("%d ", num);
    }
        printf ("\n");
}

int main ()
{
    int n; /// size of pascal triangle to build
    int * line; /// current pascal triangle line
   
    // get triangle's size and init accordingly
    scanf ("%d", &n);
    line = new int[n];
   
    // build first line as a basis
    line[0] = 1;
    output (line, n, 1);
   
    // build and output pascal triangle line by line
    for (int k = 2; k <= n; ++k)
    {
        int prev = 1;
        for (int i = 1; i < k; ++i)
        {
            int temp = line;
            line += prev;
            prev = temp;
        }
        output (line, n, k);
    }
   
        delete [] line;
    return 0;
}


Изменения, как видно, минимальные.
9
23 декабря 2006 года
Lerkin
3.0K / / 25.03.2003
Единственное, что могу предположить (по коду).
Использование С-библиотечной функции printf. Очевидно, в библиотеке для D эта функция более оптимальна.
398
23 декабря 2006 года
Alexandoros
630 / / 21.10.2005
Цитата: Pink Demon

...
Узнав об обновленном D из "Хакера", ...

...
Кто-нибудь может мне сказать, почему?



Ошибка в ДНК у программера.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог