正如我在评论中指出的那样,我认为您正在打破处理器的限制。因为这可能对其他人有帮助,所以我将其分解。这是将整数转换为字节的循环:
for(int i = 0; i < input.length; i++) { output[i*4] = (byte)(input[i] & 0xFF); output[i*4 + 1] = (byte)((input[i] & 0xFF00) >>> 8); output[i*4 + 2] = (byte)((input[i] & 0xFF0000) >>> 16); output[i*4 + 3] = (byte)((input[i] & 0xFF000000) >>> 24); }该循环执行500,000次。您的600Mhz处理器每秒可以处理大约600,000,000次操作。因此,循环的每次迭代将为每个操作消耗大约1/1200秒。
同样,使用非常粗糙的数字(我不知道ARM指令集,因此每个动作可能或多或少),这是一个操作计数:
- 测试/分支:5(检索计数器,检索数组长度,比较,分支,增量计数器)
- 掩码和移位:10 x 4(检索计数器,检索输入数组基数,相加,检索掩码,以及移位,乘法计数器,相加偏移量,相加到输出基数,存储)
好的,所以从粗略的角度来看,此循环 最多
需要55/1200秒或0.04秒。但是,您没有处理最佳情况。一方面,对于如此大的阵列,您将不会从处理器缓存中受益,因此,您将在每个阵列存储和加载中引入等待状态。
另外,我描述的基本操作可能会也可能不会直接翻译成机器代码。如果没有(我怀疑没有),那么循环将比我所描述的花费更多。
最后,如果您真的很不幸,JVM尚未对您的代码进行JIT编辑,因此对于循环的某些部分(或全部),它解释字节码而不是执行本机指令。我对Dalvik的了解不足,无法对此发表评论。


![通过Java有效地通过套接字发送大int [] 通过Java有效地通过套接字发送大int []](http://www.mshxw.com/aiimages/31/508993.png)
