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,您仍然会遇到相同的性能问题。
我过去听说过关于在 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,您仍然会遇到相同的性能问题。