Display the execution times for each goal of a predicate clause

前端 未结 3 493
遇见更好的自我
遇见更好的自我 2021-01-13 04:21

I want to see the execution time inside goals of predicate with SICStus Prolog.

Example :

pred :-
   goal1,
   time         


        
相关标签:
3条回答
  • 2021-01-13 04:22

    You can use statistics/2 for that:

    statistics(runtime,[Start|_]),
    do_something,
    statistics(runtime,[Stop|_]),
    Runtime is Stop - Start.
    

    Alternatively, you can use total_runtime instead of runtime if you want to include time for garbage collection. Start and Stop are measured in milliseconds, but the last time I used it with SICStus it returned only multiple of 10. In a project we used calls to a custom external C library to retrieve a finer resolution.

    A remark to time_out/3: It is used to limit the runtime of a goal, not to measure its runtime. If the goal finishes in time, the result is success, if it needs more time the execution is aborted (internally a timeout exception is thrown) and the result is timeout.

    0 讨论(0)
  • 2021-01-13 04:41

    Since nobody mentioned it, if you only want a time display the time/1 predicate can be also useful. It is already supported by a couple of Prolog systems such as SWI-Prolog, Jekejeke Prolog, O-Prolog, etc...:

    Welcome to SWI-Prolog (threaded, 64 bits, version 7.7.19)
    
    ?- time((between(1,10000000,_), fail; true)).
    % 10,000,001 inferences, 0.453 CPU in 0.468 seconds (97% CPU, 22068968 Lips)
    true.
    

    Unfortunately Prolog systems such as GNU Prolog, SICStus Prolog dont support it. But its the analog of the Unix time command, in that it is a meta predicate that takes a goal argument. Better than stone age methods.

    0 讨论(0)
  • 2021-01-13 04:48

    I'd like to add two thoughts:

    1. Prolog allows for backtracking, so goals may succeed more than once.

      What's the "runtime" you are interested in?

      • Only the work for computing the previous answer?
      • Or rather the total time?
    2. Use statistics/2, but don't do it directly. Instead, use an abstraction like call_time/2.

    Sample query:

    ?- call_time((permutation([a,b,c,d,e,f,g,h,i],Xs),Xs=[_,_,g,f,e,d,c,b,a]), T_ms).
       Xs = [h, i, g, f, e, d, c, b, a], T_ms = 304
    ;  Xs = [i, h, g, f, e, d, c, b, a], T_ms = 345
    ;  false.
    

    Notice that call_time/2 succeeds twice and T_ms measures total runtime up to this point.

    0 讨论(0)
提交回复
热议问题