我在Android中具有解析JSON
的功能。我使用 org.json
进行解析。
是这样的:
class ClassName {
public static ArrayList<DataObjectClass> parseResponse(String response){
JSONObject responseObject = new JSONObject(response);
if(responseObject.has("someArray")){
JSONArray someArray = responseObject.getJSONArray("someArray");
// etc... etc... and i do logic
}
}
return new DataObjectClass(params...)
}
现在,我将解析的时间从头到尾进行计时,每次我再次调用该函数时,解析时间都会减少(除非我退出应用并再次出现)
我检查了JSONTokener
代码和JSONObject
代码,但是找不到用于缓存的任何代码。发生在哪里以及如何将其关闭(出于测试目的)
答案 0 :(得分:4)
这可能与ART(Andorid RunTime)如何运行代码有关。
来自docs:
Android运行时(ART)包括具有代码概要分析的即时(JIT)编译器,可在运行时不断提高Android应用程序的性能。 JIT编译器是对ART当前最新的提前(AOT)编译器的补充,并提高了运行时性能,节省了存储空间并加快了应用程序和系统的更新速度。通过避免自动应用程序更新期间的系统速度降低或通过空中更新(OTA)更新过程中的应用程序重新编译,它还改进了AOT编译器。
尽管JIT和AOT使用具有相同优化集的同一编译器,但是生成的代码可能并不相同。 JIT利用运行时类型信息,可以更好地进行内联,并可以进行堆栈替换(OSR)编译,所有这些都生成略有不同的代码。
这意味着每次运行ART时,它都会分析其运行方式以及如何对其进行改进。当您退出应用程序时,所有这些数据都会丢失,并重新开始。这在所有JVM(Java虚拟机)应用程序中都很常见。
答案 1 :(得分:3)
为什么JSON解析变得越来越有效?
这就是及时编译器所做的本质。
他们了解(通过某种性能分析,有时甚至是:简单地计数方法调用)代码中哪些部分对性能至关重要。有时,它们会进入,并将java字节码转换为本地机器代码。
换句话说:最有可能的是,当您的代码“足够频繁地”执行某项操作时,JIT有时会(可能是逐步地,分多个步骤)将其重新编译为越来越优化的(机器代码)表示形式。