Tôi có một chương trình C nhỏ để tính toán băm (đối với bảng băm). Các mã trông khá sạch sẽ, tôi hy vọng, nhưng có một cái gì đó không liên quan đến nó đó là bugging tôi.printf làm chậm chương trình của tôi
Tôi có thể dễ dàng tạo khoảng một triệu băm trong khoảng 0,2-0,3 giây (được đánh dấu bằng/usr/bin/time). Tuy nhiên, khi tôi printf() inging chúng trong vòng lặp for, chương trình sẽ chậm lại khoảng 5 giây.
- Tại sao điều này?
- Làm thế nào để làm cho nó nhanh hơn? mmapp() ing stdout có thể?
- Thiết kế stdlibc liên quan đến điều này như thế nào và nó có thể được cải thiện như thế nào?
- Hạt nhân có thể hỗ trợ nó tốt hơn như thế nào? Làm thế nào nó sẽ cần phải được sửa đổi để làm cho thông lượng trên địa phương "tập tin" (ổ cắm, đường ống, vv) REALLY nhanh?
Tôi rất mong nhận được câu trả lời thú vị và chi tiết. Cảm ơn.
PS: đây là bộ công cụ xây dựng trình biên dịch, do đó, đừng ngại ngùng để tìm hiểu chi tiết. Trong khi đó không có gì để làm với vấn đề chính nó, tôi chỉ muốn chỉ ra rằng chi tiết tôi quan tâm.
Phụ Lục
Tôi đang tìm kiếm thêm các cách tiếp cận programatic cho các giải pháp và giải thích. Thật vậy, đường ống thực hiện công việc, nhưng tôi không kiểm soát được "người dùng" làm gì.
Tất nhiên, tôi đang thực hiện kiểm tra ngay bây giờ, điều này sẽ không được thực hiện bởi "người dùng thông thường". NHƯNG mà không thay đổi thực tế là một printf đơn giản() làm chậm quá trình, đó là vấn đề tôi đang cố gắng tìm một giải pháp lập trình tối ưu cho.
Phụ Lục - Astonishing quả
Thời gian tham chiếu là cho printf đồng bằng() gọi bên trong một TTY và mất khoảng 4 phút 20 giây.
Kiểm tra theo/dev/pts (ví dụ: Konsole) tăng tốc đầu ra lên khoảng 5 giây.
Mất khoảng thời gian tương tự khi sử dụng setbuffer() trong mã thử nghiệm của tôi với kích thước 16384, gần giống với 8192: khoảng 6 giây.
setbuffer() có dường như không có hiệu lực khi sử dụng: mất khoảng thời gian tương tự (trên TTY khoảng 4 phút, trên PTS khoảng 5 giây).
Điều đáng kinh ngạc là, nếu tôi bắt đầu thử nghiệm trên tty1 và sau đó chuyển sang khác TTY, nó chỉ mất giống như trên một PTS: khoảng 5 giây.
Kết luận: hạt nhân thực hiện điều gì đó liên quan đến khả năng truy cập và thân thiện với người dùng. HUH!
Thông thường, nó cũng không kém phần quan trọng nếu bạn nhìn vào TTY khi đang hoạt động hoặc chuyển sang TTY khác.
Lesson: khi chạy chương trình đầu ra thâm canh, chuyển sang một TTY!
Nếu bạn chuyển hướng đầu ra đến/dev/null, chương trình của bạn sẽ nhanh như thế nào? –
@ammoQ: Chỉ cần nhanh như khi chuyển hướng đến bất kỳ tệp thông thường nào: khoảng 0,5 giây. – Flavius
Nó không phải là một vấn đề "đơn giản".I/O nói chung là đơn đặt hàng của cường độ chậm hơn so với thẳng lên tính toán CPU và hoạt động xe buýt, nó không phải là đáng kinh ngạc để nhận ra nó. –