เส้นประหรือเปลือกอื่น ๆ “ เร็วขึ้น” กว่าทุบตีหรือไม่


57

ฉันคิดเสมอว่าประโยชน์เพียงอย่างเดียวของการใช้เครื่องหมายขีดคั่นแทนการทุบตีก็คือเส้นประนั้นเล็กลงและดังนั้นกรณีของเส้นประจะเริ่มเร็วขึ้นในเวลาบูต

แต่ฉันได้ทำการวิจัยมาแล้วและพบว่ามีคนบางคนย้ายสคริปต์ทั้งหมดของพวกเขาไปที่หวังว่าพวกเขาจะทำงานได้เร็วขึ้นและฉันก็พบสิ่งนี้ในบทความDashAsBinShใน Ubuntu Wiki:

เหตุผลสำคัญที่จะเปลี่ยนเปลือกเริ่มต้นได้อย่างมีประสิทธิภาพ bash เป็นกระสุนเต็มรูปแบบที่ยอดเยี่ยมเหมาะสำหรับการใช้แบบโต้ตอบ; แท้จริงมันยังคงเป็นเปลือกเข้าสู่ระบบเริ่มต้น อย่างไรก็ตามมันค่อนข้างใหญ่และช้าในการเริ่มต้นและใช้งานโดยเปรียบเทียบกับเส้นประ

ทุกวันนี้ฉันใช้สคริปต์ทุบตีมากมายหลายอย่างในระบบของฉันและปัญหาของฉันคือฉันมีสคริปต์เฉพาะที่ฉันทำงานอย่างต่อเนื่อง 24/7 ที่วางไข่เด็กประมาณ 200 คนซึ่งคอมพิวเตอร์ของฉันร้อนขึ้น 10 ° C มากกว่าการใช้งานปกติ

มันเป็นสคริปต์ที่ค่อนข้างใหญ่ที่มี bashisms จำนวนมากดังนั้นการย้ายไปที่ POSIX หรือเชลล์อื่น ๆ ใช้เวลานานมาก (และ POSIX ไม่สำคัญสำหรับการใช้งานส่วนตัว) แต่มันจะคุ้มค่าถ้าฉันสามารถลดบางสิ่งนี้ การใช้งาน CPU ฉันรู้ว่ายังมีสิ่งอื่น ๆ ที่จะต้องพิจารณาเช่นการเรียกไบนารีภายนอกเช่นsedสำหรับ bashism ง่ายๆเช่น${foo/bar}หรือแทนgrep=~

TL; DRทุบตีช้ากว่าจริง ๆ เมื่อเริ่มต้นและใช้งานเมื่อเปรียบเทียบกับขีดกลางหรือไม่ มี Unix shell อื่น ๆ ซึ่งมีประสิทธิภาพมากกว่าการทุบตีหรือไม่?


12
หากคุณกำลังจะพูดถึงประสิทธิภาพการทำงานคุณคิดว่ามันจะทำได้ดีกว่าในภาษาอื่น (Perl, Python, Ruby) หรือไม่? ฉันคิดว่ามันมีประสิทธิภาพมากกว่าปกติมากถึงแม้ว่ามันจะขึ้นอยู่กับลักษณะที่แน่นอนของงาน
goldilocks

จุดรอง: [ควรเป็นส่วนภายใน
Mikel

2
โปรดจำไว้ว่าไม่เหมือนกับที่คุณกังวลเกี่ยวกับการใช้หน่วยความจำความแตกต่างส่วนใหญ่แสดงว่าคุณกำลังทำการคำนวณในเชลล์มากกว่าในโปรแกรมภายนอก (เช่นคุณกำลังใช้เชลล์ผิดวิธี!); เช่นในคอมพิวเตอร์ของฉันสคริปต์ที่ใช้ a while loop เพื่อนับเป็นล้าน (ไม่ทำอะไรเลย) คือ ~ 2x เร็วขึ้นใน mksh / zsh และ> 2x เร็วกว่าใน dash แต่ในสคริปต์จริงฉันจะถ่ายข้อมูลให้มากที่สุด โปรแกรม
loreb

3
bashเคยเป็นช้ามาก มันคืบหน้าไปมากเมื่อเร็ว ๆ นี้ แต่สำหรับทุกสิ่งส่วนใหญ่มันยังช้ากว่ากระสุนอื่น ๆ ส่วนใหญ่
Stéphane Chazelas

1
อย่าใช้bashism เรียบง่าย [ "$foo" != "${foo#*bar}" ]จัดการกับสิ่งที่คุณ grep และสิ่งที่:sed while [ "$foo" != "${foo#*bar}" ]; do s=$s${foo%%bar*} foo=${foo#*bar} ; done ; foo=$s$fooคุณสามารถใส่สิ่งใดสิ่งหนึ่งลงในฟังก์ชั่น
mikeserv

คำตอบ:


39

เปลือก SEQ:

น่าจะเป็นวิธีที่มีประโยชน์ในการทำเครื่องหมายบนม้านั่งประสิทธิภาพของเชลล์คือการประเมินผลขนาดเล็กมากและเรียบง่ายซ้ำ ๆ หลายครั้ง มันเป็นสิ่งสำคัญผมคิดว่าไม่เพียง แต่จะห่วง แต่ห่วงมากกว่าการป้อนข้อมูล<&0เพราะเปลือกต้องการที่จะอ่าน

ฉันคิดว่าสิ่งนี้จะเป็นการเสริมการทดสอบ@cuonglm ที่โพสต์ไว้แล้วเพราะมันแสดงให้เห็นถึงประสิทธิภาพของกระบวนการเชลล์เดียวที่ถูกเรียกใช้ครั้งเดียวซึ่งตรงข้ามกับเขาซึ่งแสดงให้เห็นว่า ด้วยวิธีนี้ระหว่างเราเราครอบคลุมทั้งสองด้านของเหรียญ

นี่คือฟังก์ชั่นเพื่ออำนวยความสะดวกในการสาธิต:

sh_bench() (                                               #dont copy+paste comments
    o=-c sh=$(command -v "$1") ; shift                     #get shell $PATH; toss $1
    [ -z "${sh##*busybox}" ] && o='ash -c'                 #cause its weird
    set -- "$sh" $o "'$(cat <&3)'" -- "$@"                 #$@ = invoke $shell
    time env - "$sh" $o "while echo; do echo; done|$*"     #time (env - sh|sh) AC/DC
) 3<<-\SCRIPT                                                                      
#Everything from here down is run by the different shells    
    i="${2:-1}" l="${1:-100}" d="${3:-                     
}"; set -- "\$((n=\$n\${n:++\$i}))\$d"                     #prep loop; prep eval
    set -- $1$1$1$1$1$1$1$1$1$1                            #yup
    while read m                                           #iterate on input
    do  [ $(($i*50+${n:=-$i})) -gt "$(($l-$i))" ] ||       #eval ok?
            eval echo -n \""$1$1$1$1$1"\"                  #yay!
        [ $((n=$i+$n)) -gt "$(($l-$i))" ] &&               #end game?
            echo "$n" && exit                              #and EXIT
        echo -n "$n$d"                                     #damn - maybe next time
    done                                                   #done 
#END
SCRIPT                                                     #end heredoc

มันอาจเพิ่มตัวแปรหนึ่งครั้งต่อการอ่านบรรทัดใหม่หรือหากเป็นการเพิ่มประสิทธิภาพเล็กน้อยหากทำได้ก็จะเพิ่มขึ้น 50 ครั้งต่อการอ่านบรรทัดใหม่ stdoutทุกครั้งที่ตัวแปรจะเพิ่มขึ้นมันถูกพิมพ์ไป มันจะทำงานมากเช่นการจัดเรียงของข้ามseqnl

และเพื่อให้ชัดเจนมากขึ้นว่ามันทำอะไร - นี่คือset -x;เอาท์พุทที่ถูกตัดทอนหลังจากใส่ก่อนหน้านี้timeในฟังก์ชั่นด้านบน:

time env - /usr/bin/busybox ash -c '
     while echo; do echo; done |
     /usr/bin/busybox ash -c '"'$(
         cat <&3
     )'"' -- 20 5 busybox'

ดังนั้นเชลล์แต่ละตัวจะถูกเรียกเป็นอันดับแรกเช่น:

 env - $shell -c "while echo; do echo; done |..."

... เพื่อสร้างอินพุตที่จะต้องวนซ้ำเมื่ออ่าน3<<\SCRIPT- หรือเมื่อcatใด และอีกด้านหนึ่งของที่|pipeมันเรียกตัวเองอีกครั้งเช่น:

"...| $shell -c '$(cat <<\SCRIPT)' -- $args"

ดังนั้นนอกเหนือจากการโทรเริ่มต้นไปที่env (เพราะcatจริง ๆ แล้วถูกเรียกในบรรทัดก่อนหน้า) ; ไม่มีการเรียกกระบวนการอื่นจากเวลาที่เรียกจนกว่าจะออก อย่างน้อยฉันก็หวังว่ามันจะเป็นจริง

ก่อนตัวเลข ...

ฉันควรจดบันทึกเกี่ยวกับการพกพา

  • poshไม่ชอบ$((n=n+1))และยืนยัน$((n=$n+1))

  • mkshไม่ได้มีprintfbuiltin ในกรณีส่วนใหญ่ การทดสอบก่อนหน้านี้มีความล่าช้าอย่างมาก - มันเป็นการเรียกใช้/usr/bin/printfสำหรับการวิ่งทุกครั้ง ดังนั้นecho -nข้างต้น

  • อาจจะมากกว่าที่ฉันจำได้ ...

อย่างไรก็ตามตัวเลข

for sh in dash busybox posh ksh mksh zsh bash
do  sh_bench $sh 20 5 $sh 2>/dev/null
    sh_bench $sh 500000 | wc -l
echo ; done

นั่นจะได้รับทั้งหมดในครั้งเดียว ...

0dash5dash10dash15dash20

real    0m0.909s
user    0m0.897s
sys     0m0.070s
500001

0busybox5busybox10busybox15busybox20

real    0m1.809s
user    0m1.787s
sys     0m0.107s
500001

0posh5posh10posh15posh20

real    0m2.010s
user    0m2.060s
sys     0m0.067s
500001

0ksh5ksh10ksh15ksh20

real    0m2.019s
user    0m1.970s
sys     0m0.047s
500001

0mksh5mksh10mksh15mksh20

real    0m2.287s
user    0m2.340s
sys     0m0.073s
500001

0zsh5zsh10zsh15zsh20

real    0m2.648s
user    0m2.223s
sys     0m0.423s
500001

0bash5bash10bash15bash20

real    0m3.966s
user    0m3.907s
sys     0m0.213s
500001

ARBITRARY = อาจตกลงไหม

ถึงกระนั้นนี่คือการทดสอบโดยพลการ แต่มันทดสอบการอ่านอินพุตการประเมินทางคณิตศาสตร์และการขยายตัวของตัวแปร อาจจะไม่ครอบคลุม แต่อาจอยู่ใกล้กับที่นั่น

แก้ไขโดย Teresa e Junior : @mikeserv และฉันได้ทำการทดสอบอื่น ๆ อีกมากมาย (ดูการแชทของเราสำหรับรายละเอียด) และเราพบว่าผลลัพธ์สามารถสรุปได้ดังนี้:

  • หากคุณต้องการความเร็วไปแน่นอนกับรีบมันจะเร็วกว่าเปลือกและอื่น ๆ เกี่ยวกับ 4x เร็วกว่าทุบตี
  • ในขณะที่busyboxเปลือก 's สามารถเป็นได้ช้ากว่าเส้นประในการทดสอบบางอย่างมันอาจจะเร็วขึ้นเพราะมีหลายสาธารณูปโภค userland ของตัวเองเช่นgrep, sed, sortเป็นต้นซึ่งไม่ได้มีคุณสมบัติมากที่สุดเท่าที่ใช้กันทั่วไป GNU สาธารณูปโภค แต่สามารถทำให้งานเสร็จได้มาก
  • หากความเร็วไม่ใช่ทุกสิ่งที่คุณใส่ใจksh (หรือksh93 ) สามารถถูกพิจารณาว่าเป็นระบบที่ดีที่สุดระหว่างความเร็วและคุณสมบัติ มันเป็นความเร็วในการเปรียบเทียบกับขนาดเล็กmkshซึ่งเป็นวิธีที่เร็วกว่าทุบตีและมันยังมีคุณสมบัติพิเศษบางอย่างเช่นลอยคำนวณจุด
  • แม้ว่าbashนั้นมีชื่อเสียงในเรื่องความเรียบง่ายความเสถียรและฟังก์ชั่น แต่มันก็ช้าที่สุดของกระสุนทั้งหมดในการทดสอบส่วนใหญ่ของเราและจากระยะขอบขนาดใหญ่

ฉันไม่สามารถรับรหัสนี้ให้ทำงานใน bash (และ ksh และ zsh) ได้เฉพาะใน dash, mksh และ pdksh Bash ฉันได้ลอง4.2.37(1)-releaseจาก Debian และ4.2.45(2)-releaseจาก Porteus LiveCD (Slackware) แล้ว โดยไม่ต้องnull=แทนการแสดงผลตัวเลขก็ทำงานเช่นถ้าผมกดย้อนกลับอย่างต่อเนื่องแล้วฉันต้องฆ่าทุบตีด้วยSIGKILL
Teresa e Junior

และฉันก็ลองด้วยbash --posixโดยไม่มีประโยชน์
Teresa e Junior

@TeresaeJunior - อาจเป็นไปได้ - แม้ว่าฉันจะไม่เชื่อว่ามันจะใช้งานzshได้ zshจะจี้ttyและดีมันจะเปิดตัวเปลือกโต้ตอบ ฉันคาดหวังว่าbashจะทำเช่นเดียวกัน - ซึ่งเป็นเหตุผลว่าทำไมฉันจึงระมัดระวังที่จะเรียก--posixลิงก์ของมันเท่านั้น ฉันสามารถทำให้มันเป็นไปตามที่คุณคาดหวังสำหรับพวกเขาส่วนใหญ่ แต่มันอาจจะทำงานได้ดีกว่าความคุ้มค่า คุณกำลังโทรbashหรือคุณกำลังโทรsh?
mikeserv

@TesesaeJunior คุณสามารถมาที่นี่และโพสต์ผลลัพธ์ได้หรือไม่ ฉันแค่อยากได้แนวคิดที่ดีขึ้นเกี่ยวกับสิ่งที่เกิดขึ้น
mikeserv

ฉันไม่ควรเพิ่มข้อความคำตอบของฉันที่ด้านล่างของคุณเพื่อเติมเต็มแล้วลบของฉัน?
Teresa e Junior

20

ให้ทำเกณฑ์มาตรฐาน

ด้วยbash:

$ strace -cf bash -c 'for i in $(seq 1 1000); do bash -c ":"; done'

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 99.12    0.376044         188      2004      1002 wait4
  0.74    0.002805           3      1002           clone
  0.03    0.000130           0      4037           read
  0.03    0.000119           0     15026           rt_sigprocmask
  0.03    0.000096           0     15040      6017 stat
  0.01    0.000055           0      8011           open
  0.01    0.000024           0      5013           getegid
  0.01    0.000021           0     16027           rt_sigaction
  0.00    0.000017           0      9020      5008 access
  0.00    0.000014           0      1001      1001 getpeername
  0.00    0.000013           0      1001           getpgrp
  0.00    0.000012           0      5013           geteuid
  0.00    0.000011           0     15025           mmap
  0.00    0.000011           0      1002           rt_sigreturn
  0.00    0.000000           0         1           write
  0.00    0.000000           0      8017           close
  0.00    0.000000           0      7011           fstat
  0.00    0.000000           0      8012           mprotect
  0.00    0.000000           0      2004           munmap
  0.00    0.000000           0     18049           brk
  0.00    0.000000           0         1           pipe
  0.00    0.000000           0         1           dup2
  0.00    0.000000           0      1001           getpid
  0.00    0.000000           0      1002           execve
  0.00    0.000000           0      1001           uname
  0.00    0.000000           0      1001           getrlimit
  0.00    0.000000           0      5013           getuid
  0.00    0.000000           0      5013           getgid
  0.00    0.000000           0      1001           getppid
  0.00    0.000000           0      1002           arch_prctl
  0.00    0.000000           0      1001           time
------ ----------- ----------- --------- --------- ----------------
100.00    0.379372                158353     13028 total

ด้วยdash:

$ strace -cf bash -c 'for i in $(seq 1 1000); do dash -c ":"; done'
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 73.88    0.008543           4      2004      1002 wait4
 25.35    0.002932           3      1002           clone
  0.62    0.000072           0      9026           rt_sigprocmask
  0.10    0.000011           0      1002           rt_sigreturn
  0.05    0.000006           0     15027           rt_sigaction
  0.00    0.000000           0      1037           read
  0.00    0.000000           0         1           write
  0.00    0.000000           0      2011           open
  0.00    0.000000           0      2017           close
  0.00    0.000000           0      2040        17 stat
  0.00    0.000000           0      2011           fstat
  0.00    0.000000           0      8025           mmap
  0.00    0.000000           0      3012           mprotect
  0.00    0.000000           0      1004           munmap
  0.00    0.000000           0      3049           brk
  0.00    0.000000           0      3020      3008 access
  0.00    0.000000           0         1           pipe
  0.00    0.000000           0         1           dup2
  0.00    0.000000           0      1001           getpid
  0.00    0.000000           0         1         1 getpeername
  0.00    0.000000           0      1002           execve
  0.00    0.000000           0         1           uname
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0        13           getuid
  0.00    0.000000           0        13           getgid
  0.00    0.000000           0      1013           geteuid
  0.00    0.000000           0        13           getegid
  0.00    0.000000           0      1001           getppid
  0.00    0.000000           0         1           getpgrp
  0.00    0.000000           0      1002           arch_prctl
  0.00    0.000000           0         1           time
------ ----------- ----------- --------- --------- ----------------
100.00    0.011564                 60353      4028 total

การวนซ้ำแต่ละครั้งจะเริ่มต้นเชลล์และไม่ทำอะไรกับตัวดำเนินการ no-op - โคลอนจากนั้นออก

ตามที่แสดงผลdashจะเร็วกว่าbashตอนเริ่มต้นมาก dashมีขนาดเล็กและขึ้นอยู่กับไลบรารีที่แบ่งใช้น้อยกว่าbash:

$ du -s /bin/bash 
956 /bin/bash

$ du -s /bin/dash 
108 /bin/dash

$ ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007fffc7947000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f5a8110d000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5a80f09000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a80b7d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5a81352000)

$ ldd /bin/dash
    linux-vdso.so.1 =>  (0x00007fff56e5a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb24844c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb2487f3000)

นี่เป็นเรื่องเกี่ยวกับเวลาเริ่มต้นวิธีการทำงาน ให้ทำเกณฑ์มาตรฐานอื่น:

$ time dash -c 'for i in $(seq 1 1000000);do [ 1 = 1 ];done'

real    0m2.684s
user    0m2.728s
sys     0m0.100s

$ time bash -c 'for i in $(seq 1 1000000);do [ 1 = 1 ];done'

real    0m6.996s
user    0m6.820s
sys     0m0.376s

ด้วยการทดสอบอย่างง่าย1 = 1, ยังคงเร็วกว่าdashbash


คำตอบของคุณได้รับการชื่นชมอย่างมาก แต่ดูเหมือนว่าคุณกำลังวัดว่าเชลล์เริ่มต้นได้เร็วแค่ไหนไม่ว่ามันจะทำงานเร็วแค่ไหนใช่มั้ย
เทเรซาอีจูเนียร์

1
@TesesaeJunior: ใช่ฉันพูดถึงเวลาเริ่มต้นเท่านั้น
cuonglm

ฉันคิดว่าseq 1 100000ควรเป็นseq 1 1000อย่างไร
Mikel

1
แต่สำหรับdashกรณีทดสอบของคุณมันเท่านั้นseq 1 1000?
Mikel

โอ้ขอโทษ1000สำหรับการเริ่มต้นและ1000000สำหรับการดำเนินการแก้ไข
cuonglm

7

ต่อไปนี้เป็นเวลาเริ่มต้นของเชลล์ต่างๆใน UNIX ที่ได้รับการรับรอง (Mac OS X 10.10.3) ฉันเขียนการทดสอบอีกครั้งเพื่อใช้ tcsh เพื่อควบคุมลูปเพื่อให้เชลล์ที่ถูกทดสอบไม่ใช่การควบคุมลูป สำหรับแต่ละเชลล์ลูปจะถูกเรียกใช้งานห้าครั้งก่อนกำหนดเวลาเพื่อให้แน่ใจว่าเชลล์ที่ใช้งานได้และสคริปต์อยู่ในแคช

อย่างที่คุณเห็นไม่มีผู้ชนะที่ชัดเจน แต่มีผู้แพ้หนึ่งคน อย่างไรก็ตาม bash 4 นั้นช้ากว่า bash อย่างเห็นได้ชัด แต่ Dash ทำงานได้ดี แต่เนื่องจาก ksh93 เป็น open-source ไม่มีเหตุผลที่แท้จริงที่จะไม่ใช้มันสำหรับทุกสิ่ง และมาตรฐานแบบพฤตินัยใน UNIX-land (ถ้าไม่ใช่ใน GNU / Linux-land); มันให้ superset ของฟังก์ชั่นเชลล์ POSIX (เท่าที่ฉันเข้าใจ, POSIX เชลล์นั้นใช้ ksh88); มันเท่ากับทุบตีเป็นเปลือกโต้ตอบแม้ว่าปกคลุมด้วยวัตถุเมื่อเทียบกับ tcsh และผู้แพ้แน่นอน zsh

/bin/bash is v3.2.57(1)
/usr/local/bin/bash is v4.3.33(1)
dash is v0.5.8
ksh is v93u+
mksh is vR50f
pdksh is v5.2.14
/opt/heirloom/5bin/sh is from SysV
yash is v2.37
zsh is v5.0.5

% cat driver.csh 
#!/bin/tcsh

foreach s ( $* )
    echo
    echo "$s"
    foreach i ( `seq 1 5` )
        ./simple_loop.csh "$s"
    end
    /usr/bin/time -p ./simple_loop.csh "$s"
end

% cat simple_loop.csh 
#!/bin/tcsh

set shell = `which ${1}`
foreach i ( `seq 1 1000` )
    ${shell} -c ":"
end

% ./driver.csh /bin/bash /usr/local/bin/bash dash ksh mksh pdksh /opt/heirloom/5bin/sh yash zsh 
/bin/bash
real         4.21
user         1.44
sys          1.94

/usr/local/bin/bash
real         5.45
user         1.44
sys          1.98

dash
real         3.28
user         0.85
sys          1.11

ksh
real         3.48
user         1.35
sys          1.68

mksh
real         3.38
user         0.94
sys          1.14

pdksh
real         3.56
user         0.96
sys          1.17

/opt/heirloom/5bin/sh
real         3.46
user         0.92
sys          1.11

yash
real         3.97
user         1.08
sys          1.44

zsh
real        10.88
user         3.02
sys          5.80

ข้อสรุปของฉันคือการใช้ ksh93 ด้วย มันอยู่ภายใต้ใบอนุญาตสาธารณะทั่วไปซึ่งได้รับอนุมัติจาก FSF
Teresa e Junior

0

มีหลายกรณีทดสอบที่ไม่ยุติธรรมในคำตอบมากมายที่นี่ หากทดสอบสองเชลล์ให้ใช้ไวยากรณ์ที่ถูกต้องสำหรับแต่ละเชลล์ และใน bash doublebrackets นั้นเร็วกว่าและน่าเชื่อถือกว่าค่ายเดี่ยวดังนั้นจึงมีความแตกต่างของความเร็วน้อยกว่ามาก ใช้ bashisms ที่ดีที่สุดแล้วความแตกต่างของความเร็วเหล่านี้ก็น้อยลงเช่นกัน ในระบบของฉันทุบตีทำงานเหมือนนรกกับการใช้งานหนักของ bashisms และ posix ที่เทียบเท่าในเส้นประจะช้ากว่าที่นี่ ไม่ถูกต้องที่เส้นประนั้นเร็วกว่าการทุบตีหลายเท่า จริงๆแล้วมันไม่ยุติธรรมเลยที่จะเปรียบเทียบคำสั่ง posix ในทั้งคู่ซึ่งขีดกลางนั้นอาจเร็วที่สุดเสมอ ในมุมมองของฉัน posix ล้าสมัยหนัก และในแง่ของความเข้ากันได้มันยากที่จะค้นพบระบบที่เกี่ยวข้องในปัจจุบันพวกเขาไม่ได้ใช้ bash shell

การเปรียบเทียบที่ดีคือ: ใช้บรรทัดคำสั่งที่ดีที่สุดในแต่ละเชลล์เพื่อทำงานที่เฉพาะเจาะจงให้เสร็จ ไม่เพียงบรรทัดคำสั่งเดียวกันเท่านั้นเมื่อมีเพียงหนึ่งเชลล์เท่านั้นที่มีข้อได้เปรียบที่นี่ การเปรียบเทียบเช่นนี้ไม่น่าเชื่อถือและไม่แสดงประสิทธิภาพที่แท้จริงของคู่แข่ง ฉันเห็นงานของฉันทุกวันซึ่งเชลล์นั้นเร็วกว่าในหลายกรณี

ตัวอย่างเช่นในการแทนที่aตัวอักษรในสตริงกับbตัวละครในทุบตีคุณสามารถเขียนในขณะที่ประคุณมีการเรียกเครื่องมือภายนอกเช่นนี้"${varname//a/b}" "$(echo "$varname" | sed 's/a/b/g')"หากคุณต้องทำซ้ำสองสามร้อยครั้งการใช้ bashism สามารถเพิ่มความเร็วได้ 2x


3
คุณมีตัวอย่างใด ๆ ที่คุณสามารถอัปเดตคำตอบของคุณด้วยเพื่อแสดงว่า bash สามารถปิดช่องว่างของประสิทธิภาพหรือแม้แต่ทำงานที่เทียบเท่าได้เร็วขึ้นหรือไม่ คำตอบของคุณจะแข็งแกร่งขึ้นด้วยตัวอย่างเฉพาะบางอย่าง
Eric Renouf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.