So sánh thời gian của các giải pháp được trình bày (không phải là một câu trả lời)
Hiệu quả của các câu trả lời là không quan trọng. Tuy nhiên, theo cách tiếp cận @josephwb, tôi đã cố gắng tính thời gian cho tất cả các câu trả lời được trình bày.
Tôi sử dụng làm đầu vào bản dịch tiếng Bồ Đào Nha của Victor Hugo "Les Miserables" (cuốn sách tuyệt vời!) Và đếm số lần xuất hiện của "a". Phiên bản của tôi có 5 tập, nhiều trang ...
$ wc miseraveis.txt
29331 304166 1852674 miseraveis.txt
Câu trả lời C được biên dịch với gcc, (không tối ưu hóa).
Mỗi câu trả lời được chạy 3 lần và chọn câu trả lời hay nhất.
Đừng tin tưởng quá nhiều vào những con số này (máy của tôi đang thực hiện các tác vụ khác, v.v.). Tôi chia sẻ những khoảng thời gian này với bạn, vì tôi nhận được một số kết quả bất ngờ và tôi chắc chắn bạn sẽ tìm thấy thêm một số ...
- 14 trong số 16 giải pháp tính thời gian mất ít hơn 1 giây; 9 ít hơn 0,1 giây, nhiều người trong số họ sử dụng đường ống
- 2 giải pháp, sử dụng bash line theo dòng, xử lý các dòng 30k bằng cách tạo các quy trình mới, tính toán giải pháp chính xác trong 10 giây / 20 giây.
grep -oP a
là lần cây nhanh hơn grep -o a
(10; 11 so với 12)
- Sự khác biệt giữa C và những người khác không quá lớn như tôi mong đợi. (7; 8 so với 2; 3)
- (kết luận hoan nghênh)
(kết quả theo thứ tự ngẫu nhiên)
=========================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