Tôi đang chạy chương trình Haskell thực hiện tính toán dài. Sau khi một số hồ sơ và truy tìm, tôi nhận thấy như sau:Cấu hình Haskell - clock_gettime
$ /usr/bin/time -v ./hl test.hl
9000045000050000
Command being timed: "./hl test.hl +RTS"
User time (seconds): 1.43
System time (seconds): 1.15
Nó được sử dụng rất nhiều thời gian hệ thống mặc dù mã của tôi không gọi rõ ràng bất kỳ cuộc gọi hệ thống (nó đọc một tập tin và giải thích một số mã trong nó).
Chạy nó với strace -ttT cho thấy rất nhiều cuộc gọi đến một timer:
17:04:52.454513 clock_gettime(CLOCK_THREAD_CPUTIME_ID, {1, 282721271}) = 0 <0.000529>
17:04:52.456223 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000720>
17:04:52.458749 rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0 <0.000239>
17:04:52.460288 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {1, 285126436}) = 0 <0.000255>
17:04:52.461650 --- SIGVTALRM {si_signo=SIGVTALRM, si_code=SI_TIMER, si_pid=0, si_uid=0, si_value=0} ---
17:04:52.462242 rt_sigreturn() = 0 <0.000458>
tôi nghĩ rằng nó có thể là RTS clock, vì vậy tôi vô hiệu hóa nó và chạy lại:
$ /usr/bin/time -v ./hl test.hl +RTS -V0
9000045000050000
Command being timed: "./hl test.hl +RTS -V0"
User time (seconds): 1.73
System time (seconds): 0.85
Kết quả đầu ra có vẻ gần như giống hệt ngoại trừ SIGVTALRM thực tế:
17:05:16.409729 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {0, 155881514}) = 0 <0.000378>
17:05:16.410746 clock_gettime(CLOCK_MONOTONIC, {2184631, 597586194}) = 0 <0.000432>
17:05:16.412724 clock_gettime(CLOCK_THREAD_CPUTIME_ID, {0, 156994988}) = 0 <0.000290>
17:05:16.413832 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000245>
17:05:16.415017 rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0 <0.000305>
Tôi có một vài câu hỏi:
- Tại sao cuộc gọi điện thoại Haskell clock_gettime liên tục?
- Có cách nào để vô hiệu chức năng này không?
mặc dù nó không phải là một giải pháp cho vấn đề của bạn, nhưng bạn đã nhìn vào tiêu chí - để lược tả? – epsilonhalbe
Bạn có đang chạy với hồ sơ không? Profiling làm việc thêm. – GarethR
@GarethR: Tôi đảm bảo rằng tôi đang chạy mà không cần lược tả, thậm chí tạo ra một hộp cát cabal mới để chắc chắn về thực tế đó. –