From 94a065a386807b50e375d09b9f05f35692376f04 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 18 Aug 2026 07:23:41 +0800 Subject: [PATCH] =?UTF-8?q?perf(vast=5Fc):=20=E8=8A=82=E7=82=B9=E6=9E=84?= =?UTF-8?q?=E9=80=A0=20tp=5Fnew=20=E7=9B=B4=E6=9E=84=E8=AF=95=E9=AA=8C?= =?UTF-8?q?=E6=89=93=E5=B9=B3=EF=BC=8C=E5=9B=9E=E9=80=80=20Vectorcall=20?= =?UTF-8?q?=E5=B9=B6=E8=AE=B0=E5=BD=95=E7=BB=93=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实测 tp_new + 逐字段 SetAttr 与 PyObject_Vectorcall 打平(基准 0.9x,略慢):PyTuple_New(0) + _fields 缓存查询 + slots 名称线性查找开销抵消 Python 帧收益 - 回退并注释说明:要降低 _Init 19.7s 需 tp_members.offset 偏移直写(风险较高另行评估) --- lib/vast_c/vast_c.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/vast_c/vast_c.c b/lib/vast_c/vast_c.c index b69c802..4a30892 100644 --- a/lib/vast_c/vast_c.c +++ b/lib/vast_c/vast_c.c @@ -128,7 +128,11 @@ static PyObject *ClassGet(Parser *P, const char *Name) { return Cls; /* borrowed */ } -/* 构造节点:按位置参数数组调用类(vast.nodes 的 __init__(*args, **kwargs)) */ +/* 构造节点:按位置参数数组实例化 vast.nodes 类。 + * 实测 tp_new 直构 + SetAttr 与 PyObject_Vectorcall 打平(甚至略慢 0.9x): + * PyTuple_New(0) + _fields 缓存查询 + 逐字段 SetAttr(slots 名称线性查找)的开销 + * 抵消了 Python 帧收益,故保留 Vectorcall(行为与 vast.parse 完全一致)。 + * 要真正降低 _Init 19.7s 需 slots 偏移直写(tp_members.offset),风险较高另行评估。 */ static PyObject *NewNode(Parser *P, const char *Name, PyObject **Args, Py_ssize_t NArgs) { PyObject *Cls = ClassGet(P, Name); if (Cls == NULL) {