在审查一些哈希相关内容时,我发现Clojure内部有很多地方使用用PersistentHashMap EMPTY初始化的映射。其中许多映射可能只有少量条目,因此使用PersistentArrayMap可能更有效率。
以下是候选项:
`
src/jvm/clojure/lang/ARef.java
第19行:private volatile IPersistentMap watches = PersistentHashMap EMPTY;
src/jvm/clojure/lang/Compiler.java
第3009行:IPersistentMap m = PersistentHashMap EMPTY;
第3819行:KEYWORDS, PersistentHashMap EMPTY,
第3820行:VARS, PersistentHashMap EMPTY,
第3964行:IPersistentMap closes = PersistentHashMap EMPTY;
第3977行:IPersistentMap keywords = PersistentHashMap EMPTY;
第3978行:IPersistentMap vars = PersistentHashMap EMPTY;
第5121行:,CLEAR_SITES, PersistentHashMap EMPTY
第7259行:KEYWORDS, PersistentHashMap EMPTY,
第7260行:VARS, PersistentHashMap EMPTY
第7418行:IPersistentMap opts = PersistentHashMap.EMPTY;
第7475行:IPersistentMap fmap = PersistentHashMap EMPTY;
第7522行:KEYWORDS, PersistentHashMap EMPTY,
第7523行:VARS, PersistentHashMap EMPTY,
第7912行:,CLEAR_SITES, PersistentHashMap EMPTY
src/jvm/clojure/lang/LispReader.java
第755行:RT.map(GENSYM_ENV, PersistentHashMap EMPTY));
src/jvm/clojure/lang/MultiFn.java
第39行:this.methodTable = PersistentHashMap EMPTY;
第41行:this.preferTable = PersistentHashMap EMPTY;
第49行:methodTable = methodCache = preferTable = PersistentHashMap EMPTY;
src/jvm/clojure/lang/Var.java
第48行:final static Frame TOP = new Frame(PersistentHashMap EMPTY, null);
第175行:setMeta(PersistentHashMap EMPTY);
第341行:IPersistentMap ret = PersistentHashMap EMPTY;
`
方法:两种可能的方法 - 初始化为PersistentArrayMap EMPTY或调用RT.map(). 后者需要函数调用,因此会稍微慢一些,但将映射构建本地化到单个地方的优点。