[squeak-dev] Exhuberant use of massive Traits on many sublcasses has an adverse effect on Monticello Performance

gettimothy gettimothy at zoho.com
Tue Jun 17 20:50:23 UTC 2014


Hi all.



At least I think its the Trait.


In CMakeVMakerSqueak, I am (ab)using a Trait to enforce pseudo-abstract base class behavior. Everything is fine in my development environment. There is some sluggishness when adding a new method or updating a Trait method as that change has to 'percolate' to all the classes (that would be most of them) in the CMakeVMMakerSqueak package. For a coding idiom, it works very nicely as it enforces implementation discipline.


Today, I updated the Cog SVN tree locally and retested the install scripts I use and the CMakeVMMakerSqueak-tty.63 appeared to hang on installation into a fresh 4.5 image. I thought at first that I broke something, 
so, I started importing from -tty.20 forward and I noticed that at -tty32, loading became very slow.



I am currently loaded -tty.52 and performance is un-acceptable. I think it is the Trait!


I know that Traits are to be used as "little plugins" to attach to "the side" of a thing--I call it "sideways abstract base class" stuff, and that is what I have done. Only, I have done it on a massive scale. How massive?


Well, here are the methods I am setting as must be overridden in ~150 subclasses.


('accessing' executableName executableType frameworks generate generateLicense generatePluginsList linkFlags version)
('cmake configuration' availableBuilds buildType: configureBuild configureBuildAssert configureBuildAssertITimerHeartbeat configureBuildDebug configureBuildDebugITimerHeartbeat configureBuildDebugMultiThreaded configureBuildIHeartbeatTimer configureBuildMultiThreaded configureBuildMultiThreadedAssert configureBuildMultiThreadedDebug configureForBuildType: configureNoBuildType excludeFromBuild)
('cmake config build type ' compilerFlagsAssert compilerFlagsAssertITimerHeartbeat compilerFlagsBuild compilerFlagsDebug compilerFlagsDebugITimerHeartbeat compilerFlagsIHeartbeatTimer compilerFlagsMultiThreaded compilerFlagsMultiThreadedAssert compilerFlagsMultiThreadedDebug compilerFlagsNoBuildType externalPluginsBuild externalPluginsBuildAssert externalPluginsBuildAssertITimerHeartbeat externalPluginsBuildDebug externalPluginsBuildDebugITimerHeartbeat externalPluginsBuildITimerHeartbeat externalPluginsBuildMultiThreaded externalPluginsBuildMultiThreadedAssert externalPluginsBuildMultiThreadedDebug externalPluginsBuildNone internalPluginsBuild internalPluginsBuildAssert internalPluginsBuildAssertITimerHeartbeat internalPluginsBuildDebug internalPluginsBuildDebugITimerHeartbeat internalPluginsBuildITimerHeartbeat internalPluginsBuildMultiThreaded internalPluginsBuildMultiThreadedAssert internalPluginsBuildMultiThreadedDebug internalPluginsBuildNone preferredIncludesBuild preferredIncludesBuildAssert preferredIncludesBuildAssertITimerHeartbeat preferredIncludesBuildDebug preferredIncludesBuildDebugITimerHeartbeat preferredIncludesBuildITimerHeartbeat preferredIncludesBuildMultiThreaded preferredIncludesBuildMultiThreadedAssert preferredIncludesBuildMultiThreadedDebug preferredIncludesBuildNone setExtraTargetPropertiesBuild: setExtraTargetPropertiesBuildAssert: setExtraTargetPropertiesBuildAssertITimerHeartbeat: setExtraTargetPropertiesBuildDebug: setExtraTargetPropertiesBuildDebugITimerHeartbeat: setExtraTargetPropertiesBuildITimerHeartbeat: setExtraTargetPropertiesBuildMultiThreaded: setExtraTargetPropertiesBuildMultiThreadedAssert: setExtraTargetPropertiesBuildMultiThreadedDebug: setExtraTargetPropertiesBuildNone: setGlobalOptionsAfterDetermineSystemBuild: setGlobalOptionsAfterDetermineSystemBuildAssert: setGlobalOptionsAfterDetermineSystemBuildAssertITimerHeartbeat: setGlobalOptionsAfterDetermineSystemBuildDebug: setGlobalOptionsAfterDetermineSystemBuildDebugITimerHeartbeat: setGlobalOptionsAfterDetermineSystemBuildITimerHeartbeat: setGlobalOptionsAfterDetermineSystemBuildMultiThreaded: setGlobalOptionsAfterDetermineSystemBuildMultiThreadedAssert: setGlobalOptionsAfterDetermineSystemBuildMultiThreadedDebug: setGlobalOptionsAfterDetermineSystemBuildNone setGlobalOptionsBuild: setGlobalOptionsBuildAssert: setGlobalOptionsBuildAssertITimerHeartbeat: setGlobalOptionsBuildDebug: setGlobalOptionsBuildDebugITimerHeartbeat: setGlobalOptionsBuildITimerHeartbeat: setGlobalOptionsBuildMultiThreaded: setGlobalOptionsBuildMultiThreadedAssert: setGlobalOptionsBuildMultiThreadedDebug: setGlobalOptionsBuildNone: standardIncludesBuild standardIncludesBuildAssert standardIncludesBuildAssertITimerHeartbeat standardIncludesBuildDebug standardIncludesBuildDebugITimerHeartbeat standardIncludesBuildITimerHeartbeat standardIncludesBuildMultiThreaded standardIncludesBuildMultiThreadedAssert standardIncludesBuildMultiThreadedDebug standardIncludesBuildNone thirdpartyLibsBuild thirdpartyLibsBuildAssert thirdpartyLibsBuildAssertITimerHeartbeat thirdpartyLibsBuildDebug thirdpartyLibsBuildDebugITimerHeartbeat thirdpartyLibsBuildITimerHeartbeat thirdpartyLibsBuildMultiThreaded thirdpartyLibsBuildMultiThreadedAssert thirdpartyLibsBuildMultiThreadedDebug thirdpartyLibsBuildNone)
('cmake directory ' dirARMv6 dirAndroid dirBSD32x86 dirBuild dirBuildAssert dirBuildAssertITimerHeartbeat dirBuildDebug dirBuildDebugITimerHeartbeat dirBuildDebugMultiThreaded dirBuildITimerHeartbeat dirBuildLanguageVMMM dirBuildMultiThreaded dirBuildMultiThreadedAssert dirBuildMultiThreadedDebug dirBuildPlatform dirIA32Bochs dirIOS dirInstall dirLinux32Armv6 dirLinux32x86 dirLinux32x8664 dirMacOS dirMacOSPowerPC dirMacOSX32x86 dirOutput dirSource dirSunOS32x86 dirWin32x86 newspeakCogSpur newspeakCogV3 newspeakSistaSpur newspeakSistaV3 newspeakStackSpur newspeakStackV3 oscogvm outputDirName squeakCogSpur squeakCogV3 squeakSistaSpur squeakSistaV3 squeakStackSpur squeakStackV3)
('cmake executable names' eventStackV3 vmCogExecutableName vmSistaExecutableName vmStackExecutableName)
('compiler flags' commonCompilerFlags compilerFlags)
('headers generation' configH configHBuild configHBuildAssert configHBuildAssertITimerHeartbeat configHBuildDebug configHBuildDebugITimerHeartbeat configHBuildITimerHeartbeat configHBuildMultiThreaded configHBuildMultiThreadedAssert configHBuildMultiThreadedDebug configHNoBuildType generateConfigH generateConfigH:)
('plugin extra rules' extraPluginSettings:)
('settings' extraVMSettings:)
('source files' preferredIncludes)
('source generation' cogitClass interpreterClass prepareForGeneration)
('squeak compatibility' buildDir buildDirName dirFrom: outputDir setupDirectories: srcDir topDir validateSourcesPresent write:toFile:)
('utils' setExtraTargetProperties: setGlobalOptions: setGlobalOptions:buildType: setGlobalOptionsAfterDetermineSystem:buildType:)
('cmake configurations')




 
So, I have a big-ass Trait, used by ~150 subclasses and I "think" that is what is taking the long install time.




Now, you are thinking to yourself, 'tty! what the heck where you thinking!" Good question! This CMakeVMMaker port to squeak is NOT to be a fork. The existing CMakeVMaker inheritence tree precluded me from interjecting a thin SqueakCompatibility class under CPlatformConfig.
So, I used a Trait to to get the same effect. As it became apparent that the Squeak implementation required more functionality than the Pharo implementation has, the Trait grew and grew..




Anyway, the point of the email is to let people know that Massive Traits used with Wild Abandon have and adverse effect on Monticello Performance








cheers,



tty

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20140617/464d770a/attachment.htm


More information about the Squeak-dev mailing list