<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi,<div class=""><br class=""></div><div class="">yes, I already felt that test runs involving unlogged code generation is very slow… can you add an entry on the issue tracker?</div><div class=""><br class=""></div><div class=""><div><blockquote type="cite" class=""><div class="">On 26 Oct 2015, at 13:14, Peter Uhnák <<a href="mailto:i.uhnak@gmail.com" class="">i.uhnak@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">Thanks Nicolai, the suspension seems to have quite a significant performance impact.</div><div class=""><br class=""></div><div class="">Out of curiosity I did some benchmarking. Although the numbers seems to vary a lot based on something (the size of the image jumped from 25 to 40MB after I was done... and there seems to be some correlation with the performance). Repeatedly running a benchmark seems also detrimental as the performance can drop by over 30%... so probably it would be best to run each benchmark in a completely new image...</div><div class="">However the fact that the performance decreases over time is problematic, because that means that running the test suite will get worse over time.</div><div class=""><br class=""></div><div class="">I find it also peculiar to see that unlogged anonymous classes are faster when the announcer is NOT suspended.</div><div class=""><br class=""></div><div class="">And while for classes the improvement was ~40x, for methods it was over 200x faster... so I guess the best way is to modify performTest behavior to something like</div><div class=""><br class=""></div><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br class=""></div><div class="">MyTestClass>>performTest</div><div class=""><span style="white-space:pre" class="">  </span>SystemAnnouncer uniqueInstance suspendAllWhile: [ super performTest ]</div><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Benchmarks (I've removed decimal parts and thousand separators because they are always confusing me):</div><div class=""><br class=""></div><div class="">Class creation with announcer:</div><div class=""><br class=""></div><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br class=""></div><div class=""><div class="">[ |cls|</div><div class=""><span class="" style="white-space:pre">    </span>cls := Object subclass: #Something.</div><div class=""><span class="" style="white-space:pre">     </span>cls removeFromSystem.</div><div class="">] bench. "'9 per second'"</div><div class=""><br class=""></div><div class="">[ |cls|</div><div class=""><span class="" style="white-space:pre">      </span>cls := Object subclass: #Something.</div><div class=""><span class="" style="white-space:pre">     </span>cls removeFromSystemUnlogged.</div><div class="">] bench. "'173 per second'"</div><div class=""><br class=""></div><div class="">[ |cls|</div><div class=""><span class="" style="white-space:pre">    </span>cls := Object newAnonymousSubclass.</div><div class=""><span class="" style="white-space:pre">     </span>cls removeFromSystem.</div><div class="">] bench. "'4 per second'"</div><div class=""><br class=""></div><div class="">[ |cls|</div><div class=""><span class="" style="white-space:pre">      </span>cls := Object newAnonymousSubclass.</div><div class=""><span class="" style="white-space:pre">     </span>cls removeFromSystemUnlogged.</div><div class="">] bench. "'512 per second'"</div></div><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div><div class=""><br class=""></div><div class="">Class creation without announcer:<br class=""></div><div class=""><br class=""></div><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div><div class=""><div class="">[ SystemAnnouncer uniqueInstance suspendAllWhile: [ |cls|</div><div class=""><span class="" style="white-space:pre"> </span>cls := Object subclass: #Something.</div><div class=""><span class="" style="white-space:pre">     </span>cls removeFromSystem.</div><div class="">] ] bench. "'371 per second'"</div><div class=""><br class=""></div><div class="">[ SystemAnnouncer uniqueInstance suspendAllWhile: [ |cls|</div><div class=""><span class="" style="white-space:pre">        </span>cls := Object subclass: #Something.</div><div class=""><span class="" style="white-space:pre">     </span>cls removeFromSystemUnlogged.</div><div class="">] ] bench. "'351 per second'"</div><div class=""><br class=""></div><div class="">[ SystemAnnouncer uniqueInstance suspendAllWhile: [ |cls|<span class="" style="white-space:pre">  </span></div><div class=""><span class="" style="white-space:pre">        </span>cls := Object newAnonymousSubclass.</div><div class=""><span class="" style="white-space:pre">     </span>cls removeFromSystem.</div><div class="">] ] bench. "'368 per second'"</div><div class=""><br class=""></div><div class="">[ SystemAnnouncer uniqueInstance suspendAllWhile: [ |cls|</div><div class=""><span class="" style="white-space:pre">        </span>cls := Object newAnonymousSubclass.</div><div class=""><span class="" style="white-space:pre">     </span>cls removeFromSystemUnlogged.</div><div class="">] ] bench. "'430 per second'"</div></div><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div><div class=""><br class=""></div><div class="">Methods with announcer:</div><div class=""><br class=""></div><div class=""><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div></div><div class="">cls := Object subclass: #Something.<br class=""></div><div class=""><div class="">[</div><div class=""><span class="" style="white-space:pre">  </span>cls compile: 'method ^ 1'.</div><div class="">] bench. "'9 per second'"</div><div class=""><br class=""></div><div class="">anon := Object newAnonymousSubclass.</div><div class="">[</div><div class=""><span class="" style="white-space:pre"> </span>anon compile: 'method ^ 1'.</div><div class="">] bench. "'9 per second'"</div><div class=""><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div></div></div><div class=""><br class=""></div><div class="">Methods without announcer</div><div class=""><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div></div><div class=""><div class="">cls := Object subclass: #Something.</div><div class="">[ SystemAnnouncer uniqueInstance suspendAllWhile: [</div><div class=""><span class="" style="white-space:pre">      </span>cls compile: 'method ^ 1'.</div><div class="">] ] bench. "'1814 per second'"</div><div class=""><br class=""></div><div class="">anon := Object newAnonymousSubclass.</div><div class="">[ SystemAnnouncer uniqueInstance suspendAllWhile: [</div><div class=""><span class="" style="white-space:pre">  </span>anon compile: 'method ^ 1'.</div><div class="">] ] bench. "'2063 per second'"</div></div><div class=""><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div></div><div class=""><br class=""></div><div class="">Peter</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Sun, Oct 25, 2015 at 12:29 AM, Robert Withers <span dir="ltr" class=""><<a href="mailto:robert.w.withers@gmail.com" target="_blank" class="">robert.w.withers@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto" class=""><div class="">Extend Pharo byte codes to support Newspeak namespaces. #justsayin<br class=""><br class="">---<div class="">robert</div></div><div class=""><div class="h5"><div class=""><br class="">On Oct 24, 2015, at 6:22 PM, Nicolai Hess <<a href="mailto:nicolaihess@gmail.com" target="_blank" class="">nicolaihess@gmail.com</a>> wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div dir="ltr" class="">You can wrap the subclassing and the \removeFromSystem with<br class="">SystemAnnouncer uniqueInstance  suspendAllWhile: [ ]<br class=""></div><div class="gmail_extra"><br class=""><div class="gmail_quote">2015-10-24 20:43 GMT+02:00 Peter Uhnák <span dir="ltr" class=""><<a href="mailto:i.uhnak@gmail.com" target="_blank" class="">i.uhnak@gmail.com</a>></span>:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">Hi,<div class=""><br class=""></div><div class="">is it possible to do fast, non-system wide class subclassing in tests?</div><div class=""><br class=""></div><div class="">Currently I would do something like</div><div class=""><br class=""></div><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div><div class="">MyTest>>testSomething</div><div class="">    cls := SomeParent subclass: #Something.</div><div class="">    "... do some tests ..."</div><div class="">    cls removeFromSystem</div><div class="">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</div><div class=""><br class=""></div><div class="">This is for example what ClassTest is doing.</div><div class=""><br class=""></div><div class="">However this is very slow, and even for small tests suite --- just ten (so far) test methods it takes over ten seconds to test it all, which is quite bad for TDD.</div><div class=""><br class=""></div><div class="">My guess is that since it has to write to class to the environment and disk and then remove it it takes a while:</div><div class=""><br class=""></div><div class="">~~~~~~~~~~~~~</div><div class=""><div class="">[ Object subclass: #Something ] timeToRun. "0:00:00:00.021"</div><div class="">[ #Something asClass removeFromSystem ] timeToRun. "0:00:00:00.526"</div></div><div class="">~~~~~~~~~~~~~<br class=""></div><div class=""><br class=""></div><div class="">is it possible to speed it up? Create classes that are fast to remove?</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Peter</div></div>
</blockquote></div><br class=""></div>
</div></blockquote></div></div></div></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></body></html>