Вот несколько вещей, которые я не видел ни у кого. Они несколько расплывчаты, но неспособность воспроизвести вещи затрудняет детализацию всего этого.
Профилирование бедного человека.
Пока код работает, просто продолжайте его прерывать. Обычно вы будете видеть один и тот же кадр стека снова и снова.
Начните комментировать вещи. Если вы закомментируете ваше разбиение, и оно завершается мгновенно, тогда довольно ясно, с чего начать.
Часть кода зависит, но вы можете прочитать весь файл в память, а затем выполнить анализ, чтобы создать очевидное разделение на то, где он тратит свое время. Если оба заканчивают быстро независимо друг от друга, то это, вероятно, взаимодействие.
Буферизация.
Я не видел никакой буферизации в ваших чтениях. Это становится особенно важным, если вы что-то записываете на диск. Рука на вашем диске будет прыгать назад и вперед между вашим местоположением чтения, затем записывать местоположение и т. Д.
Хотя это не похоже на то, что вы пишете здесь, ваша основная программа может использовать больше памяти. Вполне возможно, что после того, как вы достигнете полной воды, ОС начнет передавать часть памяти на диск. Вы будете трэшить, когда читаете построчно, пока идет пейджинг.
Обычно я настраиваю простой интерфейс итератора, чтобы убедиться, что все работает. Затем напишите декоратор, чтобы прочитать 500 строк за раз. Стандартные потоки также имеют некоторые встроенные параметры буферизации, которые могут быть лучше использовать. Я догадываюсь, что их буферизованные настройки по умолчанию довольно консервативны.
Резерв.
std::vector::push_back
работает лучше всего, когда вы также используете std::vector::reserve
. Если вы можете сделать большую часть памяти доступной, прежде чем войти в тесный цикл, вы выиграете. Тебе даже не нужно точно знать, сколько, просто угадай.
Вы также можете превзойти производительность std::vector::resize
с этим, потому что std::vector::resize
использует alloc
и std::vector::push_back
будет использовать realloc
Этот последний бит оспаривается, хотя я читал иначе. У меня нет оснований сомневаться в том, что я ошибаюсь, хотя мне придется провести дополнительные исследования, чтобы подтвердить или опровергнуть.
Тем не менее push_back может работать быстрее, если вы используете с ним резерв.
Расщепление строки.
Я никогда не видел решения итератора C ++, которое было бы эффективным, когда дело доходит до работы с файлами gb +. Я не пробовал это определенно, все же. Я догадываюсь, почему они обычно делают небольшие ассигнования.
Вот ссылка на то, что я обычно использую.
Разделить массив символов на два массива символов
Рекомендации по std::vector::reserve
применяются здесь.
Я предпочитаю boost::lexical_cast
потоковую реализацию из соображений обслуживания, хотя я не могу сказать, что она более или менее эффективна, чем потоковая реализация. Я скажу, что очень редко можно увидеть правильную проверку ошибок при использовании потока.
STL shenanigans.
Я намеренно размышляю об этом, извините. Я обычно пишу код, который избегает условий, хотя я помню некоторые испытания и невзгоды, о которых мне рассказывали сотрудники. Использование STLPort позволяет полностью избежать этих проблем.
На некоторых платформах при использовании потоковых операций по умолчанию включена некоторая странная безопасность потоков. Так что я видел, как незначительное использование std :: cout полностью разрушало производительность алгоритма. Здесь у вас ничего нет, но если вы ведете запись в другом потоке, это может вызвать проблемы. Я вижу 8% _Mutex::Mutex
в другом комментарии, который может говорить о его существовании.
Вероятно, что у вырожденной реализации STL может даже возникнуть вышеуказанная проблема с операциями лексического анализа.
На некоторых контейнерах имеются странные характеристики производительности.У меня никогда не было проблем с вектором, но я действительно понятия не имею, что istream_iterator использует внутри.В прошлом я проследил через алгоритм неправильного поведения, чтобы найти вызов std::list::size
, выполняющий полный обход списка, например, с помощью GCC.Я не знаю, являются ли более новые версии менее бессмысленными.
Об обычной глупой глупости SECURE_CRT следует тупо позаботиться.Интересно, это то, что, по мнению Microsoft, мы хотим тратить на это время?