Tôi đã đồng ý theo bản năng với câu trả lời của Satō Katsura; nó có ý nghĩa Tuy nhiên, nó đủ dễ để kiểm tra.
Tôi đã thử viết một triệu dòng lên màn hình, viết (nối thêm) vào một tệp và chuyển hướng đến /dev/null
. Tôi đã thử nghiệm lần lượt từng thứ một, sau đó thực hiện năm lần lặp lại. Đây là những lệnh tôi đã sử dụng.
$ time (for i in {1..1000000}; do echo foo; done)
$ time (for i in {1..1000000}; do echo foo; done > /tmp/file.log)
$ time (for i in {1..1000000}; do echo foo; done > /dev/null)
Sau đó tôi vẽ tổng số lần dưới đây.
Như bạn có thể thấy, những giả định của Satō Katsura là chính xác. Theo câu trả lời của Satō Katsura, tôi cũng nghi ngờ rằng yếu tố giới hạn sẽ là đầu ra, do đó, việc lựa chọn đầu ra sẽ có ảnh hưởng đáng kể đến tốc độ chung của kịch bản.
FWIW, câu trả lời ban đầu của tôi có mã khác, trong đó có tệp nối thêm và /dev/null
chuyển hướng bên trong vòng lặp.
$ rm /tmp/file.log; touch /tmp/file.log; time (for i in {1..1000000}; do echo foo >> /tmp/file.log; done)
$ time (for i in {1..1000000}; do echo foo > /dev/null; done)
Như John Kugelman chỉ ra trong các bình luận, điều này thêm rất nhiều chi phí. Như câu hỏi đặt ra, đây không thực sự là cách đúng để kiểm tra nó, nhưng tôi sẽ để nó ở đây vì nó cho thấy rõ chi phí mở lại một tệp liên tục từ trong chính kịch bản.
Trong trường hợp này, kết quả được đảo ngược.