Zeitvergleich der vorgestellten Lösungen (keine Antwort)
Die Effizienz der Antworten ist nicht wichtig. Trotzdem habe ich nach dem @ josephwb-Ansatz versucht, alle vorgestellten Antworten zeitlich abzustimmen.
Als Eingabe verwende ich die portugiesische Übersetzung von Victor Hugo "Les Miserables" (großes Buch!) Und zähle die Vorkommen von "a". Meine Ausgabe hat 5 Bände, viele Seiten ...
$ wc miseraveis.txt
29331 304166 1852674 miseraveis.txt
C-Antworten wurden mit gcc zusammengestellt (keine Optimierungen).
Jede Antwort wurde dreimal ausgeführt und die beste ausgewählt.
Vertraue diesen Zahlen nicht zu sehr (meine Maschine erledigt andere Aufgaben usw. usw.). Ich teile diese Zeiten mit Ihnen, weil ich einige unerwartete Ergebnisse habe und ich bin sicher, dass Sie noch mehr finden werden ...
- 14 von 16 zeitgesteuerten Lösungen dauerten weniger als 1 Sekunde. 9 weniger als 0,1s, viele von ihnen mit Rohren
- 2 Lösungen, die bash Zeile für Zeile verwenden, die 30.000 Zeilen verarbeiten, indem neue Prozesse erstellt werden. Berechnen Sie die richtige Lösung in 10s / 20s.
grep -oP a
ist Baum mal schneller als grep -o a
(10; 11 vs 12)
- Der Unterschied zwischen C und anderen ist nicht so groß, wie ich erwartet hatte. (7; 8 vs 2; 3)
- (Schlussfolgerungen erwünscht)
(ergibt eine zufällige Reihenfolge)
=========================1 maxschlepzig
$ time sed 's/[^a]//g' mis.txt | awk '{print length}' > a2
real 0m0.704s ; user 0m0.716s
=========================2 maxschlepzig
$ time tr -d -c 'a\n' < mis.txt | awk '{ print length; }' > a12
real 0m0.022s ; user 0m0.028s
=========================3 jjoao
$ time perl -nE 'say y!a!!' mis.txt > a1
real 0m0.032s ; user 0m0.028s
=========================4 Stéphane Gimenez
$ function countchar(){while read -r i; do echo "$i"|tr -dc "$1"|wc -c; done }
$ time countchar "a" < mis.txt > a3
real 0m27.990s ; user 0m3.132s
=========================5 Loki Astari
$ time awk -Fa '{print NF-1}' mis.txt > a4
real 0m0.064s ; user 0m0.060s
Error : several -1
=========================6 enzotib
$ time awk '{ gsub("[^a]", ""); print length }' mis.txt > a5
real 0m0.781s ; user 0m0.780s
=========================7 user606723
#include <stdio.h> #include <string.h> // int main(int argc, char *argv[]) ... if(line) free(line); }
$ time a.out a < mis.txt > a6
real 0m0.024s ; user 0m0.020s
=========================8 maxschlepzig
#include <stdio.h> // int main(int argc, char **argv){if (argc < 2 || !*argv[1]) { ... return 0; }
$ time a.out a < mis.txt > a7
real 0m0.028s ; user 0m0.024s
=========================9 Stéphane Chazelas
$ time awk '{print gsub(/a/, "")}'< mis.txt > a8
real 0m0.053s ; user 0m0.048s
=========================10 josephwb count total
$ time grep -o a < mis.txt | wc -w > a9
real 0m0.131s ; user 0m0.148s
=========================11 Kannan Mohan count total
$ time grep -o 'a' mis.txt | wc -l > a15
real 0m0.128s ; user 0m0.124s
=========================12 Kannan Mohan count total
$ time grep -oP 'a' mis.txt | wc -l > a16
real 0m0.047s ; user 0m0.044s
=========================13 josephwb Count total
$ time perl -ne '$x+=s/a//g; END {print "$x\n"}'< mis.txt > a10
real 0m0.051s ; user 0m0.048s
=========================14 heemayl
#!/usr/bin/env python2 // with open('mis.txt') as f: for line in f: print line.count('"')
$ time pyt > a11
real 0m0.052s ; user 0m0.052s
=========================15 enzotib
$ time while IFS= read -r line; do line="${line//[!a]/}"; echo "${#line}"; done < mis.txt > a13
real 0m9.254s ; user 0m8.724s
=========================16 bleurp
$ time awk ' {print (split($0,a,"a")-1) }' mis.txt > a14
real 0m0.148s ; user 0m0.144s
Error several -1