Вообщем написаны 2 программы на Delphi и на C++ , провожу абсолютно однотипные операции( считываю массив длинною 10 ^ 7) но почему то Delphi это делает на целую секунду быстрее, кто может ответить в чем причина? и как можно ускорить в C++ ввод и вывод данных??
Вот программы, на Си и на Delphi
#include
int n;
short a[10000000];
int main()
{
freopen("output.txt", "r", stdin);
freopen("input.txt", "w", stdout);
scanf("%d
", &n);
for (int i = 0; i < n; i++)
scanf("%hd", &a[i]);
printf("1");
return 0;
}
var n, i : integer;
a : array[1..10000000] of shortInt;
begin
reset(input, 'output.txt');
rewrite(output, 'input.txt');
ReadLn(n);
for i := 1 to n do
Read(a[i]);
WriteLn('1');
close(input);
close(output);
end.
Испытание 2.
теперь первым выполняется exe - шник на c++ и в дельфи for заменен на while! все остальное то же.
var n, i : integer;
a : array[1..10000000] of Integer;
begin
reset(input, 'output.txt');
rewrite(output, 'input.txt');
ReadLn(n);
i := 1;
while ( i <= n ) do
begin
Read(a[i]);
inc(i);
end;
WriteLn('1');
close(input);
close(output);
end.
Ответ
Все очень просто. В случае с делфи, компилятор знает, что вызов Read будет читать число. И только его. И может вставить правильный код сразу. В случае с scanf ситуация не столь проста. Как минимум каждый раз будет делаться парсинг строки формата. А это как не оптимизируй - медленно. Что же делать? писать свой парсер. Но как то не то. использовать готовые парсеры, например boost.spririt также, по ссылкам ниже, народ пишет, что если читать строку, а потом преобразовывать с помощью atoi, то получается в 4 раза быстрее. полезные ссылки Снова про ввод/вывод в C++ scanf не предназначен для ввода большого кол-ва информации sprintf/sscanf и скорость - понятия совместимые ? рассуждают о том же
Комментариев нет:
Отправить комментарий