Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell评测-时钟获取时间_Haskell_Profiling_Clock - Fatal编程技术网

Haskell评测-时钟获取时间

Haskell评测-时钟获取时间,haskell,profiling,clock,Haskell,Profiling,Clock,我正在运行一个Haskell程序,它可以进行长时间的计算。经过一些分析和跟踪,我注意到以下几点: $ /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 即使我的代码没有显式调用任何系统调用(它读取文件并解释其中的一些代码),它也占用了大量的系统时间 使用strac

我正在运行一个Haskell程序,它可以进行长时间的计算。经过一些分析和跟踪,我注意到以下几点:

$ /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
即使我的代码没有显式调用任何系统调用(它读取文件并解释其中的一些代码),它也占用了大量的系统时间

使用strace-ttT运行它会显示对计时器的大量调用:

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>
strace输出似乎几乎相同,但实际的SIGVTALRM除外:

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>
17:05:16.409729 clock\u gettime(clock\u PROCESS\u CPUTIME\u ID,{0155881514})=0
17:05:16.410746 clock_gettime(clock_单调,{2184631597586194})=0
17:05:16.412724 clock_gettime(clock_THREAD_CPUTIME_ID,{0,15699488})=0
17:05:16.413832 rt_sigprocmask(SIG_SETMASK,[],NULL,8)=0
17:05:16.415017 rt_sigprocmask(SIG_块,[INT],[8)=0
我有几个问题:

  • 为什么哈斯凯尔反复给时钟打电话
  • 有没有办法禁用此功能

  • 我查看了GHC RTS中调用
    clock\u gettime
    的位置,发现它用于调用
    getMonotonicTime
    ,而这又是
    GHC.Event
    库中超时的基础,IO管理器使用该库轮询句柄、文件、系统调用,这篇论文是关于IO管理器的一篇相对较新的资源。在任何情况下,我认为你都无法消除这些呼叫


    还要注意的是,虽然您看到了大量的时钟调用,但这并不意味着它们是占用时间最多的系统调用,我认为这与GC、实际执行IO等有关。

    虽然这不是问题的解决方案,但您是否查看了用于分析的标准?您是否正在运行分析?配置文件做了额外的工作。@GarethR:我确保在没有配置文件的情况下运行,甚至创建了一个新的阴谋集团沙箱来确保这一点。
    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>