是否有任何意义缓存页面转换器对象?

时间:2013-06-05 17:31:28

标签: javascript pagedown

缓存Converter对象有什么意义吗?建造有多贵?或者我可以这样做吗?

function convertMarkdown(str) {
    var converter = new Markdown.Converter();
    return converter.makeHtml(str);
}

2 个答案:

答案 0 :(得分:3)

转换器对象构造起来相当便宜。通常没有重大的初始化。对我的(相当强壮的)机器进行快速测量:创建一百万个转换器对象,

  • Chrome需要8秒(5x)
  • Opera需要14秒(10x)
  • IE需要4秒(3x)
  • Safari 5需要2.5秒(5x)
  • Firefox需要44秒(20x)

所以即使在最慢的情况下,每个物体只需44μs。括号中的数字表示“与构建new Date()相比,这大概慢了多少?”

所以我要说的是,在大多数情况下,这不会成为你的瓶颈,如果你只是偶尔转换一次Markdown,那么它就不会产生实际的影响。

与使用转换器对象的的实际成本进行比较。创建一个转换器对象,然后测量处理字符串"Hello"所需的时间(请注意,此字符串甚至不包含任何格式)一百万次,

  • Chrome需要13秒
  • Opera需要86秒
  • IE需要17秒
  • Safari 5需要25秒
  • Firefox需要200秒

要处理一些“真正的”Markdown数据 - 这个答案的内容 - 一百万次,Chrome需要 800秒(我没有在其他浏览器中衡量这一点)。因此在实际使用中,转换器的构建时间与整体性能无关。

除非你真的只调用一次或两次,否则我个人会缓存该对象,只是因为我认为它更具可读性

比较

var s = new Markdown.Converter().makeHtml(src);

VS

var s = myConverter.makeHtml(src);

或(使用Andreas' answer

var s = convertMarkdown(src);

- 当在更大的上下文中浏览该代码时,第一个版本需要第二眼看到对象的创建仅仅是该行的目的。

如果你在转换器对象上注册插件,创建甚至需要多个语句,这样就可以更好地创建对象一次。

答案 1 :(得分:2)

这取决于Markdown.Converter函数以及调用它的频率,但您可以轻松创建一个函数来保存对转换器实例的引用,因此不需要在每次调用时重新创建它:

var convertMarkdown = (function{
    var converter = new Markdown.Converter();
    return function(str){
      return converter.makeHtml(str);
    }
})()