Tôi đã thực hiện những nỗ lực khá kém trong vấn đề PRIME1 trên SPOJ. Tôi đã khám phá bằng cách sử dụng ByteString thực sự đã giúp hiệu suất cho việc đọc trong văn bản sự cố. Tuy nhiên, việc sử dụng ByteString để ghi lại kết quả thực sự hơi chậm hơn so với sử dụng các hàm Prelude. Tôi đang cố gắng tìm ra nếu tôi làm sai, hoặc nếu điều này được mong đợi.Khi nào tôi sử dụng ByteString và khi nào tôi không sử dụng?
tôi đã tiến hành lập hồ sơ và thời gian sử dụng (putStrLn.show) và ByteString tương đương ba cách khác nhau:
- tôi thử nghiệm mỗi ứng cử viên để xem nếu nó là số nguyên tố. Nếu vậy, tôi thêm nó vào danh sách và viết nó ra với (putStrLn. show)
- tôi thực hiện một danh sách của tất cả các số nguyên tố và viết ra danh sách sử dụng (. Unlines putStrLn. Show)
- tôi lập danh sách của tất cả các số nguyên tố và viết ra danh sách sử dụng bản đồ (putStrLn. chương trình)
tôi mong đợi con số 2 và 3 để thực hiện chậm hơn như bạn đang xây dựng một danh sách trong một chức năng và tiêu thụ nó trong khác. Bằng cách in các con số như tôi tạo ra chúng, tôi tránh phân bổ bất kỳ bộ nhớ cho danh sách. Mặt khác, bạn đang thực hiện cuộc gọi hệ thống gọi với mỗi cuộc gọi đến putStrLn. Đúng? Vì vậy, tôi đã thử nghiệm và # 1 trên thực tế là nhanh nhất.
Hiệu suất tốt nhất đạt được với tùy chọn # 1 và các hàm Prelude ([Char]). Tôi hy vọng rằng hiệu suất tốt nhất của tôi sẽ là tùy chọn # 1 với ByteString, nhưng đây không phải là trường hợp. Tôi chỉ sử dụng ByteStrings lười biếng, nhưng tôi không nghĩ rằng điều này sẽ quan trọng. Phải không?
Một số câu hỏi:
- bạn mong chờ sự ByteStrings để thực hiện tốt hơn vì đã viết một loạt các Số nguyên stdout?
- Tôi có thiếu mẫu cách để tạo và viết câu trả lời có thể dẫn đến hiệu suất tốt hơn ?
- Nếu tôi chỉ viết ra các số là văn bản, khi nào, nếu, có bao giờ, có lợi ích khi sử dụng ByteString không?
Giả thuyết làm việc của tôi là viết ra Integer với ByteString chậm hơn bạn không kết hợp chúng với văn bản khác. Nếu bạn đang kết hợp Số nguyên với [Char], thì bạn sẽ có hiệu suất tốt hơn khi làm việc với ByteStrings. Nghĩa là, ByteString viết lại:
putStrLn $ "the answer is: " ++ (show value)
sẽ nhanh hơn nhiều so với phiên bản được viết ở trên. Điều này có đúng không?
Cảm ơn bạn đã đọc!
Bạn có thể chỉ cho tôi sự can đảm của một trong các thư viện được đề cập ở trên không. Tức là phần chuyển luồng chuyển đổi thành bộ đệm ngày càng phát triển? Tôi không quen thuộc với nội bộ của bất kỳ thư viện nào. Sẽ renderHtml trong Text.Blaze.Renderer.UTF8 là một ví dụ về điều này? –
Ví dụ: trong binary a [builder] (http://hackage.haskell.org/packages/archive/binary/0.5.0.2/doc/html/src/Data-Binary-Builder.html#Builder) là một hàm liên tục cập nhật một bộ đệm có thể thay đổi, không đồng bộ. –
Có vẻ như tôi có bài tập đọc buổi tối. Cảm ơn bạn! –