我发现如果选项MatrixPlot
存在,ClickPane
中的FrameTicks -> Automatic
导致我的某个处理器核心的活动周期大约为50%。我已将代码减少到以下(实际上没有做任何事情):
a = ConstantArray[0, {2, 11}];
ClickPane[
Dynamic@
MatrixPlot[a, FrameTicks -> Automatic],
# &
]
切换到FrameTicks -> None
会停止核心活动。
要研究处理器行为,我每20秒在Clock
和None
之间设置一个Automatic
周期(首先删除上面的ClickPane):
ClickPane[
Dynamic@
MatrixPlot[a, FrameTicks -> ft],
# &
]
Dynamic[ft = {Automatic, None}[[Clock[{1, 2, 1}, 20]]]]
这为我提供了以下处理器活动显示:
这是在我的Win7-64 / MMA 8.0.1系统上。
我的问题是:
MatrixPlot[a]
(没有任何FrameTicks
设置)有这些奇怪的帧勾选?
答案 0 :(得分:4)
Win XP Mma 8.0
错过的峰值对应于笔记本被另一个窗口隐藏的时间。失去焦点不会阻止CPU耗尽。
答案 1 :(得分:4)
似乎Automatic
选项的FrameTicks
设置更改了Dynamic
可以看到的内部变量。显然(我认为是错误的)没有本地化。这导致完全重新评估Dynamic
的参数。
解决方法将添加Refresh
,这样可以使用TrackedSymbols
,这样我们就可以将触发限制为我们感兴趣的变量,此案例数组a
和FrameTicks
选项值ft
:
ClickPane[
Dynamic@
Refresh[
MatrixPlot[a, FrameTicks -> ft],
TrackedSymbols -> {a, ft}],
# &
]
Dynamic[ft = {Automatic, None}[[Clock[{1, 2, 1}, 20]]]]
我的处理器状态现在保持接近零。
答案 2 :(得分:2)
在Mac OS X 10.6,Mathematica 8.0.1上也得到了证实。
我一开始认为,每次设置FrameTicks->Automatic
选项时,这都与内核不得不重新计算刻度线的位置有关。
所以我尝试了这个并获得了相同的结果。同样适用于ArrayPlot
。
With[{fta = FrameTicks /.
FullForm[MatrixPlot[a, FrameTicks -> Automatic]][[1, 4]]},
ClickPane[Dynamic@MatrixPlot[a, FrameTicks -> ft], # &]
Dynamic[ft = {fta, None}[[Clock[{1, 2, 1}, 20]]]] ]
但不是这个情节 - 两个州之间的CPU使用率几乎没有变化。:
ClickPane[
Dynamic@Plot[Sin[x], {x, 0, 6 Pi}, Frame -> True,
FrameTicks -> ft], # &]
Dynamic[ft = {Automatic, None}[[Clock[{1, 2, 1}, 20]]]]
我只能猜测FrameTicks
在这些栅格类型的情节中显示的方式一定效率不高。
在回答您的第三个问题时,奇怪的选择不会在我的系统上重现。