실제 속도를 원한다면 :
echo 'int cache[256],x,y;char buf[4096],letters[]="tacgn-"; int main(){while((x=read(0,buf,sizeof buf))>0)for(y=0;y<x;y++)cache[(unsigned char)buf[y]]++;for(x=0;x<sizeof letters-1;x++)printf("%c: %d\n",letters[x],cache[letters[x]]);}' | gcc -w -xc -; ./a.out < file; rm a.out;
엄청나게 빠른 의사 1 라이너입니다.
간단한 테스트에 따르면 Core i7 CPU 870 @ 2.93GHz에서는 600MB / s 이상에 불과합니다.
$ du -h bigdna
1.1G bigdna
time ./a.out < bigdna
t: 178977308
a: 178958411
c: 178958823
g: 178947772
n: 178959673
-: 178939837
real 0m1.718s
user 0m1.539s
sys 0m0.171s
정렬과 관련된 솔루션과 달리이 메모리는 일정한 (4K) 메모리에서 실행되므로 파일이 램보다 훨씬 큰 경우 매우 유용합니다.
그리고 약간의 팔꿈치 그리스로 0.7 초를 면도 할 수 있습니다.
echo 'int cache[256],x,buf[4096],*bp,*ep;char letters[]="tacgn-"; int main(){while((ep=buf+(read(0,buf,sizeof buf)/sizeof(int)))>buf)for(bp=buf;bp<ep;bp++){cache[(*bp)&0xff]++;cache[(*bp>>8)&0xff]++;cache[(*bp>>16)&0xff]++;cache[(*bp>>24)&0xff]++;}for(x=0;x<sizeof letters-1;x++)printf("%c: %d\n",letters[x],cache[letters[x]]);}' | gcc -O2 -xc -; ./a.out < file; rm a.out;
1.1GB / s 이상의 네트 :
real 0m0.943s
user 0m0.798s
sys 0m0.134s
비교를 위해, 나는이 페이지에서 어떤 속도 약속이있는 것처럼 보이는 다른 솔루션 중 일부를 테스트했습니다.
sed
/ awk
솔루션은 용감한 노력을하지만, 30 초 후에 사망했다. 이러한 간단한 정규식을 사용하면 이것이 sed (GNU sed 버전 4.2.1)의 버그 일 것으로 예상됩니다.
$ time sed 's/./&\n/g' bigdna | awk '!/^$/{a[$0]++}END{for (i in a)print i,a[i];}'
sed: couldn't re-allocate memory
real 0m31.326s
user 0m21.696s
sys 0m2.111s
펄 방법도 유망한 것처럼 보였지만 7 분 동안 실행 한 후에 포기했습니다.
time perl -e 'while (<>) {$c{$&}++ while /./g} print "$c{$_} $_\n" for keys %c' < bigdna
^C
real 7m44.161s
user 4m53.941s
sys 2m35.593s