diff --git a/.properties b/.properties new file mode 100644 index 00000000..53a54544 --- /dev/null +++ b/.properties @@ -0,0 +1,3 @@ +{ + #format : #tonel +} diff --git a/.squot b/.squot index fc4d5b3d..119585ba 100644 --- a/.squot +++ b/.squot @@ -21,5 +21,6 @@ OrderedDictionary { 'packages/Sandblocks-Graph' : #SquotTonelSerializer, 'packages/Sandblocks-RatPack' : #SquotTonelSerializer, 'packages/Sandblocks-Plugin-StLivePreview' : #SquotTonelSerializer, - 'packages/Sandblocks-Git' : #SquotTonelSerializer + 'packages/Sandblocks-Git' : #SquotTonelSerializer, + 'Joana-Core' : #SquotTonelSerializer } \ No newline at end of file diff --git a/Joana-Core/.squot-contents b/Joana-Core/.squot-contents new file mode 100644 index 00000000..e93fbb77 --- /dev/null +++ b/Joana-Core/.squot-contents @@ -0,0 +1,6 @@ +SquotTrackedObjectMetadata { + #objectClassName : #PackageInfo, + #id : UUID [ 'd25f57670bf5c440b225a46d41670b53' ], + #objectsReplacedByNames : true, + #serializer : #SquotTonelSerializer +} \ No newline at end of file diff --git a/Joana-Core/CustomHashSet.class.st b/Joana-Core/CustomHashSet.class.st new file mode 100644 index 00000000..01a1182e --- /dev/null +++ b/Joana-Core/CustomHashSet.class.st @@ -0,0 +1,19 @@ +Class { + #name : #CustomHashSet, + #superclass : #Set, + #category : #'Joana-Core' +} + +{ #category : #'as yet unclassified' } +CustomHashSet class >> reserve: aNumber [ + + ^ self new + arraySize: aNumber; + yourself +] + +{ #category : #'as yet unclassified' } +CustomHashSet >> arraySize: aSize [ + + array := self arrayType new: aSize +] diff --git a/Joana-Core/HashSet.class.st b/Joana-Core/HashSet.class.st new file mode 100644 index 00000000..b942e796 --- /dev/null +++ b/Joana-Core/HashSet.class.st @@ -0,0 +1,5 @@ +Class { + #name : #HashSet, + #superclass : #Set, + #category : #'Joana-Core' +} diff --git a/Joana-Core/ImageOperations.class.st b/Joana-Core/ImageOperations.class.st new file mode 100644 index 00000000..ec2d9276 --- /dev/null +++ b/Joana-Core/ImageOperations.class.st @@ -0,0 +1,26 @@ +Class { + #name : #ImageOperations, + #superclass : #Object, + #category : #'Joana-Core' +} + +{ #category : #'as yet unclassified' } +ImageOperations class >> as8Bit: aForm [ + + ^ aForm as8BitColorForm +] + +{ #category : #'as yet unclassified' } +ImageOperations class >> dimmed: aForm [ + + ^ aForm dimmed +] + +{ #category : #'as yet unclassified' } +ImageOperations class >> emboss: aForm factor: aFactor bias: aBias [ + + ^ aForm + processUsingKernel: (Matrix rows: 3 columns: 3 contents: #(-2 -1 0 -1 1 1 0 1 2)) + factor: aFactor + bias: aBias +] diff --git a/Joana-Core/Images.class.st b/Joana-Core/Images.class.st new file mode 100644 index 00000000..8538a4d5 --- /dev/null +++ b/Joana-Core/Images.class.st @@ -0,0 +1,672 @@ +Class { + #name : #Images, + #superclass : #Object, + #category : #'Joana-Core' +} + +{ #category : #'as yet unclassified' } +Images class >> berries [ + + ^ (Form fromBinaryStream: (ReadStream on: '/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY +GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa +KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR +CADIASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA +AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK +FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG +h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl +5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA +AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk +NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE +hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk +5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwtjTM0401q4+T3bHO4aCZozQBQRUqnoTy +aChz61JHK6NlGIPtUBpQaiUES4GpHqd4o4lJqzHrt7HjDg/UViiTBp27Nc/sodUS4HU2/iy4 +jxvXP0NaMPjh0+9G5H1riAc0GoeHpdiLHq/hfVYvEeoCF0J28ncK3viNajTtBYwAIwXgiuM+ +DSb9fb6CvRvjPEE8OOfavHq2hjIwW2hrFe42eFrqV0OkzU/+1Lxek7VnKadmve5YdjldyS+u +5bqQPO25vWq9K1IK0SSVkIdupwkI6GmYpDxUtsViwtw69DUsd66nrVDdS5pXT3FY2o9UYDk1 +MmrEnANc/mgNik6UWS4o7G11L1NasF8pHWvP47hl71esb1muI1J6nFc88P1I5GegD94gZh8t +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 +pMUUUANIoDEcA0UUAf/Z' base64Decoded asByteArray)) scaledToSize: 180@180. +] + +{ #category : #'as yet unclassified' } +Images class >> cat [ + + ^ (Form fromBinaryStream: (ReadStream on: '/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY +GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa +KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR +CADIASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA +AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK +FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG +h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl +5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA +AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk +NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE +hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk +5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2yeOqbxe1a80dVHSuZ7mkZFFIctUstrhe +Km24ORT2YsK1ilYu7Msx4pQlXmhpoipWL5iCOP2qZY+akVMVIFpMiTEVcVIBSqhp6rWMkYyY +0CnU/FLtrBxM2xlKOaXbShahohsVakFIBTqVjNi5py80zrTwrBd2DimotsVxx4phakY5pM1L +Q7i7qM0lJSsFxWNRmnGkxmgdxmaYRmpttJtpgQMtRlassKjYU0IiZBjpVSWLmrjGoW5q7piM +90wahkWr0wzVRxzUNWEVmFR1aaPIqBlwaNgG7cioXXFWO1MfmrurAU3FMwasutR7am40egyp +VVoq1njzVd4q9BI60zO8qk8vFXvLpPKq0jRSKfl0eXVzyqlEI207BzGeI6XZVsx0eXUtCbIA +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' base64Decoded asByteArray) ) scaledToSize: 180@180. +] + +{ #category : #'as yet unclassified' } +Images class >> house [ + + ^ (Form fromBinaryStream: (ReadStream on: '/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY +GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa +KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR +CADHASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA +AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK +FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG +h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl +5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA +AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk +NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE +hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk +5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDn7W3wBxV0R4FTRxbVp+yvqLnjFbZSbKs7 +KNlFwK2yk2e1WtlJsouIq7KTZVrZSbKLgVdlN2Vb2U3ZQBU2UhSrZSmlKAKhSmlKtlKYUpBc +qFKaUq2UphSgdyoUphSrhSmFKQ7lQpTClWylMKUBcqFKYUq2UpjJSC5UKUwpVtkphSkMqFKY +Vq2yUwpSGVGSmMlXClRslIdyoVppWrTJTClIZWK00rVkpTCtIdyuVppWrBWmlaQyuVpu2rBW +mlaQyuyZFVXi+atArTGTJpDTPV9lGyrOyk2V0XOYr7KNlWNlGyi4FbZRsqzspNlFxFbZSbPa +rOyjZRcCrsppSrWyk2UXAqmOmlKt+XTSlFwKhSmFKulKYY6LgUylMZKulKYUouBTMdMKVdMd +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 +/9k=' base64Decoded asByteArray)) scaledToSize: 180@180. +] diff --git a/Joana-Core/Measurements.class.st b/Joana-Core/Measurements.class.st new file mode 100644 index 00000000..811c86c8 --- /dev/null +++ b/Joana-Core/Measurements.class.st @@ -0,0 +1,2268 @@ +Class { + #name : #Measurements, + #superclass : #Object, + #category : #'Joana-Core' +} + +{ #category : #'as yet unclassified' } +Measurements >> filterAll [ + + ^ { + "nur über code" + [Measurements new filterNothing]. + [Measurements new filterOnlyExample]. + [Measurements new filterOnlyVariants]. + [Measurements new filterExampleWatch]. + [Measurements new filterAllElements]. + "manuell sandblock bauen und example ausführen was da drin ist" + [Measurements new filterNothingExample]. + [Measurements new filterExampleWatchExample]. + + + [Measurements new filterAllElementsExampleBerries8Bit ]. + [Measurements new filterAllElementsExampleBerriesDimmed]. + + [Measurements new filterAllElementsExampleBerriesEmboss030]. + [Measurements new filterAllElementsExampleBerriesEmboss031]. + [Measurements new filterAllElementsExampleBerriesEmboss100]. + [Measurements new filterAllElementsExampleBerriesEmboss101]. + [Measurements new filterAllElementsExampleBerriesEmboss220]. + [Measurements new filterAllElementsExampleBerriesEmboss221]. + + + [Measurements new filterAllElementsExampleCat8Bit ]. + [Measurements new filterAllElementsExampleBerriesDimmed]. + + [Measurements new filterAllElementsExampleCatEmboss030]. + [Measurements new filterAllElementsExampleCatEmboss031]. + [Measurements new filterAllElementsExampleCatEmboss100]. + [Measurements new filterAllElementsExampleCatEmboss101]. + [Measurements new filterAllElementsExampleCatEmboss220]. + [Measurements new filterAllElementsExampleCatEmboss221]. + } collect: #value. +] + +{ #category : #'with code - filters' } +Measurements >> filterAllElements [ + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleBerries8Bit [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 2 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 3 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleBerriesDimmed [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 2 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 2 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleBerriesEmboss030 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 2 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 2 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleBerriesEmboss031 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 2 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 2 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleBerriesEmboss100 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 2 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleBerriesEmboss101 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 2 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleBerriesEmboss220 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 2 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 3 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleBerriesEmboss221 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 2 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 3 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleCat8Bit [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 3 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleCatDimmed [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 2 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleCatEmboss030 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 2 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleCatEmboss031 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 2 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleCatEmboss100 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleCatEmboss101 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleCatEmboss220 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 3 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterAllElementsExampleCatEmboss221 [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 3 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result +] + +{ #category : #'with code - filters' } +Measurements >> filterExampleWatch [ + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := Images cat. + filtered := ImageOperations emboss: original factor: 1.0 bias: 0. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterExampleWatchExample [ + + | sandblock example watch result | + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := Images cat. + filtered := ImageOperations emboss: original factor: 1.0 bias: 0. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + ^ result + + + + +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterGenerateMultiverse [ + + | sandblock example result editor | + + editor := SBEditor open. + SBMultiverse resolveIn: editor. "NO OTHER WIDGETS!" + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + editor openMorph: sandblock. + example startRunning. + + "warmup" + 1 to: self runs do: [:i | + SBMultiverse bigbangInEditorSynchKaboom: editor]. + + result:= (([1 to: self runs do: [:i | + SBMultiverse bigbangInEditorSynchKaboom: editor]] timeToRun) / self runs) asFloat. + + "teardown" + editor close. + + ^ result + + + + +] + +{ #category : #'with code - filters' } +Measurements >> filterNothing [ + + MyImageFilter compile: 'main + + | original filtered | + original := Images cat. + filtered := ImageOperations emboss: original factor: 1.0 bias: 0. + ^ filtered'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterNothingExample [ + + | sandblock example| + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := Images cat. + filtered := ImageOperations emboss: original factor: 1.0 bias: 0. + ^ filtered'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + + "warmup" + 1 to: self runs do: [:i | example runSynch]. + + ^ (([1 to: self runs do: [:i | example runSynch ]] timeToRun) / self runs) asFloat +] + +{ #category : #'with code - filters' } +Measurements >> filterOnlyExample [ + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := Images cat. + filtered := ImageOperations emboss: original factor: 1.0 bias: 0. + ^ filtered'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + +] + +{ #category : #'with code - filters' } +Measurements >> filterOnlyVariants [ + + MyImageFilter compile: 'main + + | original filtered | + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 2 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ filtered'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + +] + +{ #category : #'with sandblocks - filters' } +Measurements >> filterVisualizeMultiverse [ + + | sandblock example result editor multiverse exploriants | + + editor := SBEditor open. + SBMultiverse resolveIn: editor. "NO OTHER WIDGETS!" + + MyImageFilter compile: 'main + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: ''example''. + original := SBVariant + named: ''original'' + associations: {'''' -> [Images cat]. '''' -> [Images berries]} + activeIndex: 1 + id: ''a126c416-5581-6145-9e64-a990e19e22a5'' + isActive: true. + filtered := SBVariant + named: ''filtered'' + associations: { + ''emboss'' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: ''factor:'' + associations: {'''' -> [1]. '''' -> [0.3]. '''' -> [2.2]} + activeIndex: 1 + id: ''0e40aa63-5c5b-8c42-9182-f34f73fed9b5'' + isActive: true) + bias: (SBVariant + named: ''bias:'' + associations: {'''' -> [0]. '''' -> [1]} + activeIndex: 1 + id: ''67e9b295-d0aa-2340-ab34-1091e70c12a1'' + isActive: true)]. + ''dimmed'' -> [ImageOperations dimmed: original]. + ''as8Bit'' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: ''b647d310-06e1-d947-b154-42e0edaa948a'' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each]'. + + "get sandblock" + sandblock := (MyImageFilter compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + editor openMorph: sandblock. + example startRunning. + multiverse := SBMultiverse bigbangInEditorSynchKaboom: editor. + SBExploriants deleteUniqueInstance. + exploriants := SBExploriants uniqueInstance. + editor openMorph: exploriants. + + "warmup" + 1 to: self runs do: [:i | + exploriants multiverse: multiverse. + (exploriants namedBlocks detect: #isCustomView) views do: #visualize. + exploriants namedBlocks do:#visualize.]. + + result:= (([1 to: self runs do: [:i | + exploriants multiverse: multiverse. + (exploriants namedBlocks detect: #isCustomView) views do: #visualize. + exploriants namedBlocks do:#visualize.]] timeToRun) / self runs) asFloat. + + "teardown" + editor close. + + ^ result + + + + +] + +{ #category : #'as yet unclassified' } +Measurements >> runAll [ + + ^ { + "nur über code" + [Measurements new runtimeNothing]. + [Measurements new runtimeOnlyExample]. + [Measurements new runtimeOnlyVariants]. + [Measurements new runtimeExampleWatch]. + [Measurements new runtimeAllElements]. + "manuell sandblock bauen und example ausführen was da drin ist" + [Measurements new runtimeNothingExample]. + [Measurements new runtimeExampleWatchExample]. + + [Measurements new runtimeAllElementsExampleSortedHashSet ]. + [Measurements new runtimeAllElementsExampleRandomHashSet]. + [Measurements new runtimeAllElementsExampleRandomCustom100]. + [Measurements new runtimeAllElementsExampleRandomCustom1000]. + [Measurements new runtimeAllElementsExampleRandomCustom10000]. + [Measurements new runtimeAllElementsExampleSortedCustom100]. + [Measurements new runtimeAllElementsExampleSortedCustom1000]. + [Measurements new runtimeAllElementsExampleSortedCustom10000]. + } collect: #value. +] + +{ #category : #constants } +Measurements >> runs [ + + ^ 30 +] + +{ #category : #'with code' } +Measurements >> runtimeAllElements [ + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 1 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 1 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeAllElementsExampleRandomCustom100 [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 2 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 1 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 2 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeAllElementsExampleRandomCustom1000 [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 2 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 2 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 2 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeAllElementsExampleRandomCustom10000 [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 2 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 3 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 2 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeAllElementsExampleRandomHashSet [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 2 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 1 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 1 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeAllElementsExampleSortedCustom100 [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 1 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 2 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeAllElementsExampleSortedCustom1000 [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 2 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 2 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeAllElementsExampleSortedCustom10000 [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 3 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 2 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeAllElementsExampleSortedHashSet [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 1 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 1 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + + ^ result + + + + +] + +{ #category : #'with code' } +Measurements >> runtimeExampleWatch [ + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := (1 to: 1000000) collect: [:aNumber | aNumber]. + set := HashSet new. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeExampleWatchExample [ + + | sandblock example watch result | + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := (1 to: 1000000) collect: [:aNumber | aNumber]. + set := HashSet new. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + watch := sandblock containedExampleWatches first. + SBExampleWatch registerWatch: watch. + + "warmup" + 1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]. + + result:= (([1 to: self runs do: [:i | + watch exampleStarting: example. + example runSynch. + watch exampleFinished: example]] timeToRun) / self runs) asFloat. + + "teardown" + SBExampleWatch unregisterWatch: watch. + ^ result + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeGenerateMultiverse [ + + | sandblock example result editor | + + editor := SBEditor open. + SBMultiverse resolveIn: editor. "NO OTHER WIDGETS!" + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 1 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 1 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + editor openMorph: sandblock. + example startRunning. + + "warmup" + 1 to: self runs do: [:i | + SBMultiverse bigbangInEditorSynchKaboom: editor]. + + result:= (([1 to: self runs do: [:i | + SBMultiverse bigbangInEditorSynchKaboom: editor]] timeToRun) / self runs) asFloat. + + "teardown" + editor close. + + ^ result + + + + +] + +{ #category : #'with code' } +Measurements >> runtimeNothing [ + + RuntimeComparisons compile: 'main + | workload set | + workload := (1 to: 1000000) collect: [:aNumber | aNumber]. + set := HashSet new. + [workload do: [:aNumber | set add: aNumber]] timeToRun'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeNothingExample [ + + | sandblock example| + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := (1 to: 1000000) collect: [:aNumber | aNumber]. + set := HashSet new. + [workload do: [:aNumber | set add: aNumber]] timeToRun'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + example := sandblock containedExamples first. + + "warmup" + 1 to: self runs do: [:i | example runSynch]. + + ^ (([1 to: self runs do: [:i | example runSynch ]] timeToRun) / self runs) asFloat + + + + +] + +{ #category : #'with code' } +Measurements >> runtimeOnlyExample [ + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := (1 to: 1000000) collect: [:aNumber | aNumber]. + set := HashSet new. + [workload do: [:aNumber | set add: aNumber]] timeToRun'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + + + +] + +{ #category : #'with code' } +Measurements >> runtimeOnlyVariants [ + + RuntimeComparisons compile: 'main + | workload set | + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 1 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 1 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + [workload do: [:aNumber | set add: aNumber]] timeToRun'. + + "warmup" + 1 to: self runs do: [:i | RuntimeComparisons new main]. + + ^ (([1 to: self runs do: [:i | RuntimeComparisons new main]] timeToRun) / self runs) asFloat + + + + +] + +{ #category : #'with sandblocks' } +Measurements >> runtimeVisualizeMultiverse [ + + | sandblock example result editor multiverse exploriants | + + editor := SBEditor open. + SBMultiverse resolveIn: editor. "NO OTHER WIDGETS!" + + RuntimeComparisons compile: 'main + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: ''example''. + workload := SBVariant + named: ''workload'' + associations: { + ''ordered'' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + ''random'' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: ''6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179'' + isActive: true. + set := SBVariant + named: ''set'' + associations: { + '''' -> [HashSet new]. + '''' -> [ + CustomHashSet reserve: (SBVariant + named: ''reserve:'' + associations: {'''' -> [100]. '''' -> [1000]. '''' -> [10000]} + activeIndex: 1 + id: ''3c9b78de-a961-1b40-9629-2c9db7d9c24f'' + isActive: true)]} + activeIndex: 1 + id: ''ad068d8c-76f1-6347-81f6-55d1300ca3d3'' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each]'. + + "get sandblock" + sandblock := (RuntimeComparisons compiledMethodAt: #main) asSandblock. + editor openMorph: sandblock. + example := sandblock containedExamples first. + example startRunning. + multiverse := SBMultiverse bigbangInEditorSynchKaboom: editor. + SBExploriants deleteUniqueInstance. + exploriants := SBExploriants uniqueInstance. + editor openMorph: exploriants. + + "warmup" + 1 to: self runs do: [:i | + exploriants multiverse: multiverse. + (exploriants namedBlocks detect: #isCustomView) views do: #visualize. + exploriants namedBlocks do:#visualize.]. + + result:= (([1 to: self runs do: [:i | + exploriants multiverse: multiverse. + (exploriants namedBlocks detect: #isCustomView) views do: #visualize. + exploriants namedBlocks do:#visualize.]] timeToRun) / self runs) asFloat. + + "teardown" + editor close. + + ^ result + + + + +] diff --git a/Joana-Core/MyImageFilter.class.st b/Joana-Core/MyImageFilter.class.st new file mode 100644 index 00000000..88c6ddb6 --- /dev/null +++ b/Joana-Core/MyImageFilter.class.st @@ -0,0 +1,42 @@ +Class { + #name : #MyImageFilter, + #superclass : #Object, + #category : #'Joana-Core' +} + +{ #category : #'as yet unclassified' } +MyImageFilter >> main [ + + | original filtered | + self example: [MyImageFilter new] args: [{}] label: 'example'. + original := SBVariant + named: 'original' + associations: {'' -> [Images cat]. '' -> [Images berries]} + activeIndex: 1 + id: 'a126c416-5581-6145-9e64-a990e19e22a5' + isActive: true. + filtered := SBVariant + named: 'filtered' + associations: { + 'emboss' -> [ + ImageOperations + emboss: original + factor: (SBVariant + named: 'factor:' + associations: {'' -> [1]. '' -> [0.3]. '' -> [2.2]} + activeIndex: 3 + id: '0e40aa63-5c5b-8c42-9182-f34f73fed9b5' + isActive: true) + bias: (SBVariant + named: 'bias:' + associations: {'' -> [0]. '' -> [1]} + activeIndex: 2 + id: '67e9b295-d0aa-2340-ab34-1091e70c12a1' + isActive: true)]. + 'dimmed' -> [ImageOperations dimmed: original]. + 'as8Bit' -> [ImageOperations as8Bit: original]} + activeIndex: 1 + id: 'b647d310-06e1-d947-b154-42e0edaa948a' + isActive: true. + ^ SBExampleWatch report: filtered for: 391394467 modifying: [:each | each] +] diff --git a/Joana-Core/RuntimeComparisons.class.st b/Joana-Core/RuntimeComparisons.class.st new file mode 100644 index 00000000..236f1275 --- /dev/null +++ b/Joana-Core/RuntimeComparisons.class.st @@ -0,0 +1,37 @@ +Class { + #name : #RuntimeComparisons, + #superclass : #Object, + #category : #'Joana-Core' +} + +{ #category : #'as yet unclassified' } +RuntimeComparisons >> main [ + | workload set | + self example: [RuntimeComparisons new] args: [{}] label: 'example'. + workload := SBVariant + named: 'workload' + associations: { + 'ordered' -> [(1 to: 1000000) collect: [:aNumber | aNumber]]. + 'random' -> [(1 to: 1000000) collect: [:aNumber | Random new next]]} + activeIndex: 1 + id: '6e1ceaf8-c636-2a48-9a38-d0f1b5aa9179' + isActive: true. + set := SBVariant + named: 'set' + associations: { + '' -> [HashSet new]. + '' -> [ + CustomHashSet reserve: (SBVariant + named: 'reserve:' + associations: {'' -> [100]. '' -> [1000]. '' -> [10000]} + activeIndex: 3 + id: '3c9b78de-a961-1b40-9629-2c9db7d9c24f' + isActive: true)]} + activeIndex: 2 + id: 'ad068d8c-76f1-6347-81f6-55d1300ca3d3' + isActive: true. + SBExampleWatch + report: [workload do: [:aNumber | set add: aNumber]] timeToRun + for: 653165203 + modifying: [:each | each] +] diff --git a/Joana-Core/SomeSearchCollection.class.st b/Joana-Core/SomeSearchCollection.class.st new file mode 100644 index 00000000..1d34599d --- /dev/null +++ b/Joana-Core/SomeSearchCollection.class.st @@ -0,0 +1,29 @@ +Class { + #name : #SomeSearchCollection, + #superclass : #OrderedCollection, + #category : #'Joana-Core' +} + +{ #category : #'as yet unclassified' } +SomeSearchCollection class >> numbersUpTo10000 [ + + ^ self new + addAll: (1 to: 10000); + yourself +] + +{ #category : #'as yet unclassified' } +SomeSearchCollection >> binarySearch: anElement [ + + | index low high | + self example: [SomeSearchCollection numbersUpTo10000] args: [{20}] label: 'small'. + low := 1. + high := self size. + + [high < low] whileFalse: [ + index := high + low // 2. + + anElement < (self at: index) + ifTrue: [high := index - 1] + ifFalse: [anElement > (self at: index) ifTrue: [low := index + 1] ifFalse: [^ index]]] +] diff --git a/Joana-Core/package.st b/Joana-Core/package.st new file mode 100644 index 00000000..616d58e5 --- /dev/null +++ b/Joana-Core/package.st @@ -0,0 +1 @@ +Package { #name : #'Joana-Core' } diff --git a/packages/Sandblocks-Babylonian/SBCustomView.class.st b/packages/Sandblocks-Babylonian/SBCustomView.class.st index c88ed7f2..1bfda360 100644 --- a/packages/Sandblocks-Babylonian/SBCustomView.class.st +++ b/packages/Sandblocks-Babylonian/SBCustomView.class.st @@ -46,6 +46,12 @@ SBCustomView >> initialize [ ] +{ #category : #accessing } +SBCustomView >> isCustomView [ + + ^ true +] + { #category : #accessing } SBCustomView >> isOverview [ diff --git a/packages/Sandblocks-Babylonian/SBExample.class.st b/packages/Sandblocks-Babylonian/SBExample.class.st index c6112b76..6cf7cb8f 100644 --- a/packages/Sandblocks-Babylonian/SBExample.class.st +++ b/packages/Sandblocks-Babylonian/SBExample.class.st @@ -423,6 +423,28 @@ SBExample >> runSetup [ returnValue clear. ] +{ #category : #execution } +SBExample >> runSynch [ + + | returned | + self runSetup. + "self sendStartNotification." + + processRunning := true. + SBExecutionEnvironment value: self. + + [returned := self evaluate] on: Error do: [:e | + processRunning := false. + self scheduleLastError: e. + Processor activeProcess suspend]. + self scheduleLastError: nil. + currentProcess := nil. + processRunning := false. + returnValue reportValues: {returned asSBWatchValue} + sized: SBMorphResizer newThumbmail. + returnValue updateDisplay. +] + { #category : #execution } SBExample >> runSynchUpdatingOnlyValuesOf: aCollectionOfSBWatches [ diff --git a/packages/Sandblocks-Babylonian/SBExploriants.class.st b/packages/Sandblocks-Babylonian/SBExploriants.class.st index 5ff7562e..b0b74fbc 100644 --- a/packages/Sandblocks-Babylonian/SBExploriants.class.st +++ b/packages/Sandblocks-Babylonian/SBExploriants.class.st @@ -170,6 +170,19 @@ SBExploriants >> methodChanged: anEvent [ ifFound: [:history | history addCodeSnapshot: anEvent]] ] +{ #category : #actions } +SBExploriants >> multiverse: aSBMultiverse [ + + |tabs| + self width: 0. + ignoreUpdate := false. + "tabs will visualize as soon as multiverse is finished" + tabs := SBExploriantsView getTabsInMultiverse: aSBMultiverse. + + self namedBlocks: tabs activeIndex: 1. + +] + { #category : #accessing } SBExploriants >> objectToPermutation [ diff --git a/packages/Sandblocks-Babylonian/SBExploriantsView.class.st b/packages/Sandblocks-Babylonian/SBExploriantsView.class.st index 6a06faa5..89a534dc 100644 --- a/packages/Sandblocks-Babylonian/SBExploriantsView.class.st +++ b/packages/Sandblocks-Babylonian/SBExploriantsView.class.st @@ -93,6 +93,12 @@ SBExploriantsView >> initialize [ vResizing: #shrinkWrap). ] +{ #category : #accessing } +SBExploriantsView >> isCustomView [ + + ^ true +] + { #category : #accessing } SBExploriantsView >> isHistory [ diff --git a/packages/Sandblocks-Babylonian/SBMultiverse.class.st b/packages/Sandblocks-Babylonian/SBMultiverse.class.st index 1d0ad11a..e56b1667 100644 --- a/packages/Sandblocks-Babylonian/SBMultiverse.class.st +++ b/packages/Sandblocks-Babylonian/SBMultiverse.class.st @@ -26,6 +26,16 @@ SBMultiverse class >> bigbangInEditor: aSandblockEditor [ yourself ] +{ #category : #'instance creation' } +SBMultiverse class >> bigbangInEditorSynchKaboom: aSandblockEditor [ + + ^ self basicNew + sandblockEditor: aSandblockEditor; + initialize; + kaboom; + yourself +] + { #category : #'instance creation' } SBMultiverse class >> bigbangInEditorWithoutKaboom: aSandblockEditor [