Hi Shaping, > On May 18, 2020, at 6:52 PM, Shaping <shap...@uurda.org> wrote: > > > 1. Double-click text selection in both Squeak and Pharo shows a 75-100 ms > latency (eye-balled, estimated) between end of double click (button up on > second click) and time of highlighting of selected text. It could be as low > as 60 ms, but I doubt it, and that’s still too long. I can’t track the > latency in VW 8.3.2. It’s too short, probably 30 ms or less, and is under my > noise floor. Notepad latencies are even lower. The difference between VW > and Notepad is not enough to complain about. Neither is noticeable in > passing. The difference between VW and Pharo/Squeak latencies is a little > painful/distracting. It’s very much in your face, and you are keenly aware > that you are waiting for something to happen before you can resume your > thoughts about the code. > > 2. Stepping in the Pharo debugger is slow (Squeak is fine). The latencies > between the step-click event and selection of the next evaluable is a solid > 100 ms (again estimated). Feels more like 150-175 ms much of the time. This > is actually hard to work with. > > Neither of these unequivocally demonstrates VM performance. > > I know. This comment is not about the VM. VM performance is another issue. > This comment is only about general usability as a function of the latencies, > whatever the cause. > > Both are more likely to derive from overall GUI architecture. > > Yup. > > In particular, VW’s display architecture is a direct stimulus-response i/o > model where input results in a transformation producing immediate rendering, > whereas Morphic is an animation architecture where input results in a new > state but no rendering. The Morphic GUI is rendered separately on every > “step” of the system. > > Okay. > > Hence graphics output necessarily lags input on Morphic. So these speed > differences have nothing to do with vm performance and everything to do with > GUI architecture. > > Both Squeak and Pharo show the same delay for text selection latency. The > architecture difference is not likely causing that.
Given that both Pharo and Squeak useorphic and hence nothing have the same tender-in-step architecture isn’t the fact that they show the sane performance issue evidence that points to precisely this being the cause? > How do we index or look up the word rectangle to render? I’m think that is > more likely the cause. Is a map created at method compile time and updated > after text is moved during edits? My understanding is that damage rectangles are retrieved, combined to produce a smaller (non-overlapping?) set, and that the entire morph tree is asked to render within these damage rectangles. You can read the gods for yourself. > Where is VisualWorks significantly faster than either Squeak or Pharo? > > VW 8.3.2 faster: > > 1. Text selection. > > 2. Repeat-key rate in VW is smoother (not perfect; I see a few pauses). > Pharo’s repeat-key rate is the same or a little slower, there are more > pauses, and distribution of those pause-times is slightly wider for Pharo 9, > as if event flow isn’t as smooth as it could be (because text/cursor > rendering is a not efficient?). This is a minor issue, not a practical > problem. I did the test in a workspace in both cases. > > > Pharo 9 same or faster: > > Everything else in the GUI, like window openings/closings, menu > openings/closings work at nearly the same speed, or Pharo 9 is faster. > > Opening a system browser in VW 8.3.2 and Pharo 9 takes about the same time. > If you scrutinize, you can see that Pharo system browser open times are often > about 2/3 to 4/5 of the VW times. This action is never faster in VW. > > Popup menus in Pharo 9 are noticeably faster than those in VW 8.3.2. > Instant--delightful. > > > Specifically which VisualWorks VM or lower level facilities are much faster > than the Cog VM? Do you have benchmarks? > > No, I don’t, but I find the subject interesting, and would like to pursue it. > I’m trying to get some pressing work done in VW (as I contemplate jumping > ship to Pharo/Squeak). It’s not a good time for excursions, but here I am > playing with Squeak/Pharo, anyway. I want to dig deeper at some future date. > > Do you have a specific procedure you like to use when benchmarking the VW VM? > > Any VM. Express the benchmark as a block. If the benchmark is not trying to > measure JIT and/or GC overhead then before the block is run make sure to put > the vm in some initialized state wrt hitting and/or GC, eg by voiding the JIT > code cache, > > How is the JIT code cache cleared? Dialect dependent. In Squeak/Pharo/Cuis IIRC Smalltalk voidCogVMState. Can’t remember how it’s done in VW. > and/or forcing a scavenge or a global GC. Then run the block twice, > reporting it’s second iteration, to ensure all code is JITted. > > Okay, so the above procedure tests execution-engine efficiency apart from JIT > and GC efficiency. > > If attempting to measure JIT and/or GC overhead then do the same wet getting > the vm to some baseline consistent initial state > > Baseline state: the only thing that comes to mind here is Collect All > Garbage. There’s also Smalltalk garbageCollectMost which just runs a scavenge. IIRC someInstance has a side effect of running a scavenge in VW. > > and then ensure, through the relevant introspection primitives, > > What are these? What state features am I introspecting after the test? > Sizes of heap subspaces? I can do Time microsecondsToRun: on the blocks. In Squeak/Pharo/Cuis see Smalltalk vmParameterAt: or Smalltalk vm parameterAt: and senders. > that after the benchmark has run the events desired to be benchmarked have > actually taken place. > > I’m thinking most checks on state will involve running more Smalltalk, not > just primitives. > > If a micobenchmark then ensure that eg loop, block invocation, arithmetic, > overheads are either minimised wrt the code being benchmarked or subtracted > from the code being benchmarked. > > Okay. > > i.e. make sure the benchmark is repeatable (benchmark an initial used state). > make sure the benchmark measures what is intended to be benchmarked and not > some overhead. > > Right. I don’t see how to guarantee some known starting state except to > collect all garbage. See answers above. > Shaping