표준 입력과 명령줄 인수 간의 성능 차이

표준 입력과 명령줄 인수 간의 성능 차이

일부 명령의 경우 특정 입력을 stdin 또는 명령줄 인수로 지정할 수 있습니다.

특히, commandstdin 입력 및 파일 이름이 명령줄 인수로 전달될 수 있고 , 및 가 command < myfile동일한 cat myfile | command 결과 command myfile를 생성할 수 있다고 가정합니다.

예를 들어,

명령은 다음과 같습니다 sed.

sed s/day/night/ <myfile >new   
sed s/day/night/ myfile >new    
cat myfile | sed s/day/night/ >new

명령은 다음과 같습니다 cat.

cat < myfile
cat myfile
  1. 성능에 대한 몇 가지 일반적인 규칙이 있는지 궁금합니다. 즉, 일반적으로 어떤 것이 가장 효율적이고 어떤 것이 가장 덜 효율적입니까?
  2. 리디렉션은 항상 파이프보다 낫습니까?

답변1

cat file | command문법이 고려됩니다.쓸모없는 사용Cat. 모든 옵션 중에서 커널에 다른 프로세스를 생성해야 하기 때문에 성능에 영향을 미칩니다. 그러나 이는 큰 계획에서 사소해 보일 수 있지만 다른 형식에는 없는 오버헤드가 있습니다. 여기에는 이미 다음과 같은 문제가 포함되어 있습니다.원치 않는 고양이에 관심을 가져야 할까요?

다른 두 형태 사이에는 성능 차이가 거의 없습니다. STDIN은 프로세스가 다른 파일처럼 열고 읽어야 하는 특수 파일 노드입니다. STDIN 대신 파일 이름을 전달하면 다른 파일이 열립니다.

차이점은 원하는 기능/유연성입니다.

  • 프로그램에 파일 이름을 전달한다는 것은 입력 파일을 검색할 수 있다는 의미입니다. 이는 프로그램에 중요할 수도 있고 중요하지 않을 수도 있지만 스트림을 검색할 수 있으면 일부 작업의 속도가 빨라질 수 있습니다.
  • 실제 입력 파일을 알면 프로그램에서 해당 파일에 쓸 수 있습니다. 예를 들어 sed -i내부 편집의 경우입니다. (참고: 백그라운드에서 새 파일을 생성해야 하기 때문에 다른 리디렉션에 비해 성능이 향상되지는 않지만 편리한 단계입니다.)
  • 셸 리디렉션을 사용하면 여러 파일을 연결하거나 프로세스 리디렉션을 사용할 수도 있습니다. sed [exp] < file1 file2심지어 sed [exp] < <(grep command). 이 사용 사례에 대한 자세한 내용은 이 문제에서 확인할 수 있습니다.프로세스 대체 및 파이프

답변2

  1. command file단지 파일을 열고 그때부터 이전과 같이 작업한다는 점을 고려하면 stdin별 차이가 없습니다 . 셸 리디렉션을 사용하면 바이너리 자체에 명령을 내리는 대신 파일을 미리 열면 됩니다(셸에서 이 작업을 수행함).

  2. cat file | commandvs. 에 대해 이야기하면 command <file후자가 선호됩니다. 둘 사이에 큰 성능 차이는 느껴지지 않지만 전자는 불필요하게 복잡합니다(파이프에 대한 추가 프로세스 및 공유 메모리 버퍼, 제한된 처리량). 또한 seek파이프를 임의로 변경할 수 없습니다(파일 포인터 위치를 변경). , 일반 파일에서는 가능합니다. seek일부 명령은 입력 파일에서 -ing을 사용할 수 있는 경우 보다 효율적인 알고리즘을 사용할 수 있습니다 .

관련 정보