From: Ben Tilly Date: 2001-02-28T23:07:18+09:00 Subject: [ruby-talk:11771] Re: Comparison Caching ts wrote: > > >>>>> "B" == Ben Tilly writes: > > > This is what it do, except here > >B> def visited? (this, that) >B> if @seen[this].nil? >B> @seen[this] = [ that ] >B> else >B> return true if @seen[this].include? that >B> @seen[this].push that >B> end >B> false >B> end > > > def visited?(this, that) > this, that = that, this if this > that Why the swap? It buys you the ability to see the elements no matter what order they were in at the start, but outside of artificial benchmarks, will you see that? > return true if $seen[[this, that]] I have to wonder about this. We are defining == for an array. And we are creating new arrays and putting them in a hash, an act that causes == to be called on them. Your id sanity check makes that work, but it seems fragile. > $seen[[this, that]] = true > false > end > > > $seen is a thread local variable. > > I don't know which version is faster. Passing data in a thread local variable has the advantage that you don't need to explicitly pass a cache around. The disadvantage is that if you want the code to behave correctly upon hitting an exception, you need to protect various calls. I suspect it is faster to have a single entry point into needing the cache. At that point you can choose to either pass data around in a global variable, or you can begin/ensure that your local is cleaned up. A strange case. What about a user defined type which includes a local variable that is an array that their == method tests? With the global you catch that. With the global with a defined entry point, you have to be careful that the ensure doesn't wipe out the global cache. With the cache you run into possible infinite recursion if the local variable contains references to the global. This is an argument for using the thread-local global..but carefully. I will think about this more. Cheers, Ben ensure does not wipe out data from the overall test. _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com