2011-07-09 48 views
4

通过简单的文件加密/解密做一些练习,目前我正在读一串字节,并对每个字节执行相应的位操作,然后将它们写入输出文件。对大量字节进行位操作

这种方法看起来很慢。例如,如果我想通过0xFF对每个字节进行XOR运算,我会循环遍历每个字节和XOR 0xFF,而不是做一些魔术,并且每个字节都快速异或。

是否有更好的方法来执行位操作而不是一次一个字节?

+1

你现在如何存储字节?作为整数列表?除非你有超过一打的MB,否则字节表示不太可能是减速的根源。在投机之前先测量(即轮廓)。 – phihag

+0

你确定这些标签应该是加密/解密吗?我在你的问题中没有看到任何加密操作... –

回答

3

不管是什么,似乎每个字节将不得不从内存

  • 读,
  • 以某种方式修改,
  • 写回内存。

可以通过通过对4进行XOR运算,节省时间的位(没有双关语意)一次上多个字节操作,例如,或甚至8个字节的整数,因此,将相关联的开销与循环管理,大致,一个因子4或8,但这种改善可能不会达到整体算法的显着收益。

通过读取表中预先计算的值来替换CPU /语言的“本地”位操作(异或,移位,旋转等),可以找到其他改进。然而要小心,这些本地操作通常是相当优化的,并且您必须非常勤奋地设计外部等效操作,并精确测量这些操作的相对性能。

编辑:糟糕,我刚刚注意到[Python]标记,并且在另一个响应中也引用了numpy。
要小心......虽然Numpy按位数组的建议是合理的,但这一切都取决于手头问题的实际参数。例如,排队numpy的按位函数所隐含的底层数组可能会损失相当长的时间。 看到这个似乎非常相关的Stack Overflow question。虽然专注于XOR操作,但这个问题提供了很多可操作的提示,用于改善循环等,以及用于概要分析。