Я пишу 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);
}
}
Вопрос
Давайте предположим, что файл большой, а смещения на карте случайные.
Если я переберу карту в обратном порядке, увеличит ли это производительность?
Благодарю.
Итераторы карты упорядочены, поэтому ваш файловый ввод / вывод локализован и может использовать преимущества буферизации. Если вы просматриваете карту в обратном порядке, смещения по-прежнему упорядочены и, таким образом, локализованы, поэтому вы получаете аналогичные эффекты буферизации.
Лучший способ выяснить это — провести несколько тестов и сравнить их время.
Для небольших записей с поисками вы можете обнаружить, что буферизация файлов дает худшую производительность, и вы можете отключить ее. Для этого вы можете сделать:
m_stream.setbuf(0, 0);
Я провел несколько всесторонних тестов функций ввода / вывода в C-файле, когда выполнял много небольших случайных операций записи, и обнаружил, что использование чистого небуферизованного ввода-вывода существенно Быстрее. Вот ссылка на мой вопрос, если он вам пригодится:
Что происходит за занавесом во время дискового ввода-вывода?
Опять же, я подчеркиваю важность сравнительного анализа типичного сценария с использованием различных подходов к кодированию, если производительность критична.
Других решений пока нет …