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


22

스크립트를 실행하는 가장 빠른 방법이 무엇인지 궁금합니다. 터미널에 스크립트 출력을 표시하거나 파일로 리디렉션하거나 속도를 달리하는 것 사이에 속도 차이가 있음을 읽었습니다 /dev/null.

따라서 출력이 중요하지 않은 경우 스크립트가 최소화 된 경우에도 스크립트가 더 빨리 작동하도록하는 가장 빠른 방법은 무엇입니까?

bash ./myscript.sh 
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null


"일반 파일로 경로 재 지정"과 "/ dev / null로 경로 재 지정"을 비교하는 것은 나에게 너무 이상해 보인다 ...
el.pescado

답변:


31

오늘날 그래픽 카드는 더 이상 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
  • 에서 xterm, 260x78 :

    $ 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

6
@Kingofkech는 초당 200 줄 미만입니다. 큰 차이는 없습니다. (비교를 위해 timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"MBP에서 1 초에 100000+ 라인을 인쇄합니다.)
muru

4
@Kingofkech 스크립트 인 경우 파일을 편집하고 불필요한 출력을 인쇄하는 줄을 주석 처리하십시오. 특히 셸 내장이 아닌 외부 명령이 3 백만 번 실행 된 경우 많은
이점을 얻을 수 있습니다

2
"사용됨"에 대한 좁은 해석. vt220 터미널은 오늘날의 터미널 에뮬레이터보다 속도가 느립니다. 또한 SUN Sparc 워크 스테이션 (내가 사용한 것)은 콘솔 속도가 느리기 때문에 더 큰 프로젝트를 컴파일 할 때 출력을 파일로 리디렉션하면 컴파일 시간이 엄청나게 빨라집니다.
Kusalananda

1
@Kusalananda 사실 xterm30 년 전의 HP Apollo xterms는 20 년 전의 HP-UX 와 비교하여 크롤링하는 데 사용 되었습니다. 그러나 15 년 전의 Matrox 비디오 카드가있는 Linux 콘솔은 20 년 전의 S3 카드가있는 동일한 Linux 콘솔보다 느 렸습니다. 최신 카드에 고해상도 프레임 버퍼가있는 Linux 콘솔은 사용할 수 없습니다. :)
Satō Katsura

6
@Kingofkech 약 2400bps입니다. 우리 중 일부는 실제로 그 속도로 수년간 살았습니다. :)
Satō Katsura

14

나는 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이 의견에서 지적했듯이 이것은 많은 오버 헤드를 추가합니다. 질문 약자로,이 그것을 테스트하는 올바른 방법은 정말 아니지만, 분명 다시 여는 것을 반복적으로 파일을 비용 같이 난 여기를 떠날거야 내에서 스크립트 자체를.

시간 대 출력 플롯

이 경우 결과가 반대로됩니다.


FWIW 답변에 빠른 벤치 마크를 추가했습니다. 특히, Linux 콘솔은 a보다 200 배 이상 느리며 xterm, 이는 ~보다 3 배 느립니다 /dev/null.
Satō Katsura

또한 일부 속도 제한으로 테스트해야합니다. OP의 출력은 약 200 라인 / 초입니다.
muru

@muru 줄을 인쇄하고 1/200 초 기다린 다음 반복 하시겠습니까? 시도해 볼 수는 있지만 비슷한 결과라고 생각하지만 신호가 잡음을 극복하는 데 훨씬 오래 걸립니다. 어쩌면 분석 전에 대기 시간을 뺄 수 있습니다.
Sparhawk

@Sparhawk 같은 것. 그 출력 수준에서 CPU는 출력 속도를 늦추지 않고 디스플레이를 업데이트하는 데 충분한 시간이 있다고 생각합니다. 프로그램이 일시 정지없이 라인을 뿜어내는 것 외에는 아무것도하지 않으면, 디스플레이가 업데이트 될 수있는 것보다 터미널 버퍼가 더 빨리 채워져 병목 현상이 발생합니다.
muru

3

스크립트 속도를 높이는 또 다른 방법은 더 빠른 쉘 인터프리터를 사용하는 것입니다. 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실행 포함 할 수있는 (동등한 다른 몇 가지 명령)이 느려질 수 있습니다.

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


그래서 내 bash 스크립트를 빨리 사용하려면 bash 또는 ksh로 다시 작성해야합니까?
Kingofkech '10

@Kingofkech bash 용으로 작성한 코드가 올바른 ksh 또는 대시 코드 일 수 있습니다. 통역사 만 바꾸십시오.
bli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.