Well, NoopReaderCache pretty much works like there's no reader cache, or zoie before we introduced it.
Also before, zoie's index readers cannot be passed between threads safely/easily, since thread local was used and was uncacheable.
An important client requested a freshness feature, so we introduced a reader cache.
DefaultReaderCache would refresh the reader every freshness amount of time. Apparently we forget to fresh it at startup, which is probably why your code didn't work. But if could wait freshness amount of time, it should be there. Also you can force a refresh at startup time. If you use the same reader for a while instead of always use newest one, you may have better cpu/memory cache utility. Of course, this can be severely affected by application's behavior.
SmartReaderCache, does what DefaultReaderCache does, plus it help application avoid the reference counting on index readers. This reduces amount of synchronized/locked code path, which in turn may reduce the amount of context switches. In implementation, it uses weak reference and let GC trigger the reference counting.
We never had the bandwidth to compare performance in production environment, nor do I expect them to be very different.
Xiaoyang