2010-02-15 1 views
2

C++ вопрос.std :: istream :: получить эффективность

for(i=1;i<10000;i++){ 
    cout << myfile.get(); 
} 

Будет ли программа делать 10000 операций ввода-вывода в файле на жестком диске? (учитывая, что файл больше) Если это так, возможно, лучше читать, скажем, 512 байт в некоторый буфер, а затем взять char по char, а затем снова скопировать 512 байт и так далее?

ответ

1

Ваша ОС будет кэшировать файл, поэтому вам не нужно оптимизировать это для общего использования.

1

ifstream буферизуется, поэтому нет.

+1

Он не будет делать 10000 запросов ввода-вывода, но все равно будет честно бит медленнее, чем чтение этих 10KB за один звонок. – jalf

1

Попробуйте.

Однако во многих случаях самой быстрой операцией будет чтение всего файла сразу, а затем работа с данными в памяти.

Но действительно, попробуйте каждую стратегию и посмотрите, что лучше всего работает.

Имейте в виду, что независимо от базового механизма буферизации файлов чтение одного байта за один раз равно slow. Если ничего другого, он вызывает довольно медленную библиотеку IOStreams 10000 раз, когда вы могли бы выполнить всего пару вызовов.

2

Как говорили другие - попробуйте. Тесты, которые я сделал, показывают, что чтение большого блока за один раз (с использованием потоков) может быть в два раза быстрее, чем зависит только от собственной буферизации потока. Однако это зависит от таких вещей, как размер буфера и (я бы ожидал) реализации библиотеки потоков - я использую g ++.