C ++ / seek — какой порядок поиска файлов быстрее?

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

Пример кода

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

Решение

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

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

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

m_stream.setbuf(0, 0);

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

Что происходит за занавесом во время дискового ввода-вывода?

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]