【问题标题】:Caching and Json Parsing缓存和 Json 解析
【发布时间】: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


    【解决方案1】:

    这可能无法直接回答您的问题。

    尝试使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2016-11-04
      • 2017-05-31
      • 2014-02-20
      相关资源
      最近更新 更多