如何将XSLT执行时间精确到毫秒



我有一个XSLT(在Sitecore下运行),我想对它进行基准测试。

例如:

<xsl:variable name="start_ms" select="TIME IN MILLIS" />
Do something
<xsl:variable name="end_ms" select="TIME IN MILLIS" />
<xsl:variable name="total_ms" select="$end_ms - $start_ms" />
Do something else

不幸的是,我无法将时间精确到毫秒。

如果我包括xmlns:date="http://exslt.org/dates-and-times",我得到date:dateTime(),但这只适用于秒精度。

类似地,sc:formatdate(sc:isoNow(),'ss.ffff')也只达到秒精度。

Sitecore的"调试页面"功能会告诉我运行整个XSLT需要多长时间,但它不会让我对XSLT的各个组件进行基准测试。

有办法做到这一点吗?

Sitecore的"调试页面"功能会告诉我它需要多长时间运行整个XSLT,但它不允许我对单个XSLT进行基准测试XSLT的组件。

有办法做到这一点吗?

这在很大程度上取决于您使用的XSLT处理器,结果通常可能不可信

即使您编写自己的扩展函数并从XSLT代码中调用它们(这似乎是实现所需定时精度的唯一方法),也无法保证扩展函数会在预期的时候被调用。或者当期望一个调用时,它不会被调用不止一次。这是因为我们无法预测和预测特定XSLT处理器所使用的优化器的决策。

一些XSLT处理器实现延迟求值——除非表达式对于生成结果是绝对必要的,否则不会对其求值。这样的处理器只有在其结果被使用时才会执行对定时扩展函数的调用——这可能是在测量处理结束时——所以在这种情况下,任何测量处理都是"瞬时的"。

如果您试图识别处理瓶颈,可以将单独的组件一个接一个地移动到新的XSLT中,使用调试工具在每一步进行毫秒基准测试。

最新更新