Github user lvfangmin commented on the issue: https://github.com/apache/zookeeper/pull/590 Added JMH micro benchmark for the watch manager: * It shows **big win** for the watch heavy cases, with the current implementation, it uses more than 50MB memory to store 1M watches, with WatchManagerOptimized it only uses around 0.2MB. * It also makes add and trigger watches more efficient, since WatchManagerOptimized doesn't maintain the reverse map. * In sparse watches use case, the WatchManagerOptimized is expected to use a bit more memory because it needs extra effort to maintain those bit set. In the test it shows around 10% more memory usage. Here are more result about the throughput/latency related with WatchManager: ``` Benchmark (pathCount) (watchManagerClass) (watcherCount) Mode Cnt Score Error Units WatchBench.testAddConcentrateWatch 10000 WatchManager N/A avgt 9 5.382 ± 0.968 ms/op WatchBench.testAddConcentrateWatch 10000 WatchManagerOptimized N/A avgt 9 0.696 ± 0.133 ms/op WatchBench.testAddSparseWatch 10000 WatchManager 10000 avgt 9 4.889 ± 1.585 ms/op WatchBench.testAddSparseWatch 10000 WatchManagerOptimized 10000 avgt 9 4.794 ± 1.068 ms/op WatchBench.testTriggerConcentrateWatch 1 WatchManager 1 avgt 9 â 10â»â´ ms/op WatchBench.testTriggerConcentrateWatch 1 WatchManager 1000 avgt 9 0.037 ± 0.002 ms/op WatchBench.testTriggerConcentrateWatch 1 WatchManagerOptimized 1 avgt 9 â 10â»â´ ms/op WatchBench.testTriggerConcentrateWatch 1 WatchManagerOptimized 1000 avgt 9 0.025 ± 0.001 ms/op WatchBench.testTriggerConcentrateWatch 1000 WatchManager 1 avgt 9 0.048 ± 0.003 ms/op WatchBench.testTriggerConcentrateWatch 1000 WatchManager 1000 avgt 9 71.838 ± 4.043 ms/op WatchBench.testTriggerConcentrateWatch 1000 WatchManagerOptimized 1 avgt 9 0.079 ± 0.002 ms/op WatchBench.testTriggerConcentrateWatch 1000 WatchManagerOptimized 1000 avgt 9 26.135 ± 0.223 ms/op WatchBench.testTriggerSparseWatch 10000 WatchManager 10000 avgt 9 1.207 ± 0.035 ms/op WatchBench.testTriggerSparseWatch 10000 WatchManagerOptimized 10000 avgt 9 1.321 ± 0.019 ms/op ``` You can try the following command to run the micro benchmark: ``` $ ant clean package $ ant clean package -buildfile zookeeper-contrib/zookeeper-contrib-fatjar/build.xml $ java -jar build/contrib/fatjar/zookeeper-dev-fatjar.jar jmh ``` @maoling @anmolnar hope this gives you a more vivid comparison between the old and new watch manager implementation.
---