스크립트를 실행하는 가장 빠른 방법이 무엇인지 궁금합니다. 터미널에 스크립트 출력을 표시하는 것과 파일로 리디렉션하는 것 또는 /dev/null
.
따라서 출력이 중요하지 않은 경우 최소한이라도 스크립트를 더 빠르게 실행하는 가장 빠른 방법은 무엇입니까?
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
답변1
오늘날의 단말기는 이전보다 속도가 느립니다. 주로 그래픽 카드가 더 이상 2D 가속을 고려하지 않기 때문입니다. 따라서 실제로 터미널로 인쇄하면 특히 스크롤이 포함된 경우 스크립트 속도가 느려질 수 있습니다.
따라서 ./script.sh
속도가 느리지만 , 후자가 작업량이 적기 때문에 ./script.sh >script.log
속도가 더 느립니다 . /script.sh >/dev/null
그러나 이것이 실제 목적에 충분한 영향을 미치는지는 스크립트에서 생성되는 출력의 양과 속도에 따라 다릅니다. 스크립트가 3줄을 쓰고 종료하거나 몇 시간마다 3페이지를 인쇄하는 경우 리디렉션을 처리할 필요가 없을 것입니다.
편집하다:몇 가지 빠른(완전히 깨진) 벤치마크:
Linux 콘솔에서 240x75:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done) real 3m52.053s user 0m0.617s sys 3m51.442s
260x78
xterm
:$ 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
답변2
나는 본능적으로 동의할 것이다.사토 카츠라의 답장;그 말이 되는군요. 그러나 테스트하기는 쉽습니다.
화면에 백만 줄을 쓰고, 파일에 쓰고(추가), /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)
그런 다음 아래에 총 시간을 표시했습니다.
보시다시피,카츠라 사토추측이 정확합니다. ~에 따르면사토 카츠라의 답장, 나는 또한 제한 요소가 출력일 것이라고 생각하므로 출력 선택이 스크립트의 전체 속도에 중대한 영향을 미칠 가능성은 거의 없습니다.
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)
~처럼존 쿠겔만글을 쓰는 시점의 댓글에서 지적했듯이, 이로 인해 많은 오버헤드가 추가됩니다. 질문에 관한 한 이것은 실제로 테스트하는 올바른 방법은 아니지만 파일을 반복적으로 다시 여는 데 드는 비용을 명확하게 보여주기 때문에 여기에 두겠습니다.이내에스크립트 자체.
이 경우 결과는 반대입니다.
답변3
스크립트 속도를 높이는 또 다른 방법은 더 빠른 쉘 인터프리터를 사용하는 것입니다. 속도를 비교해 보세요.POSIX바쁜 루프, 실행 중bash
v4.4,ksh
v93u+20120801, 그리고dash
v0.5.8.
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
상응하는 작업(다른 여러 명령 실행이 포함될 수 있음)은 더 느려집니다.
의심스러우면 테스트해 보세요...