🏃
KotlinでDoubleArrayとArray<Double>の処理速度比較をする
はじめに
Androidでリアルタイム画像処理しようとした.
その時に0.1秒でも実行速度を上げようとして色々検証したので記事にします.
環境
kotlin 1.8.0
目次
- DoubleArrayとは
- DoubleArrayとArray<Double>の処理速度比較
DoubleArrayとは
-
配列の特徴を表にまとめると
特徴 \ 配列 | DoubleArray | Array<Double> | List<Double> | MutableList<Double> |
---|---|---|---|---|
要素の変更 | ⚪︎ | ⚪︎ | × | ⚪︎ |
要素数の変更 | × | × | × | ⚪︎ |
DoubleArrayとArray<Double>は何が違う
- DoubleArrayはプリミティブ型の配列
- Array<Double>はオブジェクトの配列
DoubleArray と Array<Double>
// DoubleArrayの使用例
val doubleArray: DoubleArray = doubleArrayOf(1.0, 2.0, 3.0)
val sum = doubleArray.sum() // 6.0
val average = doubleArray.average() // 2.0
// Array<Double>の使用例
val arrayDouble: Array<Double> = arrayOf(1.0, 2.0, 3.0)
val size = arrayDouble.size // 3
val firstElement = arrayDouble[0] // 1.0
-
DoubleArrayは「DoubleArrayという型」で,
-
Array<Double>は「Doubleという型のArray」なのです.
-
似たような使用として【Java】Doubleとdoubleの違いは何か?があります.
DoubleArrayとArray<Double>の処理速度比較
- レギュレーション
- 1920 * 1920の二次元配列の生成速度を競う.
- Array<Array<Double>>とArray<DoubleArray>を比較する.
- 配列に入る値は適当な計算式の結果とする.
ソースコード
val TAG = "ExecutionSpeedCheck"
val cols = 1920
val rows = 1920
Log.d(TAG,"array<Double> start!")
val arrayX: Array<Array<Double>> = Array(rows) { i ->
Array(cols) { j -> j + sin(i/10.0) }
}
Log.d(TAG,"array<Double> end!")
Log.d(TAG,"DoubleArray start!")
val doubleArrayX: Array<DoubleArray> = Array(rows) { i ->
DoubleArray(cols) { j -> j + sin(i/10.0) }
}
Log.d(TAG,"DoubleArray end!")
結果
結果(Logcat)
2023-03-20 15:14:23.366 25215-25215 ExecutionSpeedCheck com.example.executionspeed D array<Double> start!
2023-03-20 15:14:23.481 25215-25215 ExecutionSpeedCheck com.example.executionspeed D array<Double> end!
2023-03-20 15:14:23.481 25215-25215 ExecutionSpeedCheck com.example.executionspeed D DoubleArray start!
2023-03-20 15:14:23.531 25215-25215 ExecutionSpeedCheck com.example.executionspeed D DoubleArray end!
- Array<Double>: 0.115[s]
- DoubleArray: 0.050[s]
まとめ
Array<Double>とDoubleArrayの宣言で2倍以上の差があった.
このレベルで実行速度を気にするアプリはそうそうない
しかし,リアルタイム画像処理など大きい配列を何度も宣言・実行するケースがある.
知っておいて損はないだろう.
Discussion