On Sun, 2015-10-18 at 20:08 +0100, Matthew Toseland wrote: > 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/nod > > > > e/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. > >
I've written some code overnight: https://github.com/nextgens/fred/blob/optimize-closerpeer/test/freenet/ node/LocationTest.java https://github.com/nextgens/fred/blob/optimize-closerpeer/src/freenet/n ode/Location.java It sort-of-works; the exclusion list is matched exactly as opposed to modulo Double.MIN_VALUE... is that good enough? Florent _______________________________________________ Devl mailing list Devl@freenetproject.org https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl