154
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 1
theory Timing
346
+ − 2
imports "../Appendix"
154
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 3
begin
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 4
565
+ − 5
section \<open>Measuring Time\label{rec:timing}\<close>
154
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 6
565
+ − 7
text \<open>
154
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 8
{\bf Problem:}
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 9
You want to measure the running time of a tactic or function.\smallskip
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 10
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 11
{\bf Solution:} Time can be measured using the function
460
+ − 12
@{ML start in Timing} and @{ML result in Timing}.\smallskip
154
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 13
191
+ − 14
Suppose you defined the Ackermann function on the Isabelle level.
565
+ − 15
\<close>
154
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 16
155
+ − 17
fun
168
+ − 18
ackermann:: "(nat \<times> nat) \<Rightarrow> nat"
155
+ − 19
where
+ − 20
"ackermann (0, n) = n + 1"
+ − 21
| "ackermann (m, 0) = ackermann (m - 1, 1)"
+ − 22
| "ackermann (m, n) = ackermann (m - 1, ackermann (m, n - 1))"
+ − 23
565
+ − 24
text \<open>
168
+ − 25
You can measure how long the simplifier takes to verify a datapoint
191
+ − 26
of this function. The actual timing is done inside the
175
+ − 27
wrapper function:
565
+ − 28
\<close>
167
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 29
565
+ − 30
ML %linenosgray\<open>fun timing_wrapper tac st =
167
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 31
let
460
+ − 32
val t_start = Timing.start ();
167
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 33
val res = tac st;
460
+ − 34
val t_end = Timing.result t_start;
167
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 35
in
460
+ − 36
(writeln (Timing.message t_end); res)
565
+ − 37
end\<close>
167
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 38
565
+ − 39
text \<open>
+ − 40
Note that this function, in addition to a tactic, also takes a state \<open>st\<close> as argument and applies this state to the tactic (Line 4). The reason is that
175
+ − 41
tactics are lazy functions and you need to force them to run, otherwise the
191
+ − 42
timing will be meaningless. The simplifier tactic, amongst others, can be
+ − 43
forced to run by just applying the state to it. But ``fully'' lazy tactics,
569
+ − 44
such as @{ML \<open>resolve_tac\<close>}, need even more ``standing-on-ones-head'' to force
191
+ − 45
them to run.
+ − 46
+ − 47
The time between start and finish of the simplifier will be calculated
+ − 48
as the end time minus the start time. An example of the
175
+ − 49
wrapper is the proof
565
+ − 50
\<close>
154
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 51
155
+ − 52
lemma "ackermann (3, 4) = 125"
565
+ − 53
apply(tactic \<open>
+ − 54
timing_wrapper (simp_tac (@{context} addsimps @{thms "eval_nat_numeral"}) 1)\<close>)
155
+ − 55
done
154
e81ebb37aa83
updated to repository version; added a section about timing
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
+ − 56
565
+ − 57
text \<open>
185
+ − 58
where it returns something on the scale of 3 seconds. We chose to return
168
+ − 59
this information as a string, but the timing information is also accessible
+ − 60
in number format.
167
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 61
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 62
\begin{readmore}
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 63
Basic functions regarding timing are defined in @{ML_file
460
+ − 64
"Pure/General/timing.ML"} (for the PolyML compiler). Some more
167
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 65
advanced functions are defined in @{ML_file "Pure/General/output.ML"}.
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 66
\end{readmore}
565
+ − 67
\<close>
167
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 68
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 69
3e30ea95c7aa
added temporarily some timing test about conversions and simprocs
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 70
456
+ − 71
end