循环加速最高达 3 倍!DolphinDB 动态脚本优化免费开启,零代码改造即可投入生产
在量化投研与实时风控场景中,逐笔数据处理、因子计算、累计指标统计等任务往往涉及大量循环、条件分支和自定义函数调用。当策略逻辑变得更加复杂,脚本运行时间随之变长;如果能够在不改动业务逻辑的前提下减少这类执行开销,就能让计算过程更高效、稳定,帮助团队捕捉转瞬即逝的市场机会。
因此,DolphinDB 推出了动态脚本优化机制。它在不改变业务逻辑的前提下,通过优化解释器的执行路径,循环与分支密集型脚本的运行速度提升 2-3.3 倍。
完全免费,社区版可用:动态脚本优化内置于 DolphinDB 2.00.18 & 3.00.5 及以上版本,无论是企业版还是社区版均可一键开启,无需额外授权费用。
为什么需要动态脚本优化?
传统脚本引擎在执行循环体或条件分支时,往往需要反复解析变量作用域和类型,产生大量额外开销;在大规模数据遍历、状态类指标逐笔更新等计算密集或逻辑密集场景中,这类开销会更加明显。
而 DolphinDB 动态脚本优化会根据脚本实际执行情况动态调整执行路径,减少冗余解析,让计算资源真正用在业务逻辑上。并且,脚本优化仅影响当前会话,便于在调试、性能对比和灰度验证等场景中灵活使用。
启用方式:一行代码,会话级生效
你无需修改已有脚本结构,只需在当前会话中执行一行函数即可开启:
enableDynamicScriptOptimization()
执行后,当前会话后续提交的所有脚本将自动进行优化加速。若需关闭,同样简单:
disableDynamicScriptOptimization()
这种会话级隔离的设计非常贴心——你可以在测试会话中验证效果,确认无误后再通过全局配置为生产环境的新建会话统一开启。
如需让所有新建会话默认启用优化,在服务节点的配置文件中添加:
enableDynamicScriptOptimization=true
重启节点后即全局生效。
完整使用示例
以最常见的循环内调用自定义函数为例:
// 开启当前会话的优化
enableDynamicScriptOptimization()
// 循环内调用自定义函数
def normalizePrice(x){ return x * 1.01 }
def calcSignal(x){ return x > 100.0 }
def calcScore(x){ return x * x }
n = 1000000
score = 0.0
for(i in 0..(n-1)){
price = normalizePrice(double(i))
signal = calcSignal(price)
if(signal){ score += calcScore(price) }
}
score
// 需要时关闭当前会话的优化
disableDynamicScriptOptimization()
哪些场景收益最大?
我们基于 3 台集群节点,在 100 万次循环及 50 万条逐笔数据上做了 11 个场景的完整测试,测试环境如下:
| 项目 | 配置 |
|---|---|
| Server 版本 | 3.00.6 |
| CPU类型 | Intel(R) Xeon(R) Silver 4314 CPU @ 2.40GHz |
| 集群拓扑 | 3 个 controller、3 个 datanode、3 个 computenode 和 3 个 agent |
| 数据/计算节点资源 | 每个节点内存上限 256 GB,workerNum=64 |
每个场景均使用确定性输入,并校验开启和关闭优化后的计算结果一致。以下是部分典型场景的耗时对比:
| 场景 | 开启优化前 | 开启优化后 | 性能提升 |
|---|---|---|---|
| 调用链封装在函数体内(100 万次) | 0.93s | 0.28s | 3.3 倍 |
| 循环内并列调用 3 个函数(100 万次) | 1.27s | 0.42s | 3.0 倍 |
| 单层自定义函数调用循环(100 万次) | 0.81s | 0.35s | 2.3 倍 |
| lambda 表达式循环调用(100 万次) | 0.55s | 0.27s | 2.0 倍 |
| VWAP 累计计算(50 万条) | 0.27s | 0.18s | 1.5 倍 |
| 逐条条件判断因子计算(50 万条) | 0.28s | 0.22s | 1.3 倍 |
| 矩阵双重循环(1000×1000) | 0.42s | 0.32s | 1.3 倍 |
| for 循环密集计算(100 万次) | 0.34s | 0.30s | 1.1 倍 |
从场景测试中我们可以看到,循环体内频繁调用自定义函数或 lambda、嵌套多层 if/else 分支、涉及状态累计的逐笔更新计算(如 VWAP)。这类场景优化收益最为显著,普遍获得 2–3 倍加速。
而纯算术运算密集型脚本(如 for 循环内仅执行简单四则运算),这类场景 DolphinDB 解释器本身已经能较高效地执行,动态优化空间相对有限。
因此,动态优化并非必须用于所有脚本。对于函数调用密集、控制流复杂或高频执行的任务,建议优先开启;对于简单纯数值循环,开启通常不会带来负面影响,但投入产出比不高,可根据实际性能测试结果决定。
兼容性说明
优化机制对绝大多数脚本透明兼容。唯一需要留意的是循环内 if 分支中首次赋值的变量——如果该变量在分支外继续使用,建议在循环外预先声明,这是一种良好的编程习惯:
// 推荐写法:循环外预先声明
a = 0
for(i in 1..10){
if(true){ a = 1 }
res = a + 1
}
常见问题
Q1:当前会话开启后,如何确认脚本优化状态?
文档中有自定义函数 isScriptOptEnabled()。它利用已说明的变量作用域差异进行探测,返回 true 表示当前会话已开启优化。具体函数定义可见阅读原文跳转的教程链接。
Q2:为什么只影响当前会话,仍需要管理员权限?
函数的作用范围是当前会话,但服务端将修改会话执行策略的操作限定为管理员。使用配置项为新建会话设置初始状态后,普通用户可以在其会话中执行优化后的脚本。
Q3:如何让新建会话默认开启优化?
在服务配置中设置 enableDynamicScriptOptimization=true,重启对应服务节点后,新建会话将按配置项初始化。
Q4:while 循环可以使用吗?
可以。DolphinDB 3.00.6 支持 while 语句;本教程的性能测试已覆盖 100 万次 while 循环场景。
Q5:如果在优化过程中会话超时断开了,优化会失效吗?
是的,会话超时断开后临时配置会失效,重连后执行 enableDynamicScriptOptimization() 即可开启优化。
立即体验
动态脚本优化已在 DolphinDB 2.00.18 & 3.00.5 及以上版本中提供。
- 快速上手:在你的会话中执行 enableDynamicScriptOptimization(),即刻感受加速效果。
📖 想了解完整的适配指南、性能测试脚本和全局配置说明? 欢迎点击 在 DolphinDB 中启用动态脚本优化,查看官网详细教程,获取全部 11 个场景的测试脚本和校验结果。
让每一微秒的计算都物尽其用,DolphinDB 动态脚本优化,为高性能量化计算而生。

DolphinDB 推出动态脚本优化机制,在不改变业务逻辑的前提下,通过优化解释器的执行路径,循环与分支密集型脚本的运行速度提升 2-3.3 倍。
浙公网安备 33010602011771号