2014-05-03 15 views
5

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:

  1. Tại sao cuộc gọi điện thoại Haskell clock_gettime liên tục?
  2. Có cách nào để vô hiệu chức năng này không?
+0

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

+0

Bạn có đang chạy với hồ sơ không? Profiling làm việc thêm. – GarethR

+1

@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ế đó. –

Trả lời

0

tôi đã xem xét nơi clock_gettime được gọi trong GHC RTS và thấy rằng nó được sử dụng trong một cuộc gọi đến getMonotonicTime mà lần lượt là nền tảng của timeout trong TimerManager của thư viện GHC.Event được sử dụng bởi Trình quản lý IO để thăm dò trên tay cầm, tệp, cuộc gọi hệ thống, v.v. Giấy MIO là tài nguyên tương đối tốt gần đây trên Trình quản lý IO. Trong mọi trường hợp, tôi không tưởng tượng bạn sẽ có thể loại bỏ những cuộc gọi đó.

Cũng lưu ý rằng trong khi bạn nhìn thấy nhiều của những cuộc gọi đồng hồ, điều đó không có nghĩa họ là những cuộc gọi hệ thống được lấy nhất thời gian, mà tôi tưởng tượng liên quan nhiều hơn đến GC, thực sự thực hiện IO vv

Các vấn đề liên quan