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;
}
График показывающий зависимость скорости
считывания от размера блока:
По графику видно, что оптимальный размер блока
при считывании из исходного файла является 2
килобайта. Увеличение размера блока уже не
приводит к увеличению скорости работы программы,
то есть увеличение скорости возможно уже только
путём усовершенствования исходного кода класса.
Исходный код класса CStringFile
Скачать - 3 Kb |