在SSJS中使用HashMap.put方法时性能下降

xpa*_*oob 4 xpages xpages-ssjs

在我的XPages应用程序中,我经常使用SSJS对象(com.ibm.jscript.std.ObjectObject)来缓存数据.如果我使用java.util.HashMaps来检查性能是否有所提高,我会对以下代码片段(SSJS)的执行时间进行基准测试:

SSJS基准测试的代码片段

所有三个代码片段都是相同的:它们创建并填充SSJS对象或具有不同类型数据/对象的HashMap.对于每个片段,我测量了超过1000次运行的平均执行时间,其中n(=片段中的最大循环索引)为1000000(100万).基准测试是使用java.lang.System.nanoTime在Domino 9.0.1服务器上执行的.

所述的比率执行时间如下:

  • T [HashMap]/T [SSJS对象] 154%
  • T [HashMap with put method]/T [SSJS Object]的266%
  • T [HashMap with put method]/T [HashMap] 172%

换一种说法:

  • 填充HashMap比填充SSJS对象花费的时间长约54%
  • 使用put方法填充HashMap比填充SSJS对象长约166%
  • 使用put方法填充HashMap比使用SSJS填充HashMap需要大约72%"." 符号

我的问题如下:

  1. 我经常看到SSJS代码,其中HashMaps用于存储数据.如果它们提供更好的性能,为什么不使用标准SSJS对象?
  2. 为什么使用put方法代替SSJS"效率低得多".用于设置HashMap值的表示法?

stw*_*sel 8

看看你的代码(你应该把代码放在那里,而不是图像),你要比较苹果和橘子.

  oo = {};
Run Code Online (Sandbox Code Playgroud)

初始化JS对象一次,在第二个循环中它覆盖现有对象.

 hw = new HashMap();
Run Code Online (Sandbox Code Playgroud)

每次生成一个新对象,并将旧对象抛出到垃圾收集器.那会慢一些.

您的结论:您的数据不支持" 填充 Hashmap花费xx更长时间".您编写的代码支持" 以快速顺序创建和丢弃 HashMaps更慢".

如果您想进行合理的测试,您需要:

  • 创建一个对象(这是通常的用例)并将"很多东西"放入其中并获得真实的想法:放入100,000个内容.然后读取100,000个,然后更新100,000个内容.

HashMaps的主要原因:您也可以在Java中使用它们,并且您不能像使用JavaScript对象那样意外地向它们添加功能.点对点放置转换是由于不同的类型转换机制.

  • 你是完全正确的:我创建了新的基准,用于向SINGLE ObjectObject和HashMap添加数据.只要条目数低于~500,ObjectObject的性能就比HashMap好.但是,当添加超过约500个条目时,ObjectObject会更慢.例如,在我的基准测试算法中,向ObjectObject添加10000个项目的时间比HashMap多****倍.再次感谢您的帮助和专业建议! (3认同)