ฉันได้ทำเกณฑ์เปรียบเทียบอย่างรวดเร็วกับคำตอบที่มีอยู่แล้ว
- ใช้เครื่องมือมาตรฐานเท่านั้น (ขออภัยสำหรับสิ่งที่ชอบ
lua
หรือrocket
)
- เป็นหนึ่งในตอร์ปิโดจริง
- มีความสามารถในการเพิ่มจำนวนมาก (100 ล้าน) และ
- รวดเร็ว (ฉันไม่สนใจสิ่งที่ใช้เวลานานกว่าหนึ่งนาที)
ฉันมักจะเพิ่มจำนวน 1 ถึง 100 ล้านซึ่งสามารถทำได้บนเครื่องของฉันในเวลาน้อยกว่าหนึ่งนาทีสำหรับการแก้ปัญหาหลายอย่าง
นี่คือผลลัพธ์:
หลาม
:; seq 100000000 | python -c 'import sys; print sum(map(int, sys.stdin))'
5000000050000000
# 30s
:; seq 100000000 | python -c 'import sys; print sum(int(s) for s in sys.stdin)'
5000000050000000
# 38s
:; seq 100000000 | python3 -c 'import sys; print(sum(int(s) for s in sys.stdin))'
5000000050000000
# 27s
:; seq 100000000 | python3 -c 'import sys; print(sum(map(int, sys.stdin)))'
5000000050000000
# 22s
:; seq 100000000 | pypy -c 'import sys; print(sum(map(int, sys.stdin)))'
5000000050000000
# 11s
:; seq 100000000 | pypy -c 'import sys; print(sum(int(s) for s in sys.stdin))'
5000000050000000
# 11s
awk
:; seq 100000000 | awk '{s+=$1} END {print s}'
5000000050000000
# 22s
วาง & Bc
หน่วยความจำในเครื่องของฉันหมด มันใช้งานได้ครึ่งขนาดของอินพุต (50 ล้านหมายเลข):
:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s
ดังนั้นฉันเดาว่าน่าจะใช้เวลาประมาณ 35 ถึง 100 ล้านตัว
Perl
:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s
ทับทิม
:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s
ค
เพื่อประโยชน์ในการเปรียบเทียบฉันได้รวบรวมเวอร์ชั่น C และทดสอบสิ่งนี้ด้วยเช่นกันเพื่อให้ทราบว่าโซลูชั่นที่ใช้เครื่องมือทำงานช้าลงเพียงใด
#include <stdio.h>
int main(int argc, char** argv) {
long sum = 0;
long i = 0;
while(scanf("%ld", &i) == 1) {
sum = sum + i;
}
printf("%ld\n", sum);
return 0;
}
:; seq 100000000 | ./a.out
5000000050000000
# 8s
ข้อสรุป
แน่นอนว่า C นั้นเร็วที่สุดใน 8 วินาที แต่โซลูชัน Pypy เพิ่มค่าใช้จ่ายเพียงเล็กน้อยประมาณ 30% ถึง 11วินาที แต่เพื่อความยุติธรรม Pypy นั้นไม่ได้มาตรฐานอย่างแน่นอน คนส่วนใหญ่มีการติดตั้ง CPython ซึ่งช้ากว่าอย่างมาก (22 ปี) ซึ่งเร็วเท่ากับโซลูชัน Awk ที่ได้รับความนิยม
วิธีที่เร็วที่สุดที่ใช้เครื่องมือมาตรฐานคือ Perl (15s)