什么是char的最佳替代品?

时间:2014-05-22 16:12:34

标签: javascript char

我正在将一些Java代码移植到JavaScript。我有很多成员元素是char。使这些数字或字符串(字符串始终是单个字符)更有效吗?

更新 它目前在Java中使用的方式是我:

/** alignment is left. */
public static final char TAB_STOP_LEFT = 'l';

/** alignment is center. */
public static final char TAB_STOP_CENTER = 'c';

/** alignment is right. */
public static final char TAB_STOP_RIGHT = 'r';

private char tabStop;

然后我有很多地方可以将其中一个TAB_STOP_ *值分配给tabStop,或者根据特定值测试tabStop的值。没有必要将它作为l / c / r,我只是使用那些来使它更容易在调试器中读取(此代码来自Java 1.3,早在枚举之前)。

最简洁的方法是将它们设为枚举,然后tabStop就是一个数字。但是,如果它更快&如果每个都是1个字符的字符串,则使用较少的内存,我可以这样做。

更新2: 非常感谢Juan Mendes& JLRishe - 非常好的细节。我决定做的就是使用枚举(即数字),因为两者之间的差异很小,而且枚举使一切变得更加清晰。

4 个答案:

答案 0 :(得分:3)

JavaScript中没有char个。您可以使用1个字符串。如果你想使用整数来节省内存,你必须在需要的时候拨打String.fromCharCode,这样就可以创建一个String,所以我觉得很难相信你会得到任何好处存储整数。

这是一个测试,我使用int代表'a'并使用两个字符串和int http://jsperf.com/using-ints-as-chars

创建一个更长的字符串

设置代码

var x = "a";
var y = 97;

从整数创建(383 ops / sec)

var str = '';
for (var i = 0; i < 100000; i++) {
   str += String.fromCharCode(y);
}

从1个字符串创建(592 ops / sec)更快

var str = '';
for (var i = 0; i < 100000; i++) {
   str += x;
}

如果你试图在JS中模拟枚举,这里有一个简单的方法,使用字符串,因此它更容易调试。使用指针比较字符串,因此没有性能损失

function Enum(key1, key2, ...) {
    for (var i = 0; i < arguments.length;; i++) {
        this[arguments[i]] = arguments[i];
    }
}

var Planets = new Enum('Earth', 'Mars', 'Venus');
//
if (someValue == Planets.Earth) {
    // console.log(Planets.Earth) -> outputs "Earth"
}

理想情况下,您无法针对字符串测试枚举,如果您有一个字符串并且想要与枚举进行比较,则需要先将其转换为枚举(以确保它是有效的之一)字符串)。以下是更安全的枚举。

function EnumInstance(value) {  
    this.getValue = function() { // debug only
        return value;
    }
}

function Enum(enumValues) {
    for (var i = 0; i < arguments.length; i++) {
        this[arguments[i]] = new EnumInstance(arguments[i]);
    }
}

Enum.prototype.fromString = function(enumValue) {
    if ( !this[enumValue] ) {
        throw new Error('Invalid enum value: ' + enumValue);
    }
    return this[enumValue];
};


var Planets = new Enum('Earth', 'Venus', 'Mars');
// This outputs false, you can't compare the strings directly    
console.log("Are Planets.Earth and 'Earth' equal?", Planets.Earth == 'Earth');
// This outputs true, first convert into an enum
console.log("Are Planets.Earth and Planets.fromString('Earth') equal?",
    Planets.Earth == Planets.fromString('Earth'));
// If you try Planets.fromString('Pluto'), an exception will be thrown
try {
    var enumValue = Planets.fromString('Pluto')
} catch(e) {
    console.log(e);
}



console.log("Are Planets.Earth and 'Earth' equal?", Planets.Earth == 'Earth');
// This outputs true, first convert into an enum
console.log("Are Planets.Earth an 'Earth' equal?", 
    Planets.Earth == Planets.fromString('Earth'));

更新

https://stackoverflow.com/users/1945651/jlrishe所述,字符串比较没有使用地址比较,就像常规Object一样,所以相等测试将扫描字符串。因此,如果要对字符串进行大量测试,微优化将使用数字而不是字符串。请注意,如果您使用我上面显示的“几乎类型安全”枚举,那么相等性检查仅适用于指针。看到 http://jsperf.com/string-comparison-versus-number-comparisonIs JavaScript string comparison just as fast as number comparison?

答案 1 :(得分:3)

嗯,首先要记住的是&#34;过早优化是所有邪恶的根源&#34;,除非你有合理的担心这会影响你的应用程序的效率,那么这个不太可能是其表现的瓶颈。

如果您的目标是提供类似枚举的功能,那么我认为这更多的原因是数字与字符串不太可能是一个问题,而是为了进一步缓解这些问题,如果您在整个应用程序中一致地引用它们,然后你可以随时来回切换,以测试哪个更有效,然后使用最好的那个。

在Java中,JavaScript中的字符串和其他对象是通过引用存储的,因此在您的情况下,单字符字符串的内存占用空间很大程度上无关紧要,问题在于对该字符串的引用花费了多少。我无法找到任何结论性信息,但我强烈怀疑这最多是64位,因为这是典型现代机器上最大的地址大小。

所以桌子上的问题是:

  1. 内存使用
  2. 比较两个值的效率
  3. 易于调试
  4. 字符串,数字和对象在#1上都应该相等,因为数字占用64位,参考占用64位。

    再次在#2上,它们相当匹配,因为我们可以非常安全地假设JavaScript引擎设计器将在比较它们的值之前对两个字符串执行引用相等性检查,因此如果两个变量引用相同的实例一个字符串,这应该与比较两个数字相当。

    在#3上,字符串比数字略有优势,因为您可以只打印它们,而您需要转换步骤将数字转换为可理解的值。

    所以我建议在短期内坚持使用字符串,然后重新评估是否遇到一些性能问题。如果编写好代码,应该很容易关闭。如上所述,如果您使用对一小组字符串的引用,那么这些字符串的实际大小基本上是无关紧要的。因此,您可以随意使用"left""center""right"作为实际值,以便更好地理解调试。

答案 2 :(得分:0)

与java不同,javascript没有强类型,因此您使用的类型无关紧要。

请阅读:http://www.w3schools.com/js/js_datatypes.asp

var x;               // Now x is undefined
var x = 5;           // Now x is a Number
var x = "John";      // Now x is a String

如果您需要了解每种类型的内存使用情况,可以阅读本文档的第8部分http://people.mozilla.org/~jorendorff/es5.html#sec-8

The String type is the set of all finite ordered sequences of zero or more 16-bit unsigned integer values (“elements”)
The Number type has exactly 18437736874454810627 (that is, 264−253+3) values, representing the double-precision 64-bit

答案 3 :(得分:0)

由于asm.js效率提升基于一直使用数字,避免任何其他类型,我会说是,使用int更有效。比较更容易(更快),并且需要更少的内存。

更新:您可以在此处找到V8(Chrome JS引擎)的效果提示链接。