스크립트를 실행하는 가장 빠른 방법이 무엇인지 궁금합니다. 터미널에 스크립트 출력을 표시하거나 파일로 리디렉션하거나 속도를 달리하는 것 사이에 속도 차이가 있음을 읽었습니다 /dev/null
.
따라서 출력이 중요하지 않은 경우 스크립트가 최소화 된 경우에도 스크립트가 더 빨리 작동하도록하는 가장 빠른 방법은 무엇입니까?
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
답변
오늘날 그래픽 카드는 더 이상 2D 가속에 신경 쓰지 않기 때문에 터미널은 예전보다 느립니다. 실제로 터미널로 인쇄하면 특히 스크롤이 관련된 경우 스크립트 속도가 느려질 수 있습니다.
결과적으로 ./script.sh
는 작업 속도 ./script.sh >script.log
가 느리기 /script.sh >/dev/null
때문에 작업 속도가 느려집니다 . 그러나 이것이 실제적인 목적에 충분한 차이를 만들어 내는지 여부는 스크립트의 출력량과 속도에 달려 있습니다. 스크립트가 3 줄을 쓰고 나가거나 몇 시간마다 3 페이지를 인쇄하는 경우 리디렉션을 신경 쓰지 않아도됩니다.
편집 : 몇 가지 빠른 (완전히 깨진) 벤치 마크 :
-
Linux 콘솔에서 240×75 :
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done) real 3m52.053s user 0m0.617s sys 3m51.442s
-
에서
xterm
, 260×78 :$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done) real 0m1.367s user 0m0.507s sys 0m0.104s
-
Samsung SSD 850 PRO 512GB 디스크의 파일로 리디렉션 :
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >file) real 0m0.532s user 0m0.464s sys 0m0.068s
-
다음으로 리디렉션
/dev/null
:$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >/dev/null) real 0m0.448s user 0m0.432s sys 0m0.016s
답변
나는 Satō Katsura의 대답에 본능적으로 동의했을 것입니다. 말된다. 그러나 테스트하기는 쉽습니다.
화면에 백만 줄을 쓰고 파일에 쓰거나 추가하고로 리디렉션하는 것을 테스트했습니다 /dev/null
. 나는 이들 각각을 차례로 테스트 한 다음 다섯 번의 복제를 수행했습니다. 이것들은 내가 사용한 명령입니다.
$ time (for i in {1..1000000}; do echo foo; done)
$ time (for i in {1..1000000}; do echo foo; done > /tmp/file.log)
$ time (for i in {1..1000000}; do echo foo; done > /dev/null)
그런 다음 총 시간을 아래에 플로팅했습니다.
보시다시피, 사토 카츠라의 추정은 정확했습니다. Satō Katsura의 답변에 따르면 제한 요소가 출력이 될지 의심되므로 출력 선택이 스크립트의 전체 속도에 실질적인 영향을 미치지 않을 것입니다.
FWIW, 내 원래의 대답은 파일 추기 및했습니다 다른 코드했다 /dev/null
리디렉션 내부 루프를.
$ rm /tmp/file.log; touch /tmp/file.log; time (for i in {1..1000000}; do echo foo >> /tmp/file.log; done)
$ time (for i in {1..1000000}; do echo foo > /dev/null; done)
John Kugelman이 의견에서 지적했듯이 이것은 많은 오버 헤드를 추가합니다. 질문 약자로,이 그것을 테스트하는 올바른 방법은 정말 아니지만, 분명 다시 여는 것을 반복적으로 파일을 비용 같이 난 여기를 떠날거야 내에서 스크립트 자체를.
이 경우 결과가 반대로됩니다.
답변
스크립트 속도를 높이는 또 다른 방법은 더 빠른 쉘 인터프리터를 사용하는 것입니다. v4.4 , v93u + 20120801 및 v0.5.8 에서 실행 되는 POSIX busy 루프 의 속도를 비교하십시오 .bash
ksh
dash
-
bash
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | bash -s > /dev/null
산출:
real 0m25.146s user 0m24.814s sys 0m0.272s
-
ksh
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | ksh -s > /dev/null
산출:
real 0m11.767s user 0m11.615s sys 0m0.010s
-
dash
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | dash -s > /dev/null
산출:
real 0m4.886s user 0m4.690s sys 0m0.184s
부분 집합 의 명령 bash
하고 ksh
있습니다 호환 의 모든 명령에 dash
. bash
해당 하위 집합의 명령 만 사용 하는 스크립트는와 함께 작동해야합니다 dash
.
bash
새로운 기능을 사용하는 일부 스크립트는 다른 인터프리터로 변환 될 수 있습니다. 경우 bash
스크립트가 새로운 기능에 크게 의존, 그것은 귀찮게 가치가 없을 수도있다 – 몇 가지 새로운 bash
기능을 모두 코드를 쉽게 개선이다 와 (에도 불구하고 더 효율적이고 bash
, 그래서 일반적으로 느린 것)을 dash
실행 포함 할 수있는 (동등한 다른 몇 가지 명령)이 느려질 수 있습니다.
의심스러운 경우 테스트를 실행하십시오 …