1

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

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

2 回答 2

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);

对比

var s = myConverter.makeHtml(src);

或(使用安德烈亚斯的回答

var s = convertMarkdown(src);

– 当在更大的上下文中浏览该代码时,第一个版本需要再看一眼,以注意到对象的创建只是该行的目的次要的。

如果你在转换器对象上注册插件,创建甚至需要多个语句,这使得只创建一次对象的情况更好。

于 2013-06-06T07:40:12.313 回答
2

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

var convertMarkdown = (function{
    var converter = new Markdown.Converter();
    return function(str){
      return converter.makeHtml(str);
    }
})()
于 2013-06-05T18:11:50.453 回答