[pedantic] velocita` text processing (was Re: commentare files)
On Wed, Oct 16, 2002 at 02:24:41AM +0200, Nick Name wrote:
> On Wed, 16 Oct 2002 01:17:12 +0200
> MaX <max@maximumdebian.org> wrote:
>
> > immagino che bisogni usare sed...
>
> cat nomefile | sed 's/\(.*\)/##\1/'
>
> se è più semplice di così dite pure la vostra che io ho detto la mia.
Ti hanno indicato 2 modi piu` semplici: e` interessante vedere che la
semplicita` si traduce anche in maggiore velocita`.
Per esempio, per fare s/\(.*\)/##\1/, la regular expression deve
_matchare_ l'intera riga (e questo viene fatto ovviamente un carattere
alla volta). Invece con s/^/##/ deve solo matchare la stringa nulla
all'inizio della riga, senza doverla analizzare per intero (la riga).
In pratica:
% wc kilomeron
585800 26527900 152179300 kilomeron
% time sed 's/\(.*\)/##\1/' kilomeron > /dev/null
31.140u 0.500s 0:32.81 96.4% 0+0k 0+0io 37257pf+0w
% time sed 's/^/##/' kilomeron > /dev/null
2.690u 0.110s 0:02.88 97.2% 0+0k 0+0io 37255pf+0w
% time awk '{ print "##" $0 }' kilomeron > /dev/null
1.800u 0.420s 0:02.27 97.7% 0+0k 0+0io 119pf+0w
(awk in realta` e` mawk. gawk e` piu` lento:
% time gawk '{ print "##" $0 }' kilomeron > /dev/null
3.500u 0.270s 0:04.02 93.7% 0+0k 0+0io 168pf+0w
invece sed e` GNU sed. ssed e` un po' piu` veloce:
% time ssed 's/^/##/' kilomeron > /dev/null
2.310u 0.230s 0:02.62 96.9% 0+0k 0+0io 123pf+0w
ma la differenza macroscopica e` tra "\(.*\)" e "^")
Dovendo proprio matchare l'intera riga conviene, anziche' usare il
grouping e richiamare il gruppo, usare "&" per richiamare 'tutto cio`
che ha matchato':
% time sed 's/.*/##&/' kilomeron > /dev/null
25.490u 0.530s 0:26.93 96.6% 0+0k 0+0io 37255pf+0w
curiosamente, qui ssed e` ~10 volte + veloce:
% time ssed 's/.*/##&/' kilomeron > /dev/null
2.340u 0.210s 0:02.63 96.9% 0+0k 0+0io 123pf+0w
Ah, ovviamente un kilomeron sono dieci hectameron. Un hectameron sono
ovviamente dieci Decameron. :-)
Il Decameron che ho usato e` quello compilato dal progetto liberliber.
Ciao,
/dev/null
Reply to: