You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向大型Map添加条目时的性能问题及优化建议咨询

向大型Map序列添加新键的性能优化问题

问题背景

我通过SQL生成了一个包含15000个Map的大型序列,每个Map对应85列数据,创建代码如下:

<xsl:variable name="original-sequence" select="sql:prepared-query($connection, $sql)()"/>

该创建过程耗时约200ms,速度较快。

随后我尝试为每个Map添加一个新键,遍历序列并使用map:put(., 'newcol', $newcol)或map:merge((., map{'newcol': $newcol}))生成新序列,代码如下:

<xsl:variable name="new-sequence" as="map(*)*">
    <xsl:for-each select="$original-sequence">
        <xsl:variable name="newcol" select="()"/> <!-- placeholder instead of real data -->
        <xsl:sequence select="map:put(., 'newcol', $newcol)"/>
    </xsl:for-each>
</xsl:variable>

此时出现性能问题:仅添加新键的操作耗时约300ms,甚至超过了初始SQL查询创建Map序列的时间。但如果直接创建15000个仅包含newcol键的新Map,仅需14ms。这说明向含大量键的现有Map添加新键的成本远高于创建新Map本身。

矛盾点与排查

根据map:put的文档说明:“Saxon无需每次添加条目时完全复制Map,添加条目的成本为常数,与Map大小无关”,但实际测试中,Map包含的键越多,添加新键的速度越慢——当把初始SQL生成的Map从85列减少到3列时,添加新键的操作速度明显变快。

文档提到若对Map的键值做类型检查(比如xsl:variable上指定as="map(xs:integer, xs:string)")会导致性能下降,但我的变量类型是map(*)*,理论上不会触发该问题,不过问题可能与SQL生成的初始Map序列的内部结构有关。

另外,map:merge文档提到saxon:key-type和saxon:final作为优化提示,且内部重组操作成本较高,我怀疑当前操作触发了这类内部重组,但不确定具体原因。

求助需求

现寻求针对向这类大型Map添加信息的最优处理方案,使用的是Saxon PE 11.6版本。

内容的提问来源于stack exchange,提问作者lschult2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:00:02