如果在运行时替换函数,Clojure/JVMGC会旧代码吗?

如果您在运行时频繁替换函数,就像这张海报为了基因编程的目的而想要做的那样,Clojure/JVM GC 会不会是旧代码?

回答

如有疑问,请询问计算机!我写了一个快速测试:

(ns tst.demo.core
  (:use demo.core tupelo.core tupelo.test))
  
(defn create-fn
  [n]
  (let [fname   (symbol (format "add-%d" n))
        body    (vector '[x] (list '+ n 'x))
        fn-form (apply list 'clojure.core/defn fname body)
        fn-ref  (eval fn-form)]
    fn-ref))

(defn create-and-call-fn
  [n]
  (let [fn-ref (create-fn n)
        fn-result (fn-ref 3)]
    (when-not (= (+ 3 n) fn-result)
      (throw (ex-info "bad result" (vals->map n fn-result))))))


(dotest
  (let [f5 (create-fn 5)
        f5-result (f5 3)]
    (is= 8 f5-result))
  (dotimes [i 99999]
    (when (zero? (mod i 100)) (spyx i))
    (create-and-call-fn i)))

之后创建多达 10 万个函数,它仍然有效。天啊!


以上是基于这个模板项目。

  • @generateme But when you `eval` a function, you generate a new class, not just a new object. Whether that class gets cleaned up is less obvious than whether some random lambda does.

以上是如果在运行时替换函数,Clojure/JVMGC会旧代码吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>