Clojureのベクタのメモリ使用量

(vector-of :int)を使えば普通の配列を使った場合の1.35倍、普通のベクタとIntegerを使った場合は7.32倍くらいになる。まぁ全然OKですね。

(defn current-total-memory-usage []
  (System/gc)                                                                                                          
  (- (.. Runtime getRuntime totalMemory)                                                                                                                  
     (.. Runtime getRuntime freeMemory)))

(defmacro memory-usage [& exprs]
  `(let [pre# (current-total-memory-usage)]                                                                                                       
     ~@exprs                                                                                                                                   
     (- (current-total-memory-usage) pre#)))

user> (memory-usage (def v (int-array 1000000)))
4000040                                                                                                                                                         
user> (def v nil)
#'user/v                                                                                                                                                        
user> (memory-usage (def v (into [] (range 1000000))))
29274744                                                                                                                                                        
user> (def v nil)
#'user/v                                                                                                                                                        
user> (memory-usage (def v (into (vector-of :int) (range 1000000))))
5419552