缓存 Converter 对象有什么意义吗?建造成本有多高?或者我可以这样做吗?
function convertMarkdown(str) {
var converter = new Markdown.Converter();
return converter.makeHtml(str);
}
缓存 Converter 对象有什么意义吗?建造成本有多高?或者我可以这样做吗?
function convertMarkdown(str) {
var converter = new Markdown.Converter();
return converter.makeHtml(str);
}
转换器对象的构造相当便宜。通常不会进行重大初始化。在我的(相当强大的)机器上进行快速的测量:创建一百万个转换器对象,
因此,即使在最慢的情况下,每个对象也只有 44µs。括号中的数字表示“与构建相比,这大致慢了多少new Date()
?”
所以我要说的是,在大多数情况下,这不会是你的瓶颈,如果你只是偶尔转换一次 Markdown,它不会产生实际的影响。
与使用转换器对象的实际成本进行比较。创建单个转换器对象,然后测量处理字符串"Hello"
(请注意,此字符串甚至不包含任何格式)一百万次需要多长时间,
要处理一些“真实”的 Markdown 数据——这个答案的内容——一百万次,Chrome 需要大约800 秒(我没有在其他浏览器中测量这个)。所以在实际使用中,转换器的构建时间与整体性能并不是很相关。
除非您真的只调用一次或两次,否则我个人无论如何都会缓存该对象,只是因为我认为它更具可读性。
比较
var s = new Markdown.Converter().makeHtml(src);
对比
var s = myConverter.makeHtml(src);
或(使用安德烈亚斯的回答)
var s = convertMarkdown(src);
– 当在更大的上下文中浏览该代码时,第一个版本需要再看一眼,以注意到对象的创建只是该行的目的次要的。
如果你在转换器对象上注册插件,创建甚至需要多个语句,这使得只创建一次对象的情况更好。
这取决于Markdown.Converter
函数以及您调用它的频率,但您可以轻松创建一个包含对转换器实例的引用的函数,因此无需在每次调用时重新创建它:
var convertMarkdown = (function{
var converter = new Markdown.Converter();
return function(str){
return converter.makeHtml(str);
}
})()