Hi, yes, I already felt that test runs involving unlogged code generation is very slow… can you add an entry on the issue tracker?
> On 26 Oct 2015, at 13:14, Peter Uhnák <i.uh...@gmail.com> wrote: > > Thanks Nicolai, the suspension seems to have quite a significant performance > impact. > > 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... > However the fact that the performance decreases over time is problematic, > because that means that running the test suite will get worse over time. > > I find it also peculiar to see that unlogged anonymous classes are faster > when the announcer is NOT suspended. > > 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 > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > MyTestClass>>performTest > SystemAnnouncer uniqueInstance suspendAllWhile: [ super performTest ] > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > > Benchmarks (I've removed decimal parts and thousand separators because they > are always confusing me): > > Class creation with announcer: > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > [ |cls| > cls := Object subclass: #Something. > cls removeFromSystem. > ] bench. "'9 per second'" > > [ |cls| > cls := Object subclass: #Something. > cls removeFromSystemUnlogged. > ] bench. "'173 per second'" > > [ |cls| > cls := Object newAnonymousSubclass. > cls removeFromSystem. > ] bench. "'4 per second'" > > [ |cls| > cls := Object newAnonymousSubclass. > cls removeFromSystemUnlogged. > ] bench. "'512 per second'" > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > Class creation without announcer: > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > [ SystemAnnouncer uniqueInstance suspendAllWhile: [ |cls| > cls := Object subclass: #Something. > cls removeFromSystem. > ] ] bench. "'371 per second'" > > [ SystemAnnouncer uniqueInstance suspendAllWhile: [ |cls| > cls := Object subclass: #Something. > cls removeFromSystemUnlogged. > ] ] bench. "'351 per second'" > > [ SystemAnnouncer uniqueInstance suspendAllWhile: [ |cls| > cls := Object newAnonymousSubclass. > cls removeFromSystem. > ] ] bench. "'368 per second'" > > [ SystemAnnouncer uniqueInstance suspendAllWhile: [ |cls| > cls := Object newAnonymousSubclass. > cls removeFromSystemUnlogged. > ] ] bench. "'430 per second'" > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > Methods with announcer: > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > cls := Object subclass: #Something. > [ > cls compile: 'method ^ 1'. > ] bench. "'9 per second'" > > anon := Object newAnonymousSubclass. > [ > anon compile: 'method ^ 1'. > ] bench. "'9 per second'" > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > Methods without announcer > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > cls := Object subclass: #Something. > [ SystemAnnouncer uniqueInstance suspendAllWhile: [ > cls compile: 'method ^ 1'. > ] ] bench. "'1814 per second'" > > anon := Object newAnonymousSubclass. > [ SystemAnnouncer uniqueInstance suspendAllWhile: [ > anon compile: 'method ^ 1'. > ] ] bench. "'2063 per second'" > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > Peter > > On Sun, Oct 25, 2015 at 12:29 AM, Robert Withers <robert.w.with...@gmail.com > <mailto:robert.w.with...@gmail.com>> wrote: > Extend Pharo byte codes to support Newspeak namespaces. #justsayin > > --- > robert > > On Oct 24, 2015, at 6:22 PM, Nicolai Hess <nicolaih...@gmail.com > <mailto:nicolaih...@gmail.com>> wrote: > >> You can wrap the subclassing and the \removeFromSystem with >> SystemAnnouncer uniqueInstance suspendAllWhile: [ ] >> >> 2015-10-24 20:43 GMT+02:00 Peter Uhnák <i.uh...@gmail.com >> <mailto:i.uh...@gmail.com>>: >> Hi, >> >> is it possible to do fast, non-system wide class subclassing in tests? >> >> Currently I would do something like >> >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> MyTest>>testSomething >> cls := SomeParent subclass: #Something. >> "... do some tests ..." >> cls removeFromSystem >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> >> This is for example what ClassTest is doing. >> >> 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. >> >> My guess is that since it has to write to class to the environment and disk >> and then remove it it takes a while: >> >> ~~~~~~~~~~~~~ >> [ Object subclass: #Something ] timeToRun. "0:00:00:00.021" >> [ #Something asClass removeFromSystem ] timeToRun. "0:00:00:00.526" >> ~~~~~~~~~~~~~ >> >> is it possible to speed it up? Create classes that are fast to remove? >> >> Thanks, >> Peter >> >