Как долго может быть струнный поток? - PullRequest
0 голосов
/ 09 мая 2018

Работа с большим проектом в Visual Studio C ++ 11.

Чтобы избежать задержки, я пытаюсь записать журналы функции (которые могут быть огромными и могут превышать 300 000+ строк журнала, так как функция выполняет некоторые обширные вычисления) в поток std :: stringstream и, наконец, сбрасывать его в файл.

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

Тиа!

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

std::stringstream является оберткой вокруг std::string, поэтому предел будет std::string::max_size(), который зависит от системы / реализации.

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

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

0 голосов
/ 09 мая 2018

В конечном счете, ограничением здесь является только количество свободного места в бесплатном хранилище вашей программы, которое фактически является количеством свободной памяти в вашей системе (RAM, swap, что угодно).

Производительность строкового потока будет несколько ухудшаться по мере роста его «содержимого», поскольку изменение размера буфера требует копирования его содержимого, и это происходит медленнее, когда имеется больше содержимого. Вы также можете рискнуть фрагментировать пул памяти вашей системы. Из вашего описания трудно понять, является ли это фактором (количество строк здесь не важно; число байтов равно).

В зависимости от того, насколько быстро заполняется журнал, я мог бы рассмотреть возможность более частой очистки файла, чтобы:

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

поскольку нет смысла сознательно избегать всех этих зрелых технологий.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...