Android 上的当前 Joda Time 性能?

Current Joda Time performance on Android?

我过去听说过关于在 Android 上使用 Joda Time 的性能问题。一个具体的例子是时区数据加载方式的问题,这导致在应用程序的生命周期中,当不再需要时,大量内存仍被分配。不过,我相信其中一些问题也已在此时得到解决。

除了一般的 "I don't trust it" 情绪之外,:) 是否有任何 当前 问题继续使 Joda Time 成为处理 Android 日期的糟糕选择?

问题依然存在。问题是图书馆对 ClassLoader.getResourceAsStream 的使用。自 Android 6.0.1_r11 起,此问题尚未得到解决 - 有关详细信息,请参阅 here

在撰写本文时,默认 ZoneInfoProvider still uses this mechanism - 来自 master 的当前提示:

private InputStream openResource(String name) throws IOException {
    InputStream in;
    if (iFileDir != null) {
        in = new FileInputStream(new File(iFileDir, name));
    } else {
        final String path = iResourcePath.concat(name);
        in = AccessController.doPrivileged(new PrivilegedAction<InputStream>() {
            public InputStream run() {
                if (iLoader != null) {
                    return iLoader.getResourceAsStream(path);
                } else {
                    return ClassLoader.getSystemResourceAsStream(path);
                }
            }
        });
        if (in == null) {
            StringBuilder buf = new StringBuilder(40)
                .append("Resource not found: \"")
                .append(path)
                .append("\" ClassLoader: ")
                .append(iLoader != null ? iLoader.toString() : "system");
            throw new IOException(buf.toString());
        }
    }
    return in;
}

跳几下,就可以将本题方法的用法追溯到DateTimeZone.getProvider here:

public static Provider getProvider() {
    Provider provider = cProvider.get();
    if (provider == null) {
        provider = getDefaultProvider();
        if (!cProvider.compareAndSet(null, provider)) {
            provider = cProvider.get();
        }
    }
    return provider;
}

getDefaultProvider() 会产生问题 ZoneInfoProvider class;因此,如果您使用默认 Provider 的 JodaTime,您仍然会遇到相同的性能问题。