Hi Levente,<br>
<br>
would you be fine with this version #findFirst:... and #findLast:... in the Trunk? :-)<br>
<br>
Best,<br>
Christoph<br>
<br>
<font color="#808080">---<br>
</font><font color="#808080"><i>Sent from </i></font><font color="#808080"><i><a href="https://github.com/hpi-swa-lab/squeak-inbox-talk"><u><font color="#808080">Squeak Inbox Talk</font></u></a></i></font><br>
<br>
On 2020-02-18T09:26:12+01:00, marcel.taeumel@hpi.de wrote:<br>
<br>
> I moved Collections-ct.875 to treated.<br>
> <br>
> Best,<br>
> Marcel<br>
> Am 17.02.2020 20:57:58 schrieb commits at source.squeak.org <commits at source.squeak.org>:<br>
> Christoph Thiede uploaded a new version of Collections to project The Inbox:<br>
> http://source.squeak.org/inbox/Collections-ct.877.mcz<br>
> <br>
> ==================== Summary ====================<br>
> <br>
> Name: Collections-ct.877<br>
> Author: ct<br>
> Time: 17 February 2020, 8:57:49.278239 pm<br>
> UUID: bf652ba0-43cc-734d-ac03-7a226cc80463<br>
> Ancestors: Collections-ul.875<br>
> <br>
> Extends and realigns version of #findFirst: and #findLast:.<br>
> <br>
> Second, optimized version after many helpful comments by Levente (ul). Thank you!<br>
> Replaces Collections-ct.875.<br>
> <br>
> ---<br>
> <br>
> Performance analysis:<br>
> <br>
> #findFirst: - '238 per second. 4.2 milliseconds per run. 0.73956 % GC time.'<br>
> #findFirst:startingAt: - '1,510 per second. 660 microseconds per run. 1.56 % GC time.'<br>
> #findFirst:startingAt:ifNone: - '1,210 per second. 828 microseconds per run. 2.06 % GC time.'<br>
> #findFirst:ifNone: - '214 per second. 4.68 milliseconds per run. 0.65987 % GC time.'<br>
> #findLast: - '210 per second. 4.76 milliseconds per run. 0.66 % GC time.'<br>
> #findLast:startingAt: - '1,380 per second. 724 microseconds per run. 1.72 % GC time.'<br>
> #findLast:startingAt:ifNone: - '1,130 per second. 887 microseconds per run. 2 % GC time.'<br>
> #findLast:ifNone: - '206 per second. 4.86 milliseconds per run. 0.81967 % GC time.'<br>
> <br>
> Comparing to previous version:<br>
> <br>
> #findFirst: - '193 per second. 5.19 milliseconds per run. 0.5994 % GC time.' (NOW 23.3% faster)<br>
> #findLast: - '213 per second. 4.69 milliseconds per run. 0.71986 % GC time.' (NOW 1.4% slower)<br>
> #findLast:startingAt: - '1,360 per second. 736 microseconds per run. 1.72 % GC time.' (NOW 1.4% faster)<br>
> <br>
> Measurements code:<br>
> <br>
> random := Random new.<br>
> range := 1 to: 256.<br>
> array := (1 to: 128) collect: [:i | range atRandom: random].<br>
> values := (1 to: 4096) collect: [:i | range atRandom: random].<br>
> <br>
> ({<br>
> #findFirst: -> [<br>
> values do: [:x |<br>
> array findFirst: [:y | x = y]]].<br>
> #findFirst:startingAt: -> [<br>
> values pairsDo: [:x :s |<br>
> array findFirst: [:y | x = y] startingAt: s]].<br>
> #findFirst:ifNone: -> [<br>
> values do: [:x |<br>
> array findFirst: [:y | x = y] ifNone: [123456789 sqrt]]].<br>
> #findFirst:startingAt:ifNone: -> [<br>
> values pairsDo: [:x :s |<br>
> array findFirst: [:y | x = y] startingAt: s ifNone: [123456789 sqrt]]].<br>
> #findLast: -> [<br>
> values do: [:x |<br>
> array findLast: [:y | x = y]]].<br>
> #findLast:startingAt: -> [<br>
> values pairsDo: [:x :s |<br>
> array findLast: [:y | x = y] startingAt: s]].<br>
> #findLast:ifNone: -> [<br>
> values do: [:x |<br>
> array findLast: [:y | x = y] ifNone: [123456789 sqrt]]].<br>
> #findLast:startingAt:ifNone: -> [<br>
> values pairsDo: [:x :s |<br>
> array findLast: [:y | x = y] startingAt: s ifNone: [123456789 sqrt]]].<br>
> }<br>
> select: [:assoc | array respondsTo: assoc key])<br>
> collect: [:assoc | assoc key -> assoc value bench] as: Dictionary<br>
> <br>
> =============== Diff against Collections-ul.875 ===============<br>
> <br>
> Item was changed:<br>
> ----- Method: SequenceableCollection>>findFirst: (in category 'enumerating') -----<br>
> findFirst: aBlock<br>
> "Return the index of my first element for which aBlock evaluates as true."<br>
> <br>
> + ^ self findFirst: aBlock startingAt: 1!<br>
> - | index |<br>
> - index := 0.<br>
> - [(index := index + 1)<br>
> - [(aBlock value: (self at: index)) ifTrue: [^index]].<br>
> - ^ 0!<br>
> <br>
> Item was added:<br>
> + ----- Method: SequenceableCollection>>findFirst:ifNone: (in category 'enumerating') -----<br>
> + findFirst: aBlock ifNone: anotherBlock<br>
> + "Return the index of my first element for which aBlock evaluates as true. If no element is found, return the value of anotherBlock."<br>
> +<br>
> + | index |<br>
> + (index := self findFirst: aBlock) = 0<br>
> + ifTrue: [^ anotherBlock value].<br>
> + ^ index!<br>
> <br>
> Item was added:<br>
> + ----- Method: SequenceableCollection>>findFirst:startingAt: (in category 'enumerating') -----<br>
> + findFirst: aBlock startingAt: minIndex<br>
> + "Return the index of my first element with index >= minIndex for which aBlock evaluates as true."<br>
> +<br>
> + minIndex to: self size do: [:index |<br>
> + (aBlock value: (self at: index)) ifTrue: [^index]].<br>
> + ^ 0!<br>
> <br>
> Item was added:<br>
> + ----- Method: SequenceableCollection>>findFirst:startingAt:ifNone: (in category 'enumerating') -----<br>
> + findFirst: aBlock startingAt: minIndex ifNone: anotherBlock<br>
> + "Return the index of my first element with index >= minIndex for which aBlock evaluates as true. If no element is found, return the value of anotherBlock."<br>
> +<br>
> + | index |<br>
> + (index := self findFirst: aBlock startingAt: minIndex) = 0<br>
> + ifTrue: [^ anotherBlock value].<br>
> + ^ index!<br>
> <br>
> Item was changed:<br>
> ----- Method: SequenceableCollection>>findLast: (in category 'enumerating') -----<br>
> findLast: aBlock<br>
> "Return the index of my last element for which aBlock evaluates as true."<br>
> <br>
> + ^ self findLast: aBlock startingAt: 1!<br>
> - | index |<br>
> - index := self size + 1.<br>
> - [(index := index - 1) >= 1] whileTrue:<br>
> - [(aBlock value: (self at: index)) ifTrue: [^index]].<br>
> - ^ 0!<br>
> <br>
> Item was added:<br>
> + ----- Method: SequenceableCollection>>findLast:ifNone: (in category 'enumerating') -----<br>
> + findLast: aBlock ifNone: anotherBlock<br>
> + "Return the index of my last element for which aBlock evaluates as true. If no element is found, return the value of anotherBlock."<br>
> +<br>
> + | index |<br>
> + (index := self findLast: aBlock) = 0<br>
> + ifTrue: [^ anotherBlock value].<br>
> + ^ index!<br>
> <br>
> Item was changed:<br>
> ----- Method: SequenceableCollection>>findLast:startingAt: (in category 'enumerating') -----<br>
> + findLast: aBlock startingAt: minIndex<br>
> + "Return the index of my last element with index >= minIndex for which aBlock evaluates as true."<br>
> - findLast: aBlock startingAt: i<br>
> - "Return the index of my last element with index >= i for which aBlock evaluates as true."<br>
> <br>
> + self size to: minIndex by: -1 do: [:index |<br>
> + (aBlock value: (self at: index)) ifTrue: [^index]].<br>
> - | index |<br>
> - index := self size + 1.<br>
> - [(index := index - 1) >= i] whileTrue:<br>
> - [(aBlock value: (self at: index)) ifTrue: [^index]].<br>
> ^ 0!<br>
> <br>
> Item was added:<br>
> + ----- Method: SequenceableCollection>>findLast:startingAt:ifNone: (in category 'enumerating') -----<br>
> + findLast: aBlock startingAt: minIndex ifNone: anotherBlock<br>
> + "Return the index of my last element with index >= minIndex for which aBlock evaluates as true. If no element is found, return the value of anotherBlock."<br>
> +<br>
> + | index |<br>
> + (index := self findLast: aBlock startingAt: minIndex) = 0<br>
> + ifTrue: [^ anotherBlock value].<br>
> + ^ index!<br>
> <br>
> <br>
> -------------- next part --------------<br>
> An HTML attachment was scrubbed...<br>
> URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200218/f9299774/attachment.html><br>
> <br>