在javascript中将任何字符串转换为数组的最快方法

在javascript中将任何字符串转换为数组的最快方法,javascript,Javascript,我目前正在用Javascript开发GameBoyColor模拟器 现在将64k ROM文件加载到内存单元大约需要60秒。这就是功能: loadROM: function (file) { var reader = new FileReader(); reader.onload = function () { var start = new Date(); console.log("start", start.getTime());

我目前正在用Javascript开发GameBoyColor模拟器

现在将64k ROM文件加载到内存单元大约需要60秒。这就是功能:

loadROM: function (file) {
    var reader = new FileReader();

    reader.onload = function () {
        var start = new Date();
        console.log("start", start.getTime());

        this.__ROM = new Uint8Array(reader.result.length);

        for (var i = 0; i < reader.result.length; i++) {
            this.__ROM[i] = (reader.result.charCodeAt(i) & 0xFF);
        }

        var end = new Date();
        console.log("end", end.getTime());

        console.log((end.getTime() - start.getTime()) + " for " + i + " iterations");

        this._trigger("onROMLoaded");
    }.context(this);

    reader.readAsBinaryString(file);
}
loadROM:函数(文件){
var reader=new FileReader();
reader.onload=函数(){
var start=新日期();
log(“start”,start.getTime());
此._ROM=新的Uint8Array(reader.result.length);
for(var i=0;i
reader.result
是作为字符串的ROM文件,而
是这个。u ROM
是数组。重要的是for循环,在这里我获取每个字符并将其推送到内存的ROM数组中


这需要很长时间。所以问题是如何加速这件事。是否有更好的方法将字符串转换为数组?

您应该能够使用
split()
而不是循环本机执行此操作:

// See the delimiter used
this.__ROM = reader.result.split('');

// And to do the bitwise AND on each byte, use map()
this.__ROM = this.__ROM.map(function(i) {
    return i & 0xFF;
});
或在一个步骤中(无需写入此。u ROM两次):


问题是,我忘了什么。我仍然需要访问每个字符,因为我需要将每个字符的范围限定为0xFF@JohannesKlauß-也为此添加了一个解决方案。然而,速度的提升主要是因为本机实现的分割方法。。。这真是太快了!非常感谢。@techfoobar:我要求在称之为“速度提升”之前,先看看这两种方法的基准测试如果map和内联函数的开销不能完全消除
split()
方法的提升,我也不会感到惊讶。虽然我认为现代JS解释器会非常准时。@haylem Well techfoobars方法大约需要21毫秒,而我的方法需要32778秒。既然你想要一个数组,为什么不使用readAsArrayBuffer?因为我需要二进制格式。arraybuffer将提供与readstring+转换相同的结果,只是更快。但这正是readAsArrayBuffer能给你的。代码:this.\uu ROM=新的UInt8Array(reader.result);一切都结束了。你有没有检查过任何值>0xFF???我的猜测是没有,所以事实上你只需要复制,没有面具。除此之外,字符串接受数组符号myString[i],无需使用charCodeAt。缓存数组和数组长度-并尝试阅读ArrayBuffer:-)-
this.__ROM = reader.result.split('').map(function(i) {
    return i & 0xFF;
});