스크립트의 실행 시간은 크게 다릅니다. Matlab의 timeit과 유사한 시간 함수를 찾고 싶습니다.여기.
예를 들어 다음 명령을 평가하고 있습니다.여기빠르게 계산되는 일치 항목에 대해 time LC_ALL=C grep -ao CDA r328_0002.raw | wc -l
루프 실행
---------------------------------------------
Events real user sys
----------- ----------- ----------- ---------
40 0m0.044s 0m0.042s 0m0.005s
40 0m0.064s 0m0.062s 0m0.005s
40 0m0.046s 0m0.044s 0m0.005s
40 0m0.043s 0m0.042s 0m0.005s
40 0m0.047s 0m0.044s 0m0.005s
---------------------------------------------
Table: Events when Macbook Air 2013-Mid in Power Supply.
---------------------------------------------
Events real user sys
----------- ----------- ----------- ---------
40 0m0.056s 0m0.041s 0m0.011s
40 0m0.060s 0m0.047s 0m0.008s
40 0m0.041s 0m0.039s 0m0.006s
40 0m0.046s 0m0.044s 0m0.006s
40 0m0.047s 0m0.045s 0m0.006s
---------------------------------------------
Table: Events when Macbook Air in Battery Supply, 6h later.
실시간 시간은 0.044초에서 0.064초로 변동하고, 사용자 시간은 0.042초에서 0.062초로 변동하는 반면, 시스템 시간은 0.005초로 안정적으로 유지되는 것을 볼 수 있습니다. 시간에 대한 나의 생각
- 타이밍 전에 명령을 1k 반복
- 10회 타이밍을 측정하여 평균과 표준편차를 취함
두꺼운 /dev/nul
이 아이디어는 lcd047의 의견에 있으며 time LC_ALL=C ggrep -ao CDA r328_0002.raw >/dev/null
루프에서 실행됩니다.
--------------------------------------------
real user sys
-------------- -------------- ------------
0m0.006s 0m0.003s 0m0.002s
0m0.006s 0m0.003s 0m0.002s
0m0.006s 0m0.003s 0m0.002s
0m0.008s 0m0.003s 0m0.003s
0m0.006s 0m0.003s 0m0.002s
0m0.005s 0m0.002s 0m0.002s
0m0.006s 0m0.002s 0m0.002s
0m0.009s 0m0.003s 0m0.003s
0m0.007s 0m0.003s 0m0.003s
0m0.006s 0m0.003s 0m0.002s
0m0.006s 0m0.003s 0m0.002s
0m0.008s 0m0.003s 0m0.003s
--------------------------------------------
Table: Events when Macbook Air 2013-Mid in Battery Supply.
노트북에 전원이 계속 켜져 있고 실행되는 프로그램이 더 적다면 이러한 시간은 더욱 개선될 수 있다고 생각합니다.
쉘 스크립트의 시간을 안정적으로 측정하는 방법은 무엇입니까?
답변1
내 대답은 아니오 야! 리눅스는 실시간 시스템이 아닙니다. UNIX와 Linux의 철학은 시스템이 여러 사용자와 시스템 프로세스에서 공유되는 동안 가장 짧은 응답 시간을 제공하는 것입니다. 시작 명령의 타이밍에 따라 중요한 시스템 프로세스가 프로세서 시간을 할당할 때까지 기다려야 할 수도 있습니다. 또한 파일 시스템은 디스크에서 읽은 파일을 버퍼링할 수 있지만 결국 시스템의 다른 프로세스가 파일을 소유하게 되면 이러한 파일 시스템 버퍼는 캐시에서 데이터를 로드할 수 없습니다. 일반적으로 Linux 시스템에서 프로세스에 걸리는 시간은 우주의 시간과 공간에 상관없이 시스템 주변의 엔트로피에 따라 달라집니다.
라이브 튜닝 전용 라이브 시스템 및 명령과 귀하만을 위해 예약된 특정 양의 리소스가 필요합니다. 프로세서, 메모리 일부, 환경에 대한 기본 파일 시스템 자체의 반영을 예약할 수 있는 최신 커널의 새로운 CGROUP 기능을 사용하면 비슷한 결과를 얻을 수 있습니다.
귀하의 예에서 주요 타이밍 문제 중 하나는 grep 및 wc가 입력을 읽는 방식입니다. 파일을 ramfs에 복사하여 작업할 때 타이밍을 보다 안정적으로 만들 수 있습니다.
답변2
먼저, 쉘 스크립트는 사용자가 직접 입력하는 명령을 편리하게 단축할 수 있다는 점을 이해해야 합니다. 사용자 또는 스크립트가 호출할 때마다 grep
내장 기본 요소를 호출하는 것이 아닙니다. 쉘에 이름이 지정된 프로그램을 찾아 grep
새 프로세스로 시작하도록 요청합니다. 새로운 프로세스를 생성하고 첫 번째 코드를 실행하는 것은 예측 가능성이 조정되지 않은 모든 환경에서 아마도 가장 예측하기 어려운 일일 것입니다. 이는 실시간이 아닌 운영 체제를 실행하는 모든 컴퓨터에 해당됩니다. 왜 이런 일이 발생하는지에 대한 자세한 내용은 운영 체제에 대한 반 학기 과정의 자료가 될 수 있지만 전체 프로그램 실행을 정확하게 측정하려는 노력이 예상한 일관된 결과를 얻지 못하는 이유에 대한 한두 가지 예를 제시할 수 있습니다.
대부분의 프로그램이 CPU를 처음 얻을 때 가장 먼저 하는 일은 코드의 첫 번째 페이지가 로드될 수 있도록 페이지 폴트를 생성하는 것입니다. 코드가 있는 동일한 장치에서 I/O를 수행하는 다른 프로그램이 12개 있는 경우 프로그램 페이지를 로드하는 데 걸리는 시간은 요청이 장치 대기열에 있는 위치에 따라 달라집니다. 테스트 프로그램이 독립적으로 실행된다고 생각할 수도 있지만 사실은 그렇지 않을 것입니다. (이것은 grep
I/O 바인딩된 프로그램이므로 입력을 읽는 데 걸리는 시간은 여러 가지 동일한 이유로 다양하다는 점도 언급할 가치가 있습니다 .)
많은 운영 체제는 메모리 소비를 줄이고 성능을 향상시키기 위한 방법으로 동일한 코드의 중복 복사본이 동시에 존재하지 않도록 조치를 취합니다. 즉, 부팅 grep
하고 첫 번째 페이지가 이미 있는 상태에서 다른 페이지를 grep
실행하는 경우 위의 페이지 오류가 발생하지 않으며 모든 작업을 건너뜁니다. 이렇게 하면 벽시계 작동 시간이 줄어듭니다.
MATLAB에서 실행을 시작하면 timeit
MATLAB 프로세스가 이미 실행 중이므로 함수를 반복적으로 호출하기 전에 함수를 로드하는 데 필요한 과정을 뛰어넘을 수 있습니다. 내부 통화이므로 통화가 상당히 빠르게 이루어집니다. 실행하는 데 걸리는 시간 에 영향을 미치는 다른 많은 요소가 있지만 timeit
다른 요소에도 적용됩니다.
즉, 여러분이 보고 있는 진짜 이유는 이 비교가 사과 대 사과 비교가 아니기 때문이라고 생각합니다.
Unix는 time(1)
테스트 중인 프로그램을 한 번만 실행하는 반면, MATLAB은 timeit
테스트 중인 함수를 여러 번 곱하고 결과의 중앙값을 반환합니다. 문서에서는 and 및 timeit
기능을 함께 사용해서는 안 된다고 제안합니다. 즉, 후자가 전자에서 사용된다는 의미입니다. 문서에서는 코드를 실행하는 데 0.1초 미만이 걸리는 경우 여러 번 실행하고 평균을 계산하도록 권장합니다. 내가 얻은 결론은 MATLAB의 타이밍 비율이 두 배 정도 덜 정확하고 장기 실행 기능에서 얼마나 많은 시간을 절약할 수 있는지 확인하는 데 더 좋다는 것입니다. 충분한 샘플이 주어지면 평균과 중앙값을 조합하면 상당히 일관된 결과를 향해 많은 양의 변동이 발생합니다.tic
toc
tic
toc
time(1)