스크립트를 실행하는 가장 빠른 방법은 무엇입니까? 차이가 있음을 읽었습니다 /dev/null. 따라서 출력이 중요하지 않은

스크립트를 실행하는 가장 빠른 방법이 무엇인지 궁금합니다. 터미널에 스크립트 출력을 표시하거나 파일로 리디렉션하거나 속도를 달리하는 것 사이에 속도 차이가 있음을 읽었습니다 /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 + 20120801v0.5.8 에서 실행 되는 POSIX busy 루프 의 속도를 비교하십시오 .bash ksh dash

  1. 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
  2. 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
  3. 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실행 포함 할 수있는 (동등한 다른 몇 가지 명령)이 느려질 수 있습니다.

의심스러운 경우 테스트를 실행하십시오 …


답변