【发布时间】:2014-07-13 06:16:55
【问题描述】:
我想为 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'}
但我担心当我使用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,所以它看起来不像是在扫描整个字符串。
我知道这可能是一个微优化,但我的问题是:字符串相等比较是否使用指针完成,因此与数字相等比较一样快?
【问题讨论】:
-
就像规范说的:如果字符序列相同,则两个不同的字符串是相同的。由于字符串是不可变的,运行时系统可能在它们相同时折叠单独的字符串实例,因此可以在逐个字符比较之前进行直接指针比较。
-
这正是我的问题,它似乎是这样优化的,我想知道什么时候不是真的?什么时候扫描字符串?
-
您可能会通过使用 inequality 而不是相等性的 jsperf 测试了解更多信息。
-
让我也创建它并将其添加到 jsperf
-
为了保证每个字符串实例都是唯一的,并且所有的字符串都具有相同的值,运行时系统必须在字符串连接发生时进行大量昂贵的查找引用指向同一个实例。我怀疑它会这样做。当然,解析器可能会为任何单个代码块中的常量执行此操作。
标签: javascript string performance enums