String 字符串';是分裂还是性格

String 字符串';是分裂还是性格,string,actionscript-3,flash,String,Actionscript 3,Flash,我正在写一个赌场游戏,我需要加密通过套接字传递的所有数据,所以我希望尽可能多的性能,因为加密和解密可能会发生很多,我不希望它太慢 我的问题是,当你有一个String并且你想高速获取它的字符,myString.charAt(i)或者拥有var a:Array=myString.split(“”)时,哪个性能更快

我正在写一个赌场游戏,我需要加密通过套接字传递的所有数据,所以我希望尽可能多的性能,因为加密和解密可能会发生很多,我不希望它太慢

我的问题是,当你有一个
String
并且你想高速获取它的字符,
myString.charAt(i)
或者拥有
var a:Array=myString.split(“”)时,哪个性能更快a[i]


我的
for
循环可能运行60-100次或更多。提前感谢

在代码执行之前和之后使用getTimer,您可以随时测试自己,看看在您的情况下什么更有效,以及它是否重要:

var testTime:int;
var before:int = getTimer();

//You code here

testTime = getTimer() - before;
trace(testTime);
因此,基本上,输入两个算法并检查执行所需的时间


编辑:启示录3自然是正确的。最好使用new Date.time()而不是getTimer(),因为它在冻结时更准确

通过在代码执行之前和之后使用getTimer,您可以始终测试自己,以查看在您的情况下什么更有效,以及它是否有意义:

var testTime:int;
var before:int = getTimer();

//You code here

testTime = getTimer() - before;
trace(testTime);
因此,基本上,输入两个算法并检查执行所需的时间


编辑:启示录3自然是正确的。最好使用new Date.time()而不是getTimer(),因为它在冻结时更准确

本比约的建议是可靠的。如果性能确实是一个问题,那么最好的测试用例是您实际使用代码的情况,尤其是因为垃圾收集和JIT'er使得实际性能无法预测

也就是说,
charAt
方法通常比
split()
快(20-50%)。内存方面应该没有太大区别——这两种方法都是为每个字符创建一个新字符串。除此之外,
split()
显然还创建了一个额外的数组

这两种方法的比较:

字符:

var s:String = "";
for (var j:int = 0; j < len; j++)
{
    // The string concat seems to be enough to confuse the JIT compiler.
    s += v.charAt(j);
}
平均值=每次运行的平均时间(1000次迭代)

Min=单次运行的最短时间

Max=单次运行的最长时间

Iter=单个迭代的平均时间

运行之间的差异相当大,可能是由于某些运行期间发生了垃圾收集。但结果始终支持
charAt()
。在每次运行之前调用一次
split()
调用,而不是在每次迭代中重做调用,没有多大区别。换句话说,性能上的差异确实在于访问数组的速度比调用
charAt()
慢。然而,使用
indexOf
而不是正则表达式来搜索字符串并不是很大的区别


一般来说,虽然这不是一条硬性规定,但对于字符串操作这样的简单任务,最明显的方法可能是更快的方法。FlashPlayer团队花了大量时间优化字符串操作、连接等。

benbjo的建议是可靠的。如果性能确实是一个问题,那么最好的测试用例是您实际使用代码的情况,尤其是因为垃圾收集和JIT'er使得实际性能无法预测

也就是说,
charAt
方法通常比
split()
快(20-50%)。内存方面应该没有太大区别——这两种方法都是为每个字符创建一个新字符串。除此之外,
split()
显然还创建了一个额外的数组

这两种方法的比较:

字符:

var s:String = "";
for (var j:int = 0; j < len; j++)
{
    // The string concat seems to be enough to confuse the JIT compiler.
    s += v.charAt(j);
}
平均值=每次运行的平均时间(1000次迭代)

Min=单次运行的最短时间

Max=单次运行的最长时间

Iter=单个迭代的平均时间

运行之间的差异相当大,可能是由于某些运行期间发生了垃圾收集。但结果始终支持
charAt()
。在每次运行之前调用一次
split()
调用,而不是在每次迭代中重做调用,没有多大区别。换句话说,性能上的差异确实在于访问数组的速度比调用
charAt()
慢。然而,使用
indexOf
而不是正则表达式来搜索字符串并不是很大的区别


一般来说,虽然这不是一条硬性规定,但对于字符串操作这样的简单任务,最明显的方法可能是更快的方法。FlashPlayer团队花了大量时间优化字符串操作、连接等。

好的,这是一个太多的评论

首先,很难说你想做什么,为什么你需要比较这些东西,但正如我已经说过的。如果您正在研究序列化,请学习使用内置序列化。当有人重新发明轮子的时候,我已经见过很多次了,它在每个可能的方面都要比内置的差几个数量级。这样做的唯一借口就是你在学习事情是如何运作的

当然,如果你打算处理数十万个文件,你可以用C语言编写,在AIR中使用本机扩展名或类似的东西,这肯定会成功

现在,如果您想知道处理字符串数据的最快方法,那将不是我们的选择。最快的方法是将其加载到域内存中,并使用所谓的“炼金术操作码”访问数据字节。如果字符串使用8位编码,这将非常快,而如果使用Unicode,则不会那么快。显然,如果您要测试之前建议的内容,这也会影响您的测试

第二个最佳选择:由整数组成的向量,它们是字符代码。这些都是更好的优化和使用不同