Javascript - 在V8中添加到String.prototype的函数性能不佳?

时间:2011-12-06 11:37:21

标签: javascript performance google-chrome v8

我一直在使用一些代码从字符串中提取无符号的16位值。

我发现将此函数添加到String的原型中:

String.prototype.UInt16 = function(n) {
    return this.charCodeAt(n) + 256 * this.charCodeAt(n + 1);
};

比仅使用String作为参数的函数慢得多:

var UInt16 = function(s, n) {
    return s.charCodeAt(n) + 256 * s.charCodeAt(n + 1);
};

在Firefox中,差异仅为两倍,但在Chrome 15中,它的百分之一倍!

查看http://jsperf.com/string-to-uint16

的搜索结果

任何人都可以为此提供解释,和/或提供使用原型的替代方法,而不会影响性能吗?

2 个答案:

答案 0 :(得分:1)

从基元访问原型(因为它不是对象)比从对象访问原型要慢得多。

http://jsperf.com/string-to-uint16/2

对我来说,Chrome的速度提高了10倍,而firefox的速度提高了2倍。

使用原型是否存在实际瓶颈?如果你每秒不需要数百万的操作,它仍然非常快。如果需要,只需使用一个函数。

答案 1 :(得分:0)

Alnitak ,我做了一个快速的jsperf test(我不小心发布了),它表明用户类型的原型并不慢。在考虑像V8这样的引擎是如何工作的时候,在将代码添加到内置对象时,Java编译的行为会有很大不同。