【发布时间】:2019-09-30 20:31:39
【问题描述】:
我想知道是否有人可以帮助我理解我认为在解析 JSON 对象时与缓存相关的内容。
我正在尝试对各种反序列化库(Gson、Kotlin-serialization、Immutables 等)进行基准测试。我有一个从 json 格式的文件中读取的字符串。我想使用每个库重复解析这个字符串,然后确定该库解析文件所需的平均时间。
我的结果令人困惑。比如使用kotlin-serialization,第一次解析字符串,需要140ms。在应用程序的同一次运行中,我又解析了 5 次,分别用了 3、4、4、2 和 5 毫秒。显然,后续执行受益于某种缓存或内存优势。在我测试过的任何库中都会出现同样的模式。
class MainActivity : AppCompatActivity() {
private val stringBuilder = StringBuilder()
private lateinit var jsonString: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
jsonString = assets.open("jsonresponse.json").bufferedReader().use { it.readText() }
stringBuilder.append("\nAverage Deserialization Times:\n")
button_deserialize.setOnClickListener {
benchmarkKotlin()
stringBuilder.append("\n---------------------\n\n")
results.text = stringBuilder.toString()
}
}
fun benchmarkKotlin() {
val target = arrayOfNulls<MyDataClass>(NUM_ITERATIONS)
val t1 = System.currentTimeMillis()
for (i in 0 until NUM_ITERATIONS) {
try {
target[i] = Json.nonstrict.parse(
MyDataClass.serializer(),
jsonString
)
} catch (ignored: MissingFieldException){}
}
val t2 = System.currentTimeMillis()
val avg = (t2 - t1) / NUM_ITERATIONS
stringBuilder.append("Kotlin: $avg ms\n")
}
}
所以我的问题是如何修改它以使循环的每次迭代都与第一次迭代相当?我可以关闭缓存吗?以不同的方式实例化对象?
谢谢。
【问题讨论】:
标签: android json performance