【问题标题】:Actionscript, improving xor performance?Actionscript,提高异或性能?
【发布时间】:2017-08-16 17:34:56
【问题描述】:

我正在使用下面的代码来处理一些大文件。

var joinedBytes:ByteArray = new ByteArray;
joinedBytes.length = _chunkSize;

for (var i:Number = 0; i < _chunkSize; i++) {
    joinedBytes.writeByte(_xorBytesBuffer[i]^_rndBytesBuffer[i]);
}

在桌面上处理 10mb 的数据大约需要 2.5 秒。

这是正常的表现吗?

有什么方法可以加快速度吗?

我认为有些时候是写入字节数组。

编辑:

_xorBytesBuffer 和 _rndBytesBuffer 都是字节数组。

【问题讨论】:

  • 等等,我链接的问题也是你写的。你没看懂答案吗?
  • 我做到了,并且我已经实现了设置字节数组大小并且不在循环内使用 vars。另一个问题是不同的情况。我希望我的异或时间与我的随机字节生成时间一样低。

标签: actionscript-3 actionscript xor


【解决方案1】:

我没有测试一切。我可能在下面的某个地方错了,但是...

ByteArray 更快

[i] 建议您使用 Vector/Array 使用另一个 ByteArray_xorBytesBuffer_rndBytesBuffer 应该加快速度。 您还想对更大的数据进行操作,即 writeUnsignedInt() 而不是 writeByte()

另见this question

uint 比 Number 更快

如果您只有 10MB,您想使用 var i:uint 而不是 Number

另一件事是您可以将 i++ 替换为 ++i 虽然我没有真正测试这是否有很大影响 - 我只是听说它更快。

删除额外的步骤。

您甚至可以尝试以下方法:

for (var i:uint = 0; i < _chunkSize;) {
    joinedBytes.writeByte(_xorBytesBuffer[i]^_rndBytesBuffer[i++]);
}

请告诉我们_rndBytesBuffer[i++] 有什么不同;)

等等,我只是说不要使用索引,而是使用另一个 ByteArrays……好吧,如果您仍然想尝试上面的方法,请告诉我们它的性能;)

确保您的条件检查尽可能简单。

确保你有 var _chunkSize:uint 之类的东西,而不是

function _chunkSize(){return something;}

【讨论】:

  • 我现在在 xor 中使用 int 和 i++,从 15 秒到 14 花费了 60mb 的数据。在进一步测试中,似乎 60% 的循环执行时间是 _xorBytesBuffer[i]^ _rndBytesBuffer[i] 和另外 40% 是 writeByte。
  • 为什么不像上一个问题那样使用b.writeUnsignedInt()?这可能是最大的影响。
  • 我没有完全理解那部分,当尝试它输出的数据多于应有的数据,所以我认为我做错了什么。
  • 您需要处理多少数据?如果你有大量数据,你应该考虑用 C++ 等语言编写该部分。
  • 最多几个 GB。所以它目前在体面的桌面硬件上需要 20 多分钟。
猜你喜欢
  • 2019-08-06
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多