为什么Kotlin代码在第一次执行时就这么长时间

时间:2018-06-21 08:00:49

标签: android kotlin

我正在开发专有的打印机服务,并且在Android的PrinterManager创建pdf文件之后,我渲染了位图,并且必须将24 BPP图像转换为1 BPP图像以将其发送到打印机。 我注意到,与后续打印相比,第一次打印的系统时间非常长,因此我分析了代码,发现时间主要花在以下循环中:

val startWhile = System.nanoTime()
while (row < height) {
    var imgByte: Byte = 0
    var bit = 7
    for (i in start..end step 1) {
        // Not strictly exact as I assume that every color has the same 'weight' which is not the reality but after all, it depends on the usage
        // For example, according to CIE709 recommandation, the test should be:
        // if ((pixels[i] * 0.2125 + pixels[i] * 0.7154 + pixels[i] * 0.0721) < 128) {
        if (((pixels[i] and 0xFF) + ((pixels[i] shr 8) and 0xFF) + ((pixels[i] shr 16) and 0xFF)) / 3 < 128) { // 0xAA000000 black to 0xAAFFFFFF white AA is transparency value.
            imgByte = imgByte or (1 shl bit).toByte()
        }
        if (bit <= 0) {
            bytes[b++] = imgByte
            bit = 7
            imgByte = 0
        } else {
            bit--
        }
    }
    if (bit != 7) { // loop interrupted before end of byte
        bytes[b++] = imgByte
    }
    row++
    end += width
    start += width
}
Log.d(TAG, "+++++ Conversion time 24 BPP to 1 BPP: ${(System.nanoTime() - startWhile) / 1000000L} ms")

根据日志,完成while循环的第一次执行(因此第一次完全转换为24BPP到1BPP)在大约11.000 ms内执行,随后的一次在11 ms内执行。 我怀疑某种形式的代码预编译。

为什么?

0 个答案:

没有答案