Написание собственного служебного класса iostream: это хорошая идея? - PullRequest
2 голосов
/ 14 марта 2010

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

std::istream in;
string word;
while (in.good()) {
    in>>word;
    // Processing, etc. 
    ...
}

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

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

Мысли и советы?

1 Ответ

2 голосов
/ 14 марта 2010

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

Скорее всего, вы должны просто использовать исправленный цикл, например:

while (in>>word) {
    // process word
}

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

std::istream in;
std::istringstream buffer;

buffer << in.rdbuf();
while (buffer >> word) {
    // process word
}

Это может быть вредно для действительно большого входного файла.

...