我有以下代码用于将字节数组编码为十六进制字符串
private static final char[] HEX_CHARS = "0123456789abcdef".toCharArray();
public static void WriteHexBytes(byte[] data, StringBuilder sb)
{
char[] chars = new char[data.length*2];
for (int i = 0; i < data.length; ++i)
{
chars[2*i] = HEX_CHARS[(data[i] & 0xF0) >>> 4];
chars[2*i + 1] = HEX_CHARS[data[i] & 0x0F];
}
sb.append(chars);
}
for
循环非常慢,在真实设备上编码 3MB
字节大约需要 10 秒
。在模拟器上它需要永远。
sb.append
立即执行。
这正常吗?对我来说似乎很慢?是什么导致缓慢?
在三星 Galaxy Tab 2 7.0 上测试
最佳答案
从 Java 的角度来看,是否存在比您展示的方法更快的方法并不明显。 Apache Common's code看起来比你的稍微好一点,但这实际上只是一个模糊的猜测。
从现在开始,如果您需要更多,恐怕您只需要在您的硬件上进行 Microbenchmark :(。
只是出于无所事事……我做了微基准测试(临时的,不科学的)你的解决方案和我刚刚制定的解决方案 - 你赢了两倍。这是我尝试过的:
public static void niko(byte[] data, StringBuilder sb)
{
for (byte element : data) {
sb.append(toChar((element & 0xf0) >>> 4));
sb.append(toChar(element & 0x0f));
}
}
static char toChar(int b) {
int offset = b < 10 ? 48 : 87;
return (char) (b + offset);
}
通过 10 MB 100 次,您的代码在 4 秒内完成,我的代码在 8 秒内完成。但请记住,这非常依赖于硬件、JVM 依赖性等。
关于java - 为什么这段代码很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16252609/