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;
}
Почему VC2005 медленнее D?
Узнав об обновленном D из "Хакера", я скачал себе компилятор и попробовал для начала написать простую программу, строящую треугольник Паскаля.
Код:
Я откомпилировал эту прогу в 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, но получил лишь небольшое улучшение.
Кто-нибудь может мне сказать, почему?
А ты как конкретно время засекал?
Согласен. И покажи исходник на С. Имхо, по конкретному коду судить надо...
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;
}
/**
* 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;
}
Изменения, как видно, минимальные.
Использование С-библиотечной функции printf. Очевидно, в библиотеке для D эта функция более оптимальна.
Цитата: Pink Demon
...
Узнав об обновленном D из "Хакера", ...
...
Кто-нибудь может мне сказать, почему?
Ошибка в ДНК у программера.