Jua*_*des 14 javascript string performance enums
我想为JavaScript枚举编写一个小库.对我来说,我需要决定如何存储枚举值.因此,我想在比较时使用最快的方法,但我也想要一些可调试的东西,所以我在使用字符串或数字之间徘徊.我知道我也可以使用对象,但这将是另一个问题
例如
// I don't want this because when debugging, you'd see just the value 0
var Planets = {Earth:0, Mars:1, Venus: 2}
// I'd prefer this so that Planets.Earth gives me a nice readable value ("Earth")
var Planets = {Earth: 'Earth', Mars: 'Mars'}
Run Code Online (Sandbox Code Playgroud)
但是我担心当我比较它们时if (myPlanet === Planet.Earth),字符串比较可能会花费更长的时间(比如它是否处于紧密循环中).这应该是这种情况,因为http://ecma-international.org/ecma-262/5.1/#sec-11.9.6说
如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true; 否则,返回false.
但是当我写一个测试用例时,我发现他们花了相同的时间http://jsperf.com/string-comparison-versus-number-comparison/2所以它似乎不是在扫描整个字符串.
我知道这可能是一个微优化,但我的问题是:是否使用指针进行字符串相等比较,因此与数字相等比较一样快?
use*_*740 16
字符串比较可能 "同样快"(取决于实现和值) - 或者它可能"慢得多".
在ECMAScript规范描述的语义,而不是执行.知道确定的唯一方法是在特定实现上运行它时创建适用的性能基准.
平凡的,我希望情况是1,正在观察字符串实习对特定实现的影响.
也就是说,文字中的所有字符串值(不是字符串对象)都可以简单地插入到池中,这样就implIdentityEq("foo", "foo")可以了 - 也就是说,只需要一个字符串对象.这种内容可以在恒定折叠之后完成,这样,"f" + "oo" -> "foo"只要它支持ECMAScript语义,每次特定实现也是如此.
如果完成了这样的实习,则implStringEq第一次检查可以是评估implIdentityEq(x,y),如果是,则比较是真实的并且在O(1)中执行.如果为false,则需要进行正常的字符串字符比较,即O(min(n,m)).
(立即虚假也可以用x.length != y.length,但这似乎不太重要.)
1虽然在上面我认为对于字符串实习是一个可能的原因,现代的JavaScript实现进行了大量的优化-正因为如此,实习只是一小部分,可以(并)做了各种优化和代码吊装的!
我创造了一个"实习生断路器"jsperf.这些数字与上述假设一致.
如果一个字符串被中断,那么比较是性能的近似来测试"身份" - 虽然它比数字比较慢,但这仍然比逐个字符的字符串比较快得多.
持有上述断言,虽然IE10确实使用快速失败长度检查,但IE10似乎没有考虑传递快速字符串比较的对象标识.
在Chrome和Firefox中,两个不相等的实习字符串也会快速地与两个字符串进行比较 - 在两个不同的实习字符串之间进行比较可能有一个特殊情况.
即使对于小弦(长度= 8),实习也可以快得多.IE10再次显示它没有这种"优化",即使它似乎有一个有效的字符串比较实现.
字符串比较可以作为失败不久甚至比较相同长度的长字符串可能只比前几个字符:作为第一个不同的字符遇到.
常见的JavaScript实现是否使用字符串实习?(但没有给出参考)
是.通常,JS源中的任何文字字符串,标识符或其他常量字符串都是实体.然而,实施细节(例如,实际上是实施的内容)会有所不同,以及实施时的实施情况
请参阅JS_InternString(FF确实有字符串实习,尽管字符串在哪里/如何与JavaScript隐式交互,我不知道)
| 归档时间: |
|
| 查看次数: |
8439 次 |
| 最近记录: |