AsyncLayoutInflater vs Anko, AnkoはLayoutXMLを殺すのか?

YokomakuさんがAsyncLayoutInflaterLithoのパフォーマンス比較を行っていました。 Again: AsyncLayoutInflater vs Litho #potatotips - Celeste Engineer

ちょっと気になったので私もAsyncLayoutInflaterAnkoの比較を行ってみました。

AsyncLayoutInflater? Anko?

AsyncLayoutInflater?

LayoutXMLのInflateを非同期で行います。

Anko?

Kotlin製のView DSLです。コンセプトはいくかありますが以下のような利点が。

  • LayoutXMLのパースを行わないため高速
  • コードでViewを組むのでTypeSafe

以前軽く記事にしています。 AnkoでLayout XMLを殺した - MA Blog

Sample Codes

サンプルコードはYokomakuさんのものをfalkさせていただきました。

KeithYokoma/AsyncLayout

Contribute to KeithYokoma/AsyncLayout development by creating an account on GitHub.

AsyncLayoutInflater

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/text"
    tools:context="io.github.keithyokoma.asynclayout.MainActivity">
    
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <!-- 10000 TextViews -->
        
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"/>
        ...
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val s = System.nanoTime()
        AsyncLayoutInflater(this).inflate(R.layout.activity_main, null) { view, _, _ ->
            setContentView(view)
            val e = System.nanoTime()
            Log.i("TIME", "${(e-s)} nano sec")
        }
    }
}

Anko

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    measureNanoTime {
      val text = "Hello World!"
      scrollView {
        lparams(width = matchParent, height = matchParent)
        verticalLayout {
          for (i in 0..9999) {
            textView(text)
          }
        }.lparams(width = matchParent, height = wrapContent)
      }
    }.let { Log.i("TIME", "$it nano sec") }
  }
}

Benchmark

AsyncLayoutInflater

  • 2268048923 ns
  • 2274749393 ns
  • 2299624654 ns
  • 2346767994 ns
  • 2387729873 ns

Ave. 2315384167.4 ns (2315.38 ms)

Anko

  • 1692746575 ns
  • 1719153036 ns
  • 1676609542 ns
  • 1737803819 ns
  • 1757240852 ns

Ave. 1716710764.8 ns (1716.71 ms)

AsyncLayoutInflater vs Anko

やはりXMLのパースを行わない分、Ankoのほうが速いです。
じゃぁAnkoの方がいいかというとそうでもないかなーと。もしかしたら(Ankoに比べたら)ちょっと遅いけどUI Threadを止めないAsyncLayoutInflaterのほうが良いケースもあるかもしれません。
そして、AnkoではXMLを書かないので当然Databindingを利用できません。