Страницы

Поиск по вопросам

пятница, 22 марта 2019 г.

Быстродействие считывания

Вообщем написаны 2 программы на Delphi и на C++ , провожу абсолютно однотипные операции( считываю массив длинною 10 ^ 7) но почему то Delphi это делает на целую секунду быстрее, кто может ответить в чем причина? и как можно ускорить в C++ ввод и вывод данных??
Вот программы, на Си и на Delphi
#include #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 и скорость - понятия совместимые ? рассуждают о том же

Комментариев нет:

Отправить комментарий