Мне интересно, может ли кто-нибудь помочь мне понять, что, по моему мнению, связано с кэшированием при анализе объекта JSON.
Я пытаюсь сравнить различные десериализационные библиотеки (Gson, Kotlin-serialization, Immutables, и т.д.). У меня есть строка, которая читается из файла в формате JSON. Я хочу использовать каждую библиотеку для повторного анализа этой строки, а затем определить среднее время, необходимое библиотеке для анализа файла.
Мои результаты сбивают с толку. Например, при использовании kotlin-serialization при первом анализе строки это занимает 140 мс. Я проанализировал его еще 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")
}
}
Так что мой вопрос: как я могу изменить это так, чтобы каждая итерация цикла была сопоставима с первой? Можно ли отключить кеширование? Инстанцировать объекты по-разному?
Спасибо.