[Glass] Can I avoid ReversedRangeIndexReadStream >> atEnd ?
Mariano Martinez Peck via Glass
glass at lists.gemtalksystems.com
Fri Dec 8 15:16:31 PST 2017
Hi Dale,
I am reviving this old thread. So...with the legacy indexes I had something
like this:
stream := query reversedReadStream.
"We are using #_atEndForStream: and #getNext because of performance
reasons. For more details see email 'Can I avoid
ReversedRangeIndexReadStream >> atEnd ?'
In GemStone 3.4 we may be able to pass a false below... "
^ (stream _atEndForStream: false)
ifTrue: [ nil ]
ifFalse: [ stream getNext ]
As I was sure there was no nils in the collection and that way, it was much
faster (else, #atEnd was too slow).
I just upgraded to use the new btreeplus indexes but I am not sure if I
should do something in particular for above speedup. I am using now the
default BtreePlusGsIndexReadStream >> atEnd. Is that correct or there could
be a fastest path when I am sure there is no nils?
Thanks in advance,
On Thu, Oct 26, 2017 at 9:56 AM, Mariano Martinez Peck <
marianopeck at gmail.com> wrote:
>
>
> On Wed, Oct 25, 2017 at 5:27 PM, Dale Henrichs <
> dale.henrichs at gemtalksystems.com> wrote:
>
>> Mariano,
>>
>> It is possible that there is a bug in reverse read stream that is masked
>> by fact that the comparison code in the loop is returning true at the right
>> time ... while working on the btree plus implementation I did find some
>> bugs the reversed read stream implementation that might explain this
>> behavior ... the btree plus reverse read stream implementation is very
>> different because in the btree plus implementation the leaf nodes are
>> doubly linked lists and the previous/next leaks are used ...
>>
>> I would suggest that you wait for 3.4 to be released and use btree plus
>> indexes ... we have an Alpha5 release that is pretty close to the final
>> release that you could take for a spin --- you should definitely see better
>> performance with the btree plus indexes for your use case ...
>>
>
> OK, thanks Dale for the answer. I guess I will wait then. Thanks for the
> offer of Alpha5 but I guess I would rather wait a bit until final release.
>
> Cheers,
>
>
>
>> Dale
>>
>> On 10/25/2017 12:14 PM, Mariano Martinez Peck wrote:
>>
>>
>>
>> On Wed, Oct 25, 2017 at 3:07 PM, Dale Henrichs via Glass <
>> glass at lists.gemtalksystems.com> wrote:
>>
>>> Mariano,
>>>
>>> The costly code is in RangeIndexReadStream>>_atEndForStream: (when
>>> aBool is true) and that code can be safely skipped if the values in the
>>> index will not include nils, or if your index is on a CharacterCollection
>>> and you do not mix Strings and Symbols or if your index is on a Float and
>>> the values do not include NaNs.
>>>
>>
>> Hi Dale,
>>
>> In my case, the collection is of instances of FaSecurityClosingPriceRecord
>> and as you can see in my original email the index is on a date type of
>> instVar.
>> If you see code below:
>>
>> query := self
>> nearestQueryFor: dateToCompare
>> on: (self indexingDict at: securityUniqueId).
>> stream := query reversedReadStream.
>> ^ (stream _atEndForStream: false)
>> ifTrue: [ nil ]
>> ifFalse: [ stream getNext ]
>>
>>
>> I can assure you that:
>>
>> 1) Values of the indexes are always dates.
>> 2) I have no FaSecurityClosingPriceRecord instance with nil date
>> 3) I have no nil in the collection passed by to `nearestQueryFor:
>> dateToCompare on:`
>>
>> Yet....I am getting different results wether I pass `false` or `true` to
>> #_atEndForStream: :(
>> And even worst, it looks like the correct one is when I pass false...
>>
>> Maybe I am hitting an scenario where `true` is needed that is not in the
>> ones you listed?
>> I can confirm at least that the speedup when using `false` was huge, so I
>> would love to find a way to skip that!
>>
>> Thanks in advance,
>>
>>
>> In 3.4 we do this automatically when you create a btree plus index with
>>> optmiizedComparison index option ... the 3.4 stream operations have been
>>> optimized in other ways as well --- 3.4 is due to be released very soon ...
>>>
>>> Dale
>>>
>>> On 10/25/2017 07:01 AM, Mariano Martinez Peck via Glass wrote:
>>>
>>> Hi Dale,
>>>
>>> I am doing a query like this (as per your recommendation):
>>>
>>>
>>> nearestQueryFor: aDate on: aCollection
>>> | query |
>>> query := GsQuery fromFormula: self nearestQuery on: aCollection.
>>> query bind: 'targetDate' to: aDate.
>>> ^ query
>>>
>>> nearestQuery
>>> ^ nearestQuery ifNil: [
>>> nearestQuery := GsQueryPredicate fromQueryStatement: 'each.date <=
>>> targetDate'.
>>> nearestQuery
>>> ].
>>>
>>>
>>> And when I use it, I do this:
>>>
>>> query := self nearestQueryFor: dateToCompare on: (self indexingDict at:
>>> securityUniqueId).
>>> stream := query reversedReadStream.
>>> ^ stream atEnd
>>> ifTrue: [ nil ]
>>> ifFalse: [ stream next ]
>>>
>>> I am profiling some code that uses this a lot and I see that quite some
>>> time is spent in the #atEnd.
>>> I attach a part of the profiling output to see what I mean.
>>>
>>> Do you see something obvious I can speed up?
>>>
>>> Thanks in advance,
>>>
>>> --
>>> Mariano
>>> http://marianopeck.wordpress.com
>>>
>>>
>>> _______________________________________________
>>> Glass mailing listGlass at lists.gemtalksystems.comhttp://lists.gemtalksystems.com/mailman/listinfo/glass
>>>
>>>
>>>
>>> _______________________________________________
>>> Glass mailing list
>>> Glass at lists.gemtalksystems.com
>>> http://lists.gemtalksystems.com/mailman/listinfo/glass
>>>
>>>
>>
>>
>> --
>> Mariano
>> http://marianopeck.wordpress.com
>>
>>
>>
>
>
> --
> Mariano
> http://marianopeck.wordpress.com
>
--
Mariano
http://marianopeck.wordpress.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gemtalksystems.com/mailman/private/glass/attachments/20171208/e089851f/attachment-0001.html>
More information about the Glass
mailing list