在 SSJS 中使用 HashMap.put 方法时的性能损失
Performance loss when using HashMap.put method in SSJS
在我的 XPages 应用程序中,我经常使用 SSJS 对象 (com.ibm.jscript.std.ObjectObject) 来缓存数据。为了检查如果我改用 java.util.HashMaps 性能是否提高,我对以下代码片段 (SSJS) 的执行时间进行了基准测试:
所有三个代码片段都做同样的事情:它们创建并填充一个 SSJS 对象或一个 HashMap,其中包含不同类型的数据/对象。对于每个片段,我测量了超过 1000 次运行的平均执行时间,其中 n(= 片段中的最大循环索引)为 1000000(100 万)。基准测试是在 Domino 9.0.1 服务器上使用 java.lang.System.nanoTime .
执行的
的执行次数的比例如下:
- T[HashMap]/T[SSJS 对象]154%
- T[带 put 方法的 HashMap]/T[SSJS 对象]266%
- 172% for T[HashMap with put method] / T[HashMap]
换句话说:
- 填充 HashMap 的时间比填充 SSJS 对象的时间长约 54%
- 使用 put 方法填充 HashMap 比填充 SSJS 对象花费的时间长约 166%
- 使用 put 方法填充 HashMap 比使用 SSJS "." 填充 HashMap 花费的时间长约 72%。符号
我的问题如下:
- 我经常看到使用 HashMap 存储数据的 SSJS 代码。
为什么不使用标准的 SSJS 对象,如果它们提供更好的
性能?
- 为什么使用 put 的效率要低得多
方法而不是 SSJS“。”设置 a 的值的符号
哈希图?
查看你的代码(你应该把代码放在那里,而不是图像),你是在比较苹果和橘子。
oo = {};
初始化一次JS对象,在第二次循环中覆盖现有对象。
hw = new HashMap();
每次生成一个新的对象,把旧的扔给垃圾收集器。那会比较慢。
您的结论:您的数据不支持“填充 一个 Hashmap 花费了 xx 长”。您编写的代码支持“创建和丢弃 HashMaps in quick sequence is slower”。
如果你想运行一个合理的测试你需要:
- 创建一个对象(这是通常的用例)并将 "a lot of things" 放入其中并获得真正的想法:放入 100,000 个东西。然后读取 100,000 个,然后更新 100,000 个东西。
HashMap 的主要原因:您也可以在 Java 中使用它们,并且您不会像使用 JavaScript 对象那样意外地向它们添加功能。 dot 与 put 转换是由于不同的类型转换机制。
在我的 XPages 应用程序中,我经常使用 SSJS 对象 (com.ibm.jscript.std.ObjectObject) 来缓存数据。为了检查如果我改用 java.util.HashMaps 性能是否提高,我对以下代码片段 (SSJS) 的执行时间进行了基准测试:
所有三个代码片段都做同样的事情:它们创建并填充一个 SSJS 对象或一个 HashMap,其中包含不同类型的数据/对象。对于每个片段,我测量了超过 1000 次运行的平均执行时间,其中 n(= 片段中的最大循环索引)为 1000000(100 万)。基准测试是在 Domino 9.0.1 服务器上使用 java.lang.System.nanoTime .
执行的的执行次数的比例如下:
- T[HashMap]/T[SSJS 对象]154%
- T[带 put 方法的 HashMap]/T[SSJS 对象]266%
- 172% for T[HashMap with put method] / T[HashMap]
换句话说:
- 填充 HashMap 的时间比填充 SSJS 对象的时间长约 54%
- 使用 put 方法填充 HashMap 比填充 SSJS 对象花费的时间长约 166%
- 使用 put 方法填充 HashMap 比使用 SSJS "." 填充 HashMap 花费的时间长约 72%。符号
我的问题如下:
- 我经常看到使用 HashMap 存储数据的 SSJS 代码。 为什么不使用标准的 SSJS 对象,如果它们提供更好的 性能?
- 为什么使用 put 的效率要低得多 方法而不是 SSJS“。”设置 a 的值的符号 哈希图?
查看你的代码(你应该把代码放在那里,而不是图像),你是在比较苹果和橘子。
oo = {};
初始化一次JS对象,在第二次循环中覆盖现有对象。
hw = new HashMap();
每次生成一个新的对象,把旧的扔给垃圾收集器。那会比较慢。
您的结论:您的数据不支持“填充 一个 Hashmap 花费了 xx 长”。您编写的代码支持“创建和丢弃 HashMaps in quick sequence is slower”。
如果你想运行一个合理的测试你需要:
- 创建一个对象(这是通常的用例)并将 "a lot of things" 放入其中并获得真正的想法:放入 100,000 个东西。然后读取 100,000 个,然后更新 100,000 个东西。
HashMap 的主要原因:您也可以在 Java 中使用它们,并且您不会像使用 JavaScript 对象那样意外地向它们添加功能。 dot 与 put 转换是由于不同的类型转换机制。