【问题标题】:Significantly optimize byte operations in for loop (by avoiding a loop?)显着优化 for 循环中的字节操作(通过避免循环?)
【发布时间】:2016-07-15 09:47:18
【问题描述】:

我必须应用到我的流位运算和算术运算的每个字节。

我将代码示例中的 for 循环识别为输出流的瓶颈,并希望对其进行优化。我只是没有想法;)

    private static final long A = 0x1ABCDE361L;
    private static final long C = 0x87;
    private long x;

     //This method belongs to a class that extends java.io.FilteredOutputStream 
    @Override
    public void write(byte[] buffer, int offset, int length) throws IOException {
        for (int i = 0; i < length; i++) {
            x = A * x + C & 0xffffffffffffL;
            buffer[offset + i] = 
                        (byte) (buffer[offset + i] ^ (x>>>16));
        }

        out.write(buffer, offset, length);
    }   

该代码主要用于 Android 设备。

更新

我寻求至少增加 50% 的执行时间。我从我的 CRC32 基准测试中了解到,在大于 30 字节的块上,CRC32#update(byte[] b, int off, int len)CRC32#update(byte b) 快十倍。 (我的块 > 4096 字节)所以,我想我需要一些可以一次处理数组的实现。

【问题讨论】:

  • 在 Android 上,您可以使用 RenderScript 在一堆 GPU 线程上划分操作,从而使处理速度更快。另一种方法是手动使其成为多线程,如果正在运行的设备具有多核处理器,这也将提供更快的处理速度。但我警告说,这是一些相当复杂的代码,您可能想尝试找到一些库来为您组织同步。
  • @thepoosh 它可能在 CodeReview 上,但这也是一个非常有效的 Stack Overflow 问题。它的范围非常狭窄,并提出了一个特定的问题。
  • @OneWorld 具体优化什么?执行时间,内存利用率?
  • @Zak 时间和 CPU 使用率。它降低了我的上传速度。似乎执行效率低下。我觉得我必须让处理器一次执行更大的数据块。

标签: java android performance for-loop bit-manipulation


【解决方案1】:

在 32 位 cpu 上,下面的速度会快一点:

private static final long A = 0x1ABCDE361L;
private static final long C = 0x87;
private long x;

//This method belongs to a class that extends java.io.FilteredOutputStream
@Override
public void write(byte[] buffer, int offset, int length) throws IOException {
    for (int i = 0; i < length; i++) {
        x = A * x + C;
        buffer[offset + i] = (byte) (buffer[offset + i] ^ ((int)x>>>16));
    }

    out.write(buffer, offset, length);
}   

由于x 右移了 16 位,并且将异或运算的结果强制转换为byte,所以实际上只使用了x 的位 16. 到 23.,所以它可以在右移操作之前转换为 32 位,从而使两个操作在 32 位 cpu 上更快。

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多