В продолжение темы буферизации,
могу предложить хохму из серии -"а вам слабо?!"
Пишем самостоятельно программу wc и устраиваем гонки
Пишем такой
flex код и сохраняем, например
wcf.l ws [ \t]
nonws [^ \t\n]
word {ws}*{nonws}+
words {word}{ws}+
%option main noyywrap
%%
int cc = 0, wc = 0, lc = 0;
{word}{ws}* ++wc; cc += yyleng;
{word}{ws}*\n ++wc; cc += yyleng; ++lc;
{words}{word}{ws}* wc += 2; cc += yyleng;
{words}{word}{ws}*\n wc += 2; cc += yyleng; ++lc;
{words}{2}{word}{ws}* wc += 3; cc += yyleng;
{words}{2}{word}{ws}*\n wc += 3; cc += yyleng; ++lc;
{words}{3}{word}{ws}* wc += 4; cc += yyleng;
{words}{3}{word}{ws}*\n wc += 4; cc += yyleng; ++lc;
{ws}+ cc += yyleng;
\n+ cc += yyleng; lc += yyleng;
<<EOF>> {
printf( "%8d %8d %8d\n", lc, wc, cc );
yyterminate();
}
и генерим си код
flex -o wcl.c wcf.l ,
компилим полученный си код
gcc -o wcl wcl.cЭто программа, фактически аналогичная стандартной утилите wc (word count)
Поглядим, на всякий случай, что там flex нагенерм. Нагенерил много и непонятно ...
Теперь самое интересное, тестируем на скорость
$ time for i in `seq 1 1000` ; do /usr/bin/wc < wcl.c >/dev/null ; done
real 0m5.497s
user 0m2.456s
sys 0m1.508s
$ time for i in `seq 1 1000` ; do ./wcl < wcl.c >/dev/null ; done
real 0m3.044s
user 0m0.080s
sys 0m0.388s
45 килобайт бреда, который нагенерил
flex, работает в полтора раза быстрее
Внимание ! вопрос !
Попробуйте самостоятельно превзойти скоростные результаты flex.
В своё время, меня это сильно заело, и таки чуть-чуть опередил flex