Кэширование и разбор Json - PullRequest
       9

Кэширование и разбор Json

1 голос
/ 30 сентября 2019

Мне интересно, может ли кто-нибудь помочь мне понять, что, по моему мнению, связано с кэшированием при анализе объекта 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")
    }
}

Так что мой вопрос: как я могу изменить это так, чтобы каждая итерация цикла была сопоставима с первой? Можно ли отключить кеширование? Инстанцировать объекты по-разному?

Спасибо.

1 Ответ

1 голос
/ 30 сентября 2019

Это может напрямую не отвечать на ваш вопрос.

Попробуйте использовать Android TimingLogger для измерения времени и упрощения бенчмаркинга

Полезный класс, который поможетВремена журнала распределяются по всему вызову метода. Типичное использование:

 TimingLogger timings = new TimingLogger(TAG, "methodA");
 // ... do some work A ...
 timings.addSplit("work A");
 // ... do some work B ...
 timings.addSplit("work B");
 // ... do some work C ...
 timings.addSplit("work C");
 timings.dumpToLog();  

Вызов dumpToLog добавит в журнал следующее:

 D/TAG     ( 3459): methodA: begin
 D/TAG     ( 3459): methodA:      9 ms, work A
 D/TAG     ( 3459): methodA:      1 ms, work B
 D/TAG     ( 3459): methodA:      6 ms, work C
 D/TAG     ( 3459): methodA: end, 16 ms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...