2013-11-07 4 views
0

Я пишу метод c++, который должен обновить некоторые символы в открытом файле (ofstream).
Метод получает в качестве ввода карту, где ключ является смещением (позиция в файле), а значение является символом.
C++/seek - какой порядок поиска файлов быстрее?

Пример кода

typedef map<int,char> IntChar_map; 

void update_file(const IntChar_map& v) 
{ 
    for(IntChar_map::const_iterator it = v.begin(); it != v.end(); ++it) 
    { 
     m_stream->seekp(it->first); 
     m_stream->put(it->second); 
    } 
} 

Вопрос

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

Спасибо.

+0

Если вы указали значения _random_, тогда нет способа сказать, в каком случае вы падаете. Если вы можете сделать предположение о распределении входных данных, тогда может быть определенный ответ. –

ответ

3

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

Лучший способ узнать, это сделать некоторые тесты и сравнить их время.

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

m_stream.setbuf(0, 0); 

Я сделал некоторые всесторонние испытания на файл C функции ввода/вывода, когда я делал много мелких, случайных операций записи, и я обнаружил, что при использовании чистого небуферизованных I O был/значительно быстрее. Вот ссылка на мой вопрос, в случае, если она полезна для вас:

What goes on behind the curtains during disk I/O?

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

+0

Я исправил этот ответ. Я понял, что неверно истолковал то, о чем вы спрашивали, потому что вы говорили о случайных значениях. Однако итераторы карт упорядочены, поэтому у вас могут быть преимущества буферизации (с оговоркой, что они не всегда выгодны для поиска-записи). Это зависит от того, насколько редко распределены эти смещения. – paddy

+0

спасибо за подробный ответ. Я предположил, что порядок поиска не имеет значения, но поскольку я не являюсь и экспертом по I/O, я думал, что может быть какая-то загадочная причина, почему один заказ более эффективен, чем другой. – idanshmu

+0

Ну, теперь я думаю об этом, я мог бы ожидать, что форвард будет немного лучше. Я думаю, что большинство схем буферизации файлов предназначены для перемещения вперед по файлу, поэтому в зависимости от того, как реализован ваш «поток», может потребоваться немного дополнительной работы при движении назад. Трудно дать однозначный ответ. Вы действительно должны проверить это. Я, конечно, не ожидал бы, что обратное будет лучше, чем вперед. Но вполне возможно, что полностью небуферизованный поток будет лучше, чем буферизованный поток. – paddy