Việc chạy các lệnh có thể làm cho chúng chậm hơn?


37

Tôi đã thấy mình sử dụng -vcờ cho rất nhiều ứng dụng ngày càng ít đi (đặc biệt là đối với những thứ tầm thường như tarcp). Tuy nhiên, khi tôi đã làm và tôi đã nói, việc giải nén một tệp lớn, sẽ mất nhiều thời gian hơn so với khi tôi không sử dụng -vcờ.

Tôi cho rằng điều này là do thiết bị đầu cuối phải xử lý văn bản và tôi đang điền vào bất kỳ bộ đệm nào nó có thể có. Nhưng câu hỏi của tôi là, điều này có làm cho ứng dụng thực sự chạy chậm hơn hay nó hoàn thành trong cùng một khoảng thời gian và điều tôi đang thấy là thiết bị đầu cuối đang cố gắng bắt kịp?


Bạn đã cố gắng để thời gian ví dụ tar xvf file.tar > /dev/nullso với tar xf file.tar? Chuyển hướng để /dev/nullđưa thiết bị đầu cuối của bạn ra khỏi đây.
Benjamin Bannier

3
Ngoài ra, lưu ý rằng stdoutstderrđược đệm dòng - có nghĩa là việc lấp đầy bộ đệm không mất nhiều thời gian - đó là các printfcuộc gọi chặn (và bởi đầu ra của thiết bị đầu cuối mở rộng) sẽ mất mãi mãi.
new123456

1
Nếu bạn đã nói về các lệnh Windows, tôi chắc chắn rằng đó là sự thật :)
kokbira

Đối với tác vụ chuyên sâu cpu, tùy thuộc vào số lượng IO bạn đang thực hiện, bạn có thể thấy sự suy giảm hiệu suất khủng khiếp.
người dùng

Câu trả lời:


31

Có, chạy verbose sẽ làm chậm ứng dụng của bạn.

Bao nhiêu tùy thuộc vào ứng dụng.

Mỗi bản in đến thiết bị đầu cuối sẽ yêu cầu thêm thời gian xử lý. Trong trường hợp sử dụng printf () hoặc bất kỳ chị em nào của nó, đây là một số lượng lớn xử lý lãng phí.

Ngoài ra, các thiết bị đầu cuối phải đối phó với dữ liệu đó. Có một lượng không gian bộ đệm hạn chế giữa ứng dụng và thiết bị đầu cuối và kênh IO sẽ chặn cho đến khi có đủ không gian trong bộ đệm nói trên để thực sự xuất dữ liệu. Ứng dụng nói chung sẽ không thể tiếp tục trong khi việc chặn này đang diễn ra. 1

Ngoài ra, hành động hiển thị văn bản gỡ lỗi trên thiết bị đầu cuối sẽ tiêu tốn chu kỳ xử lý. Một lần nữa, điều này phụ thuộc vào cả ứng dụng (số lượng gỡ lỗi), chương trình đầu cuối (phông chữ được sử dụng, hiệu ứng, v.v.) và thậm chí trình điều khiển windows X đang sử dụng (tăng tốc phần cứng, v.v.).

Các timechương trình có thể được sử dụng để xác định tương đối chính xác một lệnh đã được thực hiện trong bao lâu để chạy. Chạy cùng một chương trình hai lần, một lần với gỡ lỗi và một lần không, sẽ cho bạn thấy mức độ khác biệt của nó. Tôi sẽ đề nghị chạy lệnh một lần trước khi thực hiện các kiểm tra để đảm bảo rằng bộ đệm ẩn giống nhau cho cả hai lần chạy thử của lệnh. Bạn không muốn làm lệch kết quả bằng cách chạy lần thứ hai nhanh hơn nhiều vì hầu hết dữ liệu đã được lưu trong bộ nhớ cache của lần chạy đầu tiên ngay bây giờ, bạn có ...


1 Trong trường hợp ứng dụng đa luồng, chỉ luồng thực hiện đầu ra gỡ lỗi sẽ thực sự chặn.


Hầu hết các lập trình viên học điều này khá nhanh (Borland C trong DOS);)
Dragos

Tất nhiên, nếu cửa sổ bàn điều khiển bị ẩn (hoặc thậm chí được che một phần), thì nó sẽ không ảnh hưởng nhiều như khi nhìn thấy bàn điều khiển. Mở một dấu nhắc lệnh và làm a dir c:\/s/a. Bạn có thể thấy sự thay đổi tốc độ khi nó hoàn toàn có thể nhìn thấy và được che một phần. Bạn không thể thấy nó tăng tốc khi được thu nhỏ, nhưng nó chắc chắn sẽ nhanh hơn, mặc dù bạn phải khởi động lại nếu muốn kiểm tra, để bỏ qua bộ nhớ đệm sẽ khiến nó nhanh hơn, vì nó sẽ không để truy cập đĩa.
Synetech

1
@Syn Chúng ta đang nói Linux ở đây.
Majenko

1
@Matt nó vẫn là một bình luận hợp lệ. Hãy tôn trọng.
nhinkle

@Matt, doh! Tôi đã không thông báo. (Có lẽ tôi đã bị phân tâm từ bình luận của DOS.) Dù sao, Linux khá khác biệt, nhưng tôi tự hỏi liệu điều đó có đúng với nó không (bảng điều khiển hiển thị với nhiều cuộn văn bản chạy chậm hơn).
Synetech

8

Nó phụ thuộc vào ứng dụng mà bạn đang chạy. Tuy nhiên, nói chung, chúng ta có thể nói rằng verbose sẽ làm chậm hầu hết các ứng dụng Linux phổ biến vì chúng phải đồng bộ hóa các hành động của chúng giữa thiết bị xuất chuẩn và I / O hoặc giới hạn bộ xử lý.


6

Sử dụng yesnhư một trường hợp thử nghiệm trên OS X 10.7, có vẻ như nó thực sự quan trọng nếu bạn in nhiều đầu ra cho thiết bị đầu cuối, như người ta mong đợi.

Định lượng điều này xa hơn một chút, tôi chạy yestrong 5 giây, trong một trường hợp in đầu ra ra thiết bị đầu cuối và lưu nó vào một tệp (với tee), trong trường hợp khác làm tương tự ngoại trừ chuyển hướng stdoutđến /dev/null:

  1. yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
  2. yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm

Trường hợp 1. đưa ra 2371584 dòng và trường hợp 2. cho 136421376 dòng, hoặc gấp 57 lần. 'Hiệu suất' của yes(được đo bằng số lượng dòng nó in trên một đơn vị thời gian) trong trường hợp này do đó chậm hơn 57 lần .

Một lưu ý phụ ở đây là tôi đã sử dụng yeskết hợp với teeở đây, điều này có thể ảnh hưởng đến kết quả một chút, tuy nhiên tôi nghĩ rằng kết quả vẫn còn hiệu lực.

Một dấu hiệu khác cho thấy chương trình bị chậm là chạy yestrong khi xuất ra thiết bị đầu cuối, thiết bị đầu cuối sử dụng khoảng 100% CPU và yeschỉ khoảng 37%, trong khi chạy yesmà không xuất ra thiết bị đầu cuối, nó sử dụng toàn bộ 100% (Đây là trên đa máy lõi, vì vậy yescó thể sử dụng nhiều CPU hơn nếu có thể, ngoại trừ nó bị chậm bởi thiết bị đầu cuối).


5

Thật dễ dàng để chỉ trả lời có, nó sẽ làm chậm ứng dụng. Nhưng một câu trả lời đúng hơn nhiều là nó không thành vấn đề trong 99% các trường hợp.

Nếu ứng dụng của bạn đang thực hiện bất kỳ loại công việc nào thực sự tốn năng lượng CPU, thì khả năng in thêm một số dòng văn bản lên màn hình khiến cho bất kỳ loại khác biệt nào cũng gần bằng 0%.

Trên thực tế, bạn có thể dễ dàng đưa ra phán đoán của riêng mình: Nếu ứng dụng đang tạo ra một bức tường văn bản to lớn, nó thực sự có thể khiến bạn tốn một chút tiền. Có lẽ.


3
-1 điều này không đúng. printf()là cực kỳ đắt đỏ
Thomas Bonini

1
Những gì tôi nói là sự thật. Những gì bạn đang cố gắng để làm cho nó trông giống như tôi đã nói, tuy nhiên, là một cái gì đó hoàn toàn khác. Tôi không nói bất cứ điều gì về hiệu quả của bất kỳ in ấn stdlib cụ thể. Tôi đang nói rằng các chương trình nên làm đủ công việc mà thời gian in là không đáng kể. Bây giờ đi troll người khác.
slarpspark

@slarpspark: không nhất thiết là không đáng kể, ngay cả khi chúng ta đưa printf () ra khỏi phương trình, luồng byte vẫn phải đi qua bash, sau đó trình giả lập thiết bị đầu cuối, sau đó trình giả lập thiết bị đầu cuối phải hiển thị văn bản vào màn hình sau khi phân tích cú pháp các ký tự thoát và kết xuất văn bản không rẻ nếu được thực hiện ở tốc độ mà một số lệnh dài dòng có thể làm; và nó sẽ đặc biệt tốn kém nếu chương trình xóa bộ đệm đầu ra ở mỗi dòng vì điều đó có nghĩa là chuyển đổi ngữ cảnh. Tôi thường trải nghiệm trong khi viết các kịch bản python, rằng việc loại bỏ các bản in trong vòng lặp chặt chẽ đôi khi có thể mang lại 10 giây cho 1 giây.
Lie Ryan

Thế còn một lệnh chạy trên SSH, thì ngay cả khi thời gian CPU là tối thiểu, một khi bạn giới thiệu độ trễ mạng chắc chắn là đáng kể?
ec2011

3

Mã verbose thường được đánh giá bằng lệnh if và mỗi khi nó chuyển điều khiển sang chức năng hiển thị thì càng mất nhiều thời gian, ngữ cảnh có thể được chuyển đổi, nhiều ngắt hơn.

Nhưng nó phụ thuộc, nếu mã verbose của bạn là một luồng riêng biệt mà chỉ kiểm tra trạng thái hoàn thành theo thời gian thì sự khác biệt là không thể bỏ qua.

Câu hỏi này có thể hưởng lợi rất nhiều từ sự đóng góp của các lập trình viên giàu kinh nghiệm của stackoverflow. Tôi đề nghị di chuyển :)

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.