gpt4 book ai didi

memory-management - common lisp 中对象的内存使用情况

转载 作者:行者123 更新时间:2023-12-04 08:58:53 26 4
gpt4 key购买 nike

有没有办法找出一个类或基本数据类型的实例使用了多少内存?

我在 cl 中有一个玩具网络框架,它使用代表 html 标签及其属性的类实例创建和管理网页,并且由于它们应该创建一个 html 页面,因此它们在一个名为 children 的插槽中有子节点。所以我在想如果我采用这种方法,用户的 session 将花费多少服务器。谢谢。

最佳答案

据我所知,标准中的任意对象都没有这样的东西,但是有依赖于实现的解决方案,比如 CCL 中的 ccl:object-direct-size:

CL-USER> (object-direct-size "foo")
16

但是,请注意,这些是否符合您的要求取决于您所说的“大小”,因为这些函数通常不包括对象引用的组件的大小。您还可以运行 GC,在之前和之后初始化一些对象和 compare room output

另外,请注意 time 通常包含分配信息:
CL-USER> (time (length (make-array 100000)))
(LENGTH (MAKE-ARRAY 100000))
took 0 milliseconds (0.000 seconds) to run.
During that period, and with 2 available CPU cores,
0 milliseconds (0.000 seconds) were spent in user mode
0 milliseconds (0.000 seconds) were spent in system mode
400,040 bytes of memory allocated.
100000

也许你可以尝试这样的事情(未经测试,实际上只是一个快速破解):
(defmethod size ((object standard-object))
(let ((size (ccl:object-direct-size object)))
(dolist (slot (mapcar #'ccl:slot-definition-name
(ccl:class-slots (class-of object))))
(when (slot-boundp object slot)
(incf size (size (slot-value object slot)))))
size))

(defmethod size ((list list))
(reduce (lambda (acc object) (+ acc (size object)))
list
:initial-value (ccl:object-direct-size list)))

(defmethod size (object)
(ccl:object-direct-size object))

例如:
CL-USER> (defclass foo ()
((child :accessor child :initarg :child)))
#<STANDARD-CLASS FOO>
CL-USER> (defclass bar (foo)
((child2 :accessor child2 :initarg :child2)))
#<STANDARD-CLASS BAR>
CL-USER> (size '())
0
CL-USER> (size "foo")
16
CL-USER> (size '("foo" "bar"))
40
CL-USER> (size (make-instance 'foo))
16
CL-USER> (size (make-instance 'foo :child '("foo" "bar" "baz")))
72
CL-USER> (size (make-instance
'bar
:child "foo"
:child2 (make-instance 'foo :child (make-array 100))))
456

关于memory-management - common lisp 中对象的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12230499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com