🏃

KotlinでDoubleArrayとArray<Double>の処理速度比較をする

2023/03/20に公開

はじめに

Androidでリアルタイム画像処理しようとした.
その時に0.1秒でも実行速度を上げようとして色々検証したので記事にします.

環境

kotlin 1.8.0

目次

  1. DoubleArrayとは
  2. DoubleArrayとArray<Double>の処理速度比較

DoubleArrayとは

特徴 \ 配列 DoubleArray Array<Double> List<Double> MutableList<Double>
要素の変更 ⚪︎ ⚪︎ × ⚪︎
要素数の変更 × × × ⚪︎

DoubleArrayとArray<Double>は何が違う

  • DoubleArrayはプリミティブ型の配列
  • Array<Double>はオブジェクトの配列
DoubleArray と Array&lt;Double&gt;
// DoubleArrayの使用例
val doubleArray: DoubleArray = doubleArrayOf(1.0, 2.0, 3.0)
val sum = doubleArray.sum() // 6.0
val average = doubleArray.average() // 2.0

// Array&lt;Double&gt;の使用例
val arrayDouble: Array&lt;Double&gt; = arrayOf(1.0, 2.0, 3.0)
val size = arrayDouble.size // 3
val firstElement = arrayDouble[0] // 1.0

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