On 18/10/15 14:33, Florent Daigniere wrote:
> On Tue, 2015-10-13 at 22:26 +0200, Bert Massop wrote:
>> On 10-10-15 21:01, nextg...@freenetproject.org wrote:
>>> Oi!
>>>
>>> Given https://github.com/freenet/fred/blob/next/src/freenet/node/Pe
>>> erManager.java#L1049
>>>
>>> We seem to get our peers location and their peer's location...
>>> Iterate over the whole lot (150^2 entries max)
>>> ...
>>> And then for each of them, ensure that they haven't been routed to
>>> before by iterating over a list of locations we've already routed
>>> to (18 is the max HTL)
>>> ...
>>> That's 18*150^2 => 405k iterations in the worst case ... on the
>>> hot-path (each request we route will go through it)!
>> Nice find!
>> One more thing: you forgot the recentlyFailed case, where it recurses
>> twice (line 1173 and 1183), leading to a total of 1.2M iterations
>> worst
>> case (however this case is extremely unlikely to occur).
>>
>>> It seems very naive.
>>>
>>> How can we do better? Locations are double, what's the best data-
>>> structure here?
>>> I'm rusty: is a TreeMap with a custom comparator (NavigableMap)
>>> what we want?
>> At least keeping FOAF peers locations sorted would allow for binary
>> search, i.e. O(log n) instead of O(n) search, at the cost of an
>> initial
>> O(n log n) sort. That would however require reworking
>> PeerNode.getPeersLocation() to return (and maintain) a sorted array.
>>
>> If one would then also keep the routedTo (of size m) sorted by
>> location,
>> we can find the FOAF (assuming peer count n for ourself and all of
>> our
>> peers) closest to the target location not in routedTo in O(log n + m)
>> time for each of our peers, and when done intelligently, find our
>> peer
>> with the FOAF closest to the target O(n log n + nm + m log m) for
>> *all*
>> of our peers. That would bring the iteration count down around 100-
>> fold
>> from the current situation.
>>
>> For any further optimization, the hardest part would be to figure out
>> all the corner cases present in the current spaghetti. ☺
>>
> That'd work nicely if we weren't doing the operations modulo
> Double.MIN_VALUE. Is there any reason why our locations doubles and not
> BigDecimals?
>
> http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
>
> Toad?
Originally speed. Of course we can look up nodes by a Double - but we
need to look for >= and <=, so it's more complicated, and I don't recall
whether the API allows it cheaply (you used to have to create a bunch of
objects e.g. iterators etc to get next-key-after-target). I agree that
being able to do an exact match might be useful for some optimisations.
> Any objection to that being changed?
How about using a long? More bits than a double, at least for the vast
majority of the space. And we can map 0.5 to 0, so sign isn't a big deal.

Note that we use locations in both routing and swapping, so it might
affect more code.
> Florent

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Devl mailing list
Devl@freenetproject.org
https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl

Reply via email to