Javascript JS方言的二进制处理速度
使用Adobe的Javascript方言ExtendScript(据说基于),我的目标是处理二进制文件ES不支持,因此我将部分文件读入字符串,并使用Javascript JS方言的二进制处理速度,javascript,performance,extendscript,Javascript,Performance,Extendscript,使用Adobe的Javascript方言ExtendScript(据说基于),我的目标是处理二进制文件ES不支持,因此我将部分文件读入字符串,并使用toCharCode访问字节、整数和长值 然而,这会带来严重的速度惩罚。阅读215526项(混合字节、字和长),我得到以下性能: charCodeAt 29368 ms(注意,由于随机磁盘读取波动,我的计时中有+/-5%的显著抖动) 所以我可以用这个来代替: String.prototype.wordValueAt = function(index)
toCharCode
访问字节、整数和长值
然而,这会带来严重的速度惩罚。阅读215526项(混合字节、字和长),我得到以下性能:
charCodeAt 29368 ms(注意,由于随机磁盘读取波动,我的计时中有+/-5%的显著抖动)
所以我可以用这个来代替:
String.prototype.wordValueAt = function(index)
{
index = index || 0;
return ascToBin[this[index]]^ascToBinHS[this[index+1]];
}
结果如下:
ascTobin查找:29528毫秒
几乎不重要——有时由于时间抖动,速度会稍微快一点。省略索引
虚拟检查不会产生重大影响
读取算法本身不容易改进:数据由指向更多数据的指针组成,据我所知,所有数据只读取一次。数据是非顺序存储的,但我会尽可能多地读取缓冲区(而不是一次读取整个文件)。无论如何,我不认为磁盘访问是一个真正的瓶颈,因为指向数据及其相关数据的指针被打包成1/2K块(其中有284个,总计11616个数据包,在这个特定的最坏情况文件中)
一个典型的大型ish文件在3.5秒内加载,这是可以的,但我仍然想去掉每一个可能的纳秒。除了使用String和
charCodeAt
,还有更好的替代方法吗?没有,不是charCodeAt
方法慢,而是实现慢
如果可以使用其他实现或语言和实现,您应该这样做。不,不是
charCodeAt
方法慢,而是实现慢
如果可以使用其他实现或语言和实现,您应该这样做。不,不是
charCodeAt
方法慢,而是实现慢
如果可以使用其他实现或语言和实现,您应该这样做。不,不是
charCodeAt
方法慢,而是实现慢
如果可以使用其他实现或语言和实现,您应该这样做。我的脚本的具体实现,还是ExtendScript的一般实现?我同意使用一个“真实”的语言会更快——Adobe的DOM可以通过C++访问——但是ExtendScript(大部分)是版本和平台无关的,这对我来说是相当重要的。@ Jongware语言不是快速的或缓慢的。在许多实现中,如SpiderMonkey和V8,优化编译器可以将
.charCodeAt()
编译成非常快速的代码。但很明显,您正在使用的实现并没有做到这一点。是我的脚本的实现,还是ExtendScript的实现?我同意使用一个“真实”的语言会更快——Adobe的DOM可以通过C++访问——但是ExtendScript(大部分)是版本和平台无关的,这对我来说是相当重要的。@ Jongware语言不是快速的或缓慢的。在许多实现中,如SpiderMonkey和V8,优化编译器可以将.charCodeAt()
编译成非常快速的代码。但很明显,您正在使用的实现并没有做到这一点。是我的脚本的实现,还是ExtendScript的实现?我同意使用一个“真实”的语言会更快——Adobe的DOM可以通过C++访问——但是ExtendScript(大部分)是版本和平台无关的,这对我来说是相当重要的。@ Jongware语言不是快速的或缓慢的。在许多实现中,如SpiderMonkey和V8,优化编译器可以将.charCodeAt()
编译成非常快速的代码。但很明显,您正在使用的实现并没有做到这一点。是我的脚本的实现,还是ExtendScript的实现?我同意使用一个“真实”的语言会更快——Adobe的DOM可以通过C++访问——但是ExtendScript(大部分)是版本和平台无关的,这对我来说是相当重要的。@ Jongware语言不是快速的或缓慢的。在许多实现中,如SpiderMonkey和V8,优化编译器可以将.charCodeAt()
编译成非常快速的代码。但很明显,您使用的实现并没有做到这一点。
var ascToBin = {};
var ascToBinH = {};
for (i=0; i<256; i++)
{
ascToBin[String.fromCharCode(i)] = i;
ascToBinH[String.fromCharCode(i)] = i<<8;
}
String.prototype.wordValueAt = function(index)
{
index = index || 0;
return ascToBin[this[index]]^ascToBinHS[this[index+1]];
}