【问题标题】:How much does include statements hinder performance?include 语句对性能的影响有多大?
【发布时间】:2018-01-06 09:47:20
【问题描述】:

我目前正在编写一个节点服务器,使用 express 和 ejs 作为诱人的引擎。我的一些 .ejs 文件有 7 - 8 个包含嵌套在其中的部分语句。我想知道这是否会占用大量资源,或者会不会好。

【问题讨论】:

  • 对其进行分析。性能不是绝对属性。
  • 可能会缓存包含的内容(至少由操作系统缓存,也可能由 ejs 缓存),因此您可能会在第一次加载它们时看到命中,但在那之后可能根本没有多少。
  • 我如何知道 ejs 是否缓存了包含?
  • 您的问题找到答案了吗?即使我想知道包含实际增加了多少开销。
  • 不,没有运气:(

标签: node.js express ejs


【解决方案1】:

这里是 EJS 维护者。

首先,如果您连续多次读取同一个文件,文件系统会将其缓存在该级别。

但是,如果您想要最大性能,请在选项中设置cache: true。 (docs) 您必须使用renderFile() 或传入文件名才能使其正常工作。如果您使用 Express,当 NODE_ENV 设置为 production 时,cache: true 会自动设置。

请记住,这是假设您的文件永远不会更改。即如果您更改文件,EJS 将只使用旧的缓存版本,直到您重新启动服务器进程。

【讨论】:

  • 谢谢。我现在感觉舒服多了。
【解决方案2】:

我已经测试了 29 个部分的包含加载时间:

<!DOCTYPE html>
<html lang="en">

<? console.time('ejsIncludeTime') ?>
<?include ../partials/head ?>

<body>

   <? include ../partials/header ?>

      <? include ../partials/a ?>
      <? include ../partials/b ?>
      <? include ../partials/c ?>
      <? include ../partials/d ?>
      <? include ../partials/e ?>
      <? include ../partials/f ?>
      <? include ../partials/g ?>
      <? include ../partials/h ?>
      <? include ../partials/i ?>
      <? include ../partials/j ?>
      <? include ../partials/k ?>
      <? include ../partials/l ?>
      <? include ../partials/m ?>
      <? include ../partials/n ?>
      <? include ../partials/o ?>
      <? include ../partials/p ?>
      <? include ../partials/q ?>
      <? include ../partials/r ?>
      <? include ../partials/s ?>
      <? include ../partials/t ?>
      <? include ../partials/u ?>
      <? include ../partials/v ?>
      <? include ../partials/w ?>
      <? include ../partials/x ?>
      <? include ../partials/y ?>
      <? include ../partials/z ?>

    <? include ../partials/footer ?>

    <? console.timeEnd('ejsIncludeTime') ?>

</body>

</html>

从 a-z 开始的每个部分都包含 120 行或更多行 html。事情是这样的:

  • 服务器重启后首次命中ejsIncludeTime: 0.175ms
  • 后续点击ejsIncludeTime0.078ms0.068ms0.058ms0.067ms0.077ms
  • 再次重启服务器并点击ejsIncludeTime: 0.157ms
  • 随后点击0.168ms(在几分钟间隔后点击),0.044ms0.052ms

因此,似乎在某种程度上涉及缓存。第一次命中总是需要 0.150+ms 的包含时间。除了像 0.168 毫秒这样的偶尔峰值(无法真正解释原因。可能是缓存未命中)之外,后续命中的耗时总是少得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 2015-04-23
    • 2020-03-15
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多