Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提高java方法性能_Java_Performance - Fatal编程技术网

提高java方法性能

提高java方法性能,java,performance,Java,Performance,更好的解决方案 public String toString(byte[] array) { if (array == null) return "null"; StringBuilder sb = new StringBuilder(256).append('['); for (int j = 0; j < array.length; ++j) { sb.ap

更好的解决方案

   public String toString(byte[] array) {
        if (array == null)
            return "null";

            StringBuilder  sb = new StringBuilder(256).append('[');
            for (int j = 0; j < array.length; ++j) {
                sb.append(array[j]);
                if (j != array.length - 1)
                sb.append(", ");
            }
        return sb.append(']').toString();
    }
更好的解决方案?如果可能,可以使用更快速的解决方案来执行此方法。

Arrays.toString返回指定数组的字符串表示形式。这可能就足够了:

String s1 = Arrays.toString(byte);
Arrays.toString返回指定数组的字符串表示形式。这可能就足够了:

String s1 = Arrays.toString(byte);
以下一行:

sb.append(array[j]);
有点昂贵,因为它需要将int转换为字符表示,同时跟踪工作缓冲区等

另一种选择: 如果你能接受这样的结果:

[-123, 123, 002, 000,-022, 127]
而不是

[-123, 123, 2, 0, -22, 127]
然后,在我的机器上,以下方法的速度要快2-3倍:

    public String toString(byte[] array) {
        final char DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        if (array == null) {
            return "null";
        }

        char[] res = new char[(array.length * 5) + 1];

        int abs;
        int pos = 0;
        res[pos++] = '[';
        for (int i = 0; i < array.length; i++) {
            if (array[i] < 0) {
                abs = - array[i];
                res[pos++] = '-';
            } else {
                abs = array[i];
                res[pos++] = ' ';
            }
            res[pos++] = (abs >= 100 ? '1' : '0');
            int rest = (abs % 100); 
            res[pos++] = DIGITS[rest / 10]; 
            res[pos++] = DIGITS[rest % 10];
            res[pos++] = ',';
        }
        res[res.length - 1] = ']';

        return new String(res);
    }
以下一行:

sb.append(array[j]);
有点昂贵,因为它需要将int转换为字符表示,同时跟踪工作缓冲区等

另一种选择: 如果你能接受这样的结果:

[-123, 123, 002, 000,-022, 127]
而不是

[-123, 123, 2, 0, -22, 127]
然后,在我的机器上,以下方法的速度要快2-3倍:

    public String toString(byte[] array) {
        final char DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        if (array == null) {
            return "null";
        }

        char[] res = new char[(array.length * 5) + 1];

        int abs;
        int pos = 0;
        res[pos++] = '[';
        for (int i = 0; i < array.length; i++) {
            if (array[i] < 0) {
                abs = - array[i];
                res[pos++] = '-';
            } else {
                abs = array[i];
                res[pos++] = ' ';
            }
            res[pos++] = (abs >= 100 ? '1' : '0');
            int rest = (abs % 100); 
            res[pos++] = DIGITS[rest / 10]; 
            res[pos++] = DIGITS[rest % 10];
            res[pos++] = ',';
        }
        res[res.length - 1] = ']';

        return new String(res);
    }


你想让它做什么。您只是在这里获取字节并将它们作为字符串写入,但我不确定您真正想要实现的是什么。这与Arrays.toString方法的实现相同。除了在原始实现中还有一个条件检查。您希望它做什么。您只是在这里获取字节并将它们作为字符串写入,但我不确定您真正想要实现的是什么。这与Arrays.toString方法的实现相同。除了在最初的实现中还有一个条件检查。好吧,我不会说它更快。。。我想说这更容易-当我尝试同时执行这两个命令时,这个命令给了我一个显著的性能优势。@ambigram\u maker它可能更快。从源代码看,它几乎与问题中的代码相同,减去一些不必要的array.length查找。我的意思是。。。这将产生同样的结果,但尚不清楚OP到底想做什么。StringBuilder没有appendbyte方法,因此会发生扩展转换,然后是字符串转换。至于性能优势,我怀疑人们没有正确衡量。完全准确的JVM微基准并不是微不足道的。有没有最好的算法?嗯,我不会说它更快。。。我想说这更容易-当我尝试同时执行这两个命令时,这个命令给了我一个显著的性能优势。@ambigram\u maker它可能更快。从源代码看,它几乎与问题中的代码相同,减去一些不必要的array.length查找。我的意思是。。。这将产生同样的结果,但尚不清楚OP到底想做什么。StringBuilder没有appendbyte方法,因此会发生扩展转换,然后是字符串转换。至于性能优势,我怀疑人们没有正确衡量。完全准确的JVM微基准并不是微不足道的。有最好的算法吗?您还没有解释为什么希望它以如此快的速度出现在字符串中,所以我假设这是可以的。我确实了解如何在没有0的情况下编写代码。但是,这会使代码复杂化,并使其速度变慢。例如,预编码。分配数组,因此它不需要检查边界,也不需要扩展它等。如果输出中没有可变长度的数字,这会使逻辑复杂化,从而使其速度变慢。正是这些捷径使得上述实现比您的更快。将图像字节转换为stringthis byte[]bytes={-123,123,2,0,-22,127};对于这个字符串mBytes=[-123123,2,0,-22127];需要消除0,使用此方法并添加零在这种情况下不需要0,帮助?您没有解释为什么希望它以如此快的速度出现在字符串中,所以我假设这是可以的。我确实了解如何在没有0的情况下编写代码。但是,这会使代码复杂化,并使其速度变慢。例如,预编码。分配数组,因此它不需要检查边界,也不需要扩展它等。如果输出中没有可变长度的数字,这会使逻辑复杂化,从而使其速度变慢。正是这些捷径使得上述实现比您的更快。将图像字节转换为stringthis byte[]bytes={-123,123,2,0,-22,127};对于这个字符串mBytes=[-123123,2,0,-22127];需要消去0,用这种方法加零,在这种情况下不需要0,有帮助吗?