java - 为什么这段代码很慢?

标签 java android performance

我有以下代码用于将字节数组编码为十六进制字符串

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/

相关文章:

java - GridBagLayout 修复按权重 x/y 设置的空间

android - Quickblox 管理 session 和召回?

python - 为什么 Python 的数值计算速度这么慢?

java - Firebase 身份验证 : how to get current user's Password?

mysql - 查询效率

sql - 数据库中不同锁定方案的影响的详细信息?

java - 无法构建 pom 文件。发生未知编译问题

java - Spring MVC 注释。 + Jetty 9 + 查看解析器 - 找不到 jsp 页面

java - 避免实现接口(interface)中存在的方法 - java

java - 使用 get 和 set 传递数据