스크립트를 실행하는 가장 빠른 방법은 무엇입니까?

스크립트를 실행하는 가장 빠른 방법은 무엇입니까?

스크립트를 실행하는 가장 빠른 방법이 무엇인지 궁금합니다. 터미널에 스크립트 출력을 표시하는 것과 파일로 리디렉션하는 것 또는 /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.

  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상응하는 작업(다른 여러 명령 실행이 포함될 수 있음)은 더 느려집니다.

의심스러우면 테스트해 보세요...

관련 정보