제퍼넷 로고

Bash 파이프라인의 정신 모델이 잘못되었나요?

시간

[마이클 린치]는 이상한 상황에 직면했습니다. 왜 그의 프로그램을 거의 10배나 컴파일한 다음 실행했습니까? 빠른 그냥 프로그램 자체를 실행하는 것보다? [Michael]은 프로그래밍 프로젝트를 벤치마킹하는 동안 이 문제에 부딪혔고, 이를 반복성과 분석을 위한 필수 요소로 축소했으며, 이것이 bash 파이프라인 작동 방식에 대한 잘못된 정신적 모델을 강조한다는 사실을 발견했습니다.

상황은 다음과 같습니다. [Michael]의 단순화된 프로그램이 수행하는 첫 번째 작업은 타이머를 시작하는 것입니다. 그런 다음 단순히 다음에서 일부 바이트를 읽고 계산합니다. stdin, 그런 다음 해당 일이 발생하는 데 걸린 시간을 인쇄합니다. 다음과 같은 방법으로 테스트 프로그램을 실행하면 약 13 마이크로초 정도 소요된다.

$ echo '00010203040506070809' | xxd -r -p | zig build run -Doptimize=ReleaseFast
bytes: 10
execution time: 13.549µs

(이미 컴파일된) 프로그램을 직접 실행하면 실행 시간이 162마이크로초로 늘어납니다.

$ echo '00010203040506070809' | xxd -r -p | ./zig-out/bin/count-bytes
bytes: 10
execution time: 162.195µs

다시 말하지만, 두 제품의 유일한 차이점은 zig build run./zig-out/bin/count-bytes 먼저 코드를 컴파일한 다음 즉시 실행한다는 것입니다. 두 번째는 단순히 컴파일된 프로그램을 실행합니다.

추가 컴파일 단계를 추가하는 방법 감소 실행 시간은? Bash 파이프라인이 어떻게 작동하는지에 대한 [Michael]의 정신적 모델은 잘못된 것으로 밝혀졌으며 그는 훌륭한 일을 해냈습니다. 실제로 작동하는 방식과 이로 인해 이상한 동작이 발생하는 이유를 설명합니다. 그는 보고 있었다.

즉, bash 파이프라인의 명령은 순차적으로 실행되지 않습니다. 모두 동시에 시작되어 병렬로 실행됩니다. 즉, 직접 실행하면 [Michael]의 바이트 카운터 프로그램이 즉시 시작됩니다. 그런 다음 약 150마이크로초 동안 아무것도 하지 않고 기다렸습니다. echo '00010203040506070809' | xxd -r -p 파이프라인의 일부는 프로그램이 읽을 수 있도록 데이터를 전달하는 데 사용되었습니다. 이미 컴파일된 버전을 실행할 때 추가 실행 시간이 발생하는 곳입니다.

그렇다면 먼저 컴파일하는 것이 더 빠르게 실행되는 이유는 무엇입니까? 동일한 기본 이유: zig build run 명령이 시작되면 먼저 프로그램을 컴파일하는 데 약간의 시간이 소요됩니다. 그런 다음 컴파일된 프로그램이 실제로 시작되고 실행 타이머가 시작되면 bash 파이프라인의 입력 데이터가 이미 준비된 것입니다. 따라서 새로 컴파일된 프로그램은 파이프라인의 이전 데이터가 사용 가능해질 때까지 기다리지 않기 때문에 더 짧은 시간에 실행됩니다.

bash 파이프라인이 실제로 내부적으로 어떻게 작동하는지에 대한 흥미로운 관찰이며, [Micheal]이 전체 여정과 설명에 넣은 세부 사항에 만족합니다. 조만간 이와 같은 세부 사항이 나타나서 이를 발견한 사용자처럼 눈썹이 치켜 올라가게 됩니다. SSH 명령의 공백과 관련된 골치 아픈 경우.

spot_img

최신 인텔리전스

spot_img