15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


CStringFile Class


Автор идеи Frank Driesens.

Платформы: VC5/6, NT4, CE 2.11

Однажды меня попросили сделать программку, которая бы фильтровала в текстовом файле знаки ';' и при этом сохраняла текстовые колонки. Размер исходного текстового файла был 7 Мб, естевственно я сделал программу, которая читала файл, обрабатывала его, и создавала новый.
Так вот эту простейшую задачу мой компьютер делал непомерно долго.
Когда я создавал программку, то Pentium 133 по тем временам был самым быстрым процессором. Насколько я знал, готовых примеров чтения текста из файла от Microsoft не было. Тогда мне ничего не оставалось, кроме как сделать свой класс чтения текста из файла.
Результаты меня слегка удивили. Первая версия программы выполняла нужную операцию за несколько секунд.
Итак, что же заставило мою программу работать так быстро ? Ответ прост - это усовершенствование процедуры считывания файла с диска.

Класс StringFile сам по себе состоит из двух циклов. Один из циклов - фильтрование считанного буфера, другой - это считывание линии из этого буфера. Считывание происходит блоками по 2k. Далее обработка (нахождения начала и конца каждой строки) продолжается в памяти а не на диске. Вы наверное догадываетесь, что оперативная память работает намного быстрее, чем винчестер :)

Этот пример показывает, как легко можно работать с этим классом (открывать, читать, закрывать...).

#include "StringFile.h"

BOOL ReadTextFile(LPCSTR szFile)
{
 CStringFile 	sfText;
 CString		szLine;
 BOOL		bReturn = FALSE;	

 // Открываем исходный файл
 if(sfText.Open(szFile)) 
 {
  // Считывание всех строк (друг за другом)
  while(sfText.GetNextLine(szLine)!=0)
  {
   printf("%s\r\n",szLine);	//и распечатка их
  }
  sfText.Close(); // Закрываем открытый файл
  bReturn = TRUE; // 
 }
 return bReturn;
}

График показывающий зависимость скорости считывания от размера блока:

Blocksize Benchmark

По графику видно, что оптимальный размер блока при считывании из исходного файла является 2 килобайта. Увеличение размера блока уже не приводит к увеличению скорости работы программы, то есть увеличение скорости возможно уже только путём усовершенствования исходного кода класса.

Исходный код класса CStringFile

Скачать - 3 Kb