<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />保存到数据库太慢(每分钟 10k 条记录)有回复锐化这让我想起了为 JMP 13 计划的性能增强。(感谢 Jeff Polzin!)
Msharp 提到数据库更新功能比另一种技术更快,但仍然不是很好。(看看布赖恩布恩也是对原始问题的回答……另一个 JMP 13 性能增强。)我查看了脚本(这是使用 JSL 和 SQL 的一种巧妙方法)并看到它向列表末尾添加了项目,如下所示:
// 向前构建
转发列表 = {};
开始时间 = Tick Seconds();
对于 ( i = 0, i < 30000, i++,
插入(forwardList,我)
);
停止时间 = Tick Seconds();
显示(停止时间 - 开始时间);
停止时间 - 开始时间 = 1.68333333334886; // JMP 12 次
这在 JMP 12 及更早版本中确实很慢。该列表由其第一项在内部保存,最后一项必须通过遍历列表的长度来发现。InsertInto() 默认添加到列表的末尾。 这导致 N^2 性能:列表长度加倍时间增加四倍。有一种方法可以避免它:
// 反向构建
反向列表 = {};
开始时间 = Tick Seconds();
对于 ( i = 0, i < 30000, i++,
插入(反向列表,我,1)
);
反向列表 = 反向(反向列表);
停止时间 = Tick Seconds();
显示(停止时间 - 开始时间);
停止时间 - 开始时间 = 0.0333333334419876;
那更好。使用第三个参数 1 调用 insertinto() 函数以插入到列表的前面。请注意,对 reverse() 函数的调用也计入了报告时间。答案是一样的:
显示(反向列表==正向列表);
反向列表 == 前向列表 = 1; // 很好,无论哪种方式,答案都是一样的
期待 JMP 13?这里是:
// 向前构建
转发列表 = {};
开始时间 = Tick Seconds();
对于 ( i = 0, i < 30000, i++,
插入(forwardList,我)
);
停止时间 = Tick Seconds();
显示(停止时间 - 开始时间);
停止时间 - 开始时间 = 0.0166666668374091; // 杰夫太棒了!
长话短说,如果您的 JMP 12 脚本正在构建一个包含 100 多个左右项目的列表,请在前面插入,然后反向插入。无论哪种方式,JMP 13 都会很快。