[isabelle-dev] Unresponsive Isabelle/jEdit
Makarius
makarius at sketis.net
Tue Apr 1 23:20:51 CEST 2014
On Tue, 1 Apr 2014, Johannes Hölzl wrote:
> Currently I have the problem that when opening a file in
> Multivariate_Analysis it can take quite some time until the theories it
> depends on are loaded. In this time I/jEdit does not respond to mouse or
> keyboard input.
>
> I tried to bisect the recent changes, and the problem seams to be appear
> with the changeset
>
> 0fc032898b05: back to cumulative treatment of command status, which is
> important for total accounting (amending
> 8201790fdeb9);).
Thanks for keeping an eye on it, and doing the bisection already.
At first I did not believe the result, because 0fc032898b05 looks quite
innocent. Some hours later, I realized that the use of local value
definition within a 'for' comprehension always entails a 'yield', which
means there is a potentially expensive map of the whole structure involved
("The Scala Language Specification Version 2.9", section 6.19).
The following changeset adddresses that:
# HG changeset patch
# User wenzelm
# Date 1396383901 -7200
# Tue Apr 01 22:25:01 2014 +0200
# Node ID 1a9f569b5b7e16760fc419df8f17e7216be795c7
# Parent a6f8c3566560fd9e8955c7240f4ac19cdc9e037d
some rephrasing to ensure that this becomes cheap "foreach" and not expensive "map" (cf. 0fc032898b05);
diff -r a6f8c3566560 -r 1a9f569b5b7e src/Pure/PIDE/protocol.scala
--- a/src/Pure/PIDE/protocol.scala Tue Apr 01 20:22:25 2014 +0200
+++ b/src/Pure/PIDE/protocol.scala Tue Apr 01 22:25:01 2014 +0200
@@ -114,11 +114,11 @@
var finished = 0
var warned = 0
var failed = 0
- for {
- command <- node.commands
- states = state.command_states(version, command)
- status = command_status(states.iterator.flatMap(st => st.status.iterator))
- } {
+ for { command <- node.commands }
+ {
+ val states = state.command_states(version, command)
+ val status = command_status(states.iterator.flatMap(st => st.status.iterator))
+
if (status.is_running) running += 1
else if (status.is_finished) {
val warning = states.exists(st => st.results.entries.exists(p => is_warning(p._2)))
The node.commands structure contains all command spans of the theory,
which can be quite substantial especially in Multivariate_Analysis. The
plain iteration over the structure is already a bit slow, but a few
redundant maps of it can be deadly to real-time performance.
Makarius
More information about the isabelle-dev
mailing list