Время, потраченное на чтение из файла - PullRequest
0 голосов
/ 25 декабря 2009

Я делаю это в C ++:

    if (myfile.is_open()){
        while (! myfile.eof()){
            getline (myfile,line);
            DO STUFF
        }
        myfile.close();
    }
    else{
        cout << "Unable to open file";
    }

Я пытаюсь прочитать строки из текстового файла и что-то с этим делать. Я пытаюсь увидеть, как будет работать мой алгоритм. Замедляет ли чтение строк из файла мою программу, чтобы я не получил точный результат?

Ответы [ 5 ]

1 голос
/ 26 декабря 2009

Если вы хотите ускорить вашу программу, читайте больше данных с каждым запросом ввода / вывода. Другими словами, вместо чтения по одной строке за раз, прочитайте 1 МБ данных в буфер и получите текстовую строку из буфера. Доступ к внутренней памяти всегда быстрее, чем чтение из файла.

Если ваш файл находится на жестком диске, другой метод - читать достаточно часто, чтобы поддерживать вращение жесткого диска. Большая часть накладных расходов при чтении из файла ждет, когда жесткий диск наберет скорость. Жесткие диски любят продолжать читать и ненавидят останавливаться и начинать заново. Это основано на объект в движении имеет тенденцию оставаться в движении .

Также исследуем Двойная буферизация . Этот метод позволяет считывать данные в один буфер, пока процессор выполняет поиск в другом.

1 голос
/ 25 декабря 2009

Время дискового ввода-вывода сильно различается из-за большого разнообразия факторов, включая скорость вращения, расположение на диске, фрагментацию и т. Д. При двойном доступе к файлу за очень короткое время обычно второй доступ завершается значительно быстрее, чем первый. По этим причинам вам не следует включать скорость ввода-вывода в какие-либо формальные тесты на заправку.

Планируете ли вы измерять производительность извне, с помощью инструментальных средств или с использованием локальных аккумуляторов времени? Если вы делаете это внешне, вы в значительной степени облажались. Если вы используете инсталляцию, то программа постпроцессора должна быть в состоянии предоставить вам разбивку по методам, так что вы можете просто исключить те методы, которые делают ввод / вывод (если вы структурировали код для этого) , Если вы используете локальные аккумуляторы, просто разместите вызовы функций времени вокруг основных блоков, которые вас интересуют, и в конце программы распечатайте общий аккумулятор (ы).

1 голос
/ 25 декабря 2009

Да - если вы хотите точно протестировать «DO STUFF», вам также не следует учитывать дисковый ввод-вывод. Итак, вы могли бы сделать одну вещь - сохранить весь файл в памяти, а затем обработать его и время. Но если файл слишком большой или это сделает ваш обработчик строки более трудным, вы могли бы сделать еще одну вещь - прочитать файл в строку памяти построчно 10 раз или около того, БЕЗ обработки, усреднить время, а затем рассчитать время, как вы иметь его сейчас (включая обработку и дисковый ввод / вывод), а затем вычесть среднее время чтения с диска из общего времени.

Редактировать: я не знаю, почему я не думал об этом раньше, но вы также можете просто поставить таймер на выполнение «DO STUFF» и добавить к сумме после каждого выполнения.

0 голосов
/ 25 декабря 2009
while (! myfile.eof()){
  getline (myfile,line);
  ...

неправильный способ чтения файла - вы хотите:

while ( getline (myfile,line) ){
  ...

Для подробного объяснения, почему это так, вы можете посмотреть мой блог по адресу http://punchlet.wordpress.com/

0 голосов
/ 25 декабря 2009

Из псевдокода, который вы вставили, я предполагаю, что вы "делаете вещи" в каждой строке файла. Если время, необходимое вашему алгоритму для обработки одной строки, значительно больше времени, необходимого для чтения этой строки из файла, вы можете просто проигнорировать дисковый ввод-вывод. В других случаях просто прочитайте файл в вектор строк перед запуском алгоритма и измерьте его.

...