[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: