Hiệu suất khác nhau giữa stdin và đối số dòng lệnh


11

Đối với một số lệnh, có thể chỉ định đầu vào nhất định là stdin hoặc đối số dòng lệnh.

Cụ thể, giả sử commandcó thể mất đầu vào stdin và một tên tập tin như là đối số dòng lệnh, và command < myfile, cat myfile | commandcommand myfilecó thể tạo ra kết quả tương tự.

Ví dụ,

Khi lệnh là sed:

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

Khi lệnh là cat:

cat < myfile
cat myfile
  1. Tôi đã tự hỏi nếu có một số quy tắc chung về màn trình diễn của họ, tức là một trong số họ thường là hiệu quả nhất, và cái nào ít nhất?
  2. Là chuyển hướng luôn luôn tốt hơn đường ống?

1
Tôi ước mọi người hỏi những câu hỏi (trùng lặp) này và viết vỏ của họ từ đầu như một bài tập.
alex

1
vui lòng không sử dụng "Cảm ơn!" trong câu hỏi của bạn. Bỏ phiếu trả lời để bày tỏ lòng biết ơn của bạn.
alex

@Alex: Nếu đây là bản dupe, vui lòng liên kết với bản sao và chúng tôi sẽ làm việc để đóng nó. Thông thường, bạn sẽ không trả lời một câu hỏi mà bạn biết là trùng lặp và gắn cờ cho sự chú ý của người điều hành.
Caleb

1
@alex: Tôi có thể học cách viết vỏ của mình ở đâu?
Tim

@Caleb: Tôi chắc chắn rằng điều này đã được hỏi như 2 hoặc 3 lần trong tháng vừa qua, chỉ cần không có liên kết tiện dụng :-p
alex

Câu trả lời:


6

Các cat file | commandcú pháp được coi là một Sử dụng ích củaCat . Trong tất cả các tùy chọn của bạn, phải mất một hiệu năng vì nó phải sinh ra một tiến trình khác trong kernel. Tuy nhiên, điều này không đáng kể có thể xuất hiện trong bức tranh lớn, nó nằm trên các hình thức khác không có. Điều này đã được đề cập trong các câu hỏi như: Tôi có nên quan tâm đến những con mèo không cần thiết?

Giữa hai hình thức khác hầu như không có sự khác biệt về hiệu suất. STDIN là một nút tập tin đặc biệt mà quá trình phải mở và đọc giống như bất kỳ nút nào khác. Truyền tên tệp thay vì STDIN chỉ khiến nó mở một tệp khác.

Sự khác biệt sẽ là ở những tính năng / tính linh hoạt mà bạn đang tìm kiếm.

  • Truyền tên tệp cho chương trình có nghĩa là tệp đầu vào có thể tìm kiếm được. Điều này có thể hoặc không quan trọng đối với chương trình nhưng một số thao tác có thể được tăng tốc nếu luồng có thể tìm kiếm được.
  • Biết tệp đầu vào thực tế cho phép chương trình của bạn có khả năng ghi vào nó. Ví dụ sed -iđể chỉnh sửa tại chỗ. (Lưu ý: vì việc này phải tạo một tệp mới đằng sau hậu trường, nó không phải là hiệu suất tăng so với các chuyển hướng khác nhưng đó là một bước thuận tiện.)
  • Sử dụng chuyển hướng shell cung cấp cho bạn khả năng ghép nhiều tệp hoặc thậm chí sử dụng chuyển hướng quy trình. sed [exp] < file1 file2hoặc thậm chí sed [exp] < <(grep command). Chi tiết về trường hợp sử dụng này có thể được tìm thấy trong câu hỏi này: Thay thế quy trình và đường ống

Quá trình thay thế sẽ hoạt động mà không yêu cầu bạn đưa ra kết quả; sed [exp] < <(grep command)sẽ hoạt động tốt như sed [exp] <(grep command)(vì <(grep command)tạo một tệp tạm thời có tên cho độ dài của lệnh sedhoàn toàn có khả năng tự mở mà không cần hỗ trợ shell).
ShadowRanger

2
  1. Cho rằng command filechỉ cần mở tệp và từ đó trở đi hoạt động như thể nó là stdin, có rất ít sự khác biệt. Với chuyển hướng shell, bạn chỉ cần mở tệp trước (shell does,) trái ngược với lệnh nhị phân chính nó.

  2. Nếu chúng ta đang nói về cat file | commandvs. command <file, thì cái sau được ưa thích hơn. Bạn sẽ không nhận thấy sự khác biệt đáng kể về hiệu suất giữa hai loại, nhưng trước đây là phức tạp không cần thiết (quá trình bổ sung và bộ nhớ chia sẻ cho đường ống, với thông lượng hạn chế.) Ngoài ra, bạn không thể seek(thay đổi vị trí con trỏ tệp tùy ý) trong một ống, trong khi bạn có thể trong một tập tin bình thường. Một số lệnh có thể sử dụng thuật toán hiệu quả hơn khi có thể seektrong tệp đầu vào.


Tôi muốn nói rằng tệp lệnh được ưa thích hơn lệnh <file, vì lệnh có thể thực hiện một số loại truy cập không tuần tự.
dùng606723

Và điều gì sẽ ngăn nó làm như vậy với <file? Quan điểm của bạn là hợp lệ để sử dụng tên tệp đầu vào để lấy được tên tệp đầu ra khó khăn, ví dụ: gzip filesản xuất file.gz.
alex

có lẽ tôi không hiểu làm thế nào chuyển hướng hoạt động trong nội bộ. Hãy nói rằng chúng tôi chuyển hướng một bộ phim 12 GB thành mplayer / vlc, và sau đó chúng tôi bỏ qua đến cuối. Chính xác thì chuyện gì sẽ xảy ra trong trường hợp này?
dùng606723

1
Shell mở tệp và tạo ra một quy trình phụ, kế thừa bộ mô tả tệp. Quá trình chia hai closes stdinvà các cuộc gọi duptrên mô tả tập tin mở, vì vậy nó thay thế cái cũ stdin(mà là một số loại tty trong hầu hết các trường hợp.) Từ quan điểm người chơi phim của quan điểm đó có sự khác biệt giữa điều đó và mở tập tin bằng cách nó tên trong chính người chơi. Bộ mô tả tệp có thể tìm kiếm được trong cả hai trường hợp, vì vậy khi chúng tôi bỏ qua đến cuối thì không có sự khác biệt nào có thể phát hiện được của người dùng.
alex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.