Feb 11, 2010 17:05
...или о убожестве средств работы с текстом.
Дано: файл, содержащий около 70 тысяч строк, в каждой строке - одно слово, заключённое в кавычки. Размер файла - чуть меньше полутора мегабайт. Надо убрать в нём все ковычки. Логика говорит нам, что при правильном подходе к обработке текста, задача "найти ковычку и выкинуть её" должна выполняться за линейное время и не требовать дополнительной памяти.
Примитивнейшая задача феерически расставляет точки над современным софтом:
Notepad++ - не дождался завершения работы, на момент убийства процесса было сожрано около 27 мб памяти. Вторая поптыка - вместо search/replace использовался макрос, работающий явным образом построчно - то же самое.
Стандартный виндовый Notepad - та же картина, только подвис секунд на 5 при открытии файла.
Eclipse 3.3 - справилось, секунд за 10.
MS Word - что-то около полуминуты.
Разработка текстовых редакторов штука нетривиальное, но суко все основные косяки были словлены и good practices сформированы лет этак 20-30 назад. Так какого хрена в 2010 примитивная обработка полутора мегабайт текста может работать дольше, чем энкодится сравнимый по размеру объём видео например?
Для сравнения, те же данные, старый, проверенный временем инструмент, написанный много лет назад наверняка укуренными бородатыми хиппи:
$ time sed "s/\"//g" balda_dict.txt > output.txt
real 0m0.103s
user 0m0.093s
sys 0m0.009s
P.S. В vim-е время не засёчь, но замена отработала на одном уровне с sed. Emacs-а под рукой нету, но уверен, что там тоже всё хорошо.
notes