質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

0回答

732閲覧

[kotlin, Android] forとarrayを多用した際の処理速度向上について

Amanokawa

総合スコア41

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2017/09/29 02:47

いつもお世話になっています。
kotlinを使用してとあるアルゴリズムを作ったのですが、思ったほど速度が出ずに悩んでいます。
外部の記事で
「Kotlinの隠れたコストについてのベンチマーク」http://postd.cc/kotlinshiddencosts-benchmarks/
を見たのですが、javaと比べて遅くなる事があるようです。
forとIntArrayを多用したアルゴリズムなので、どこかで無駄な処理が入っている為に遅いのかもと勘繰っています。

kotlinでパフォーマンスに直結するコツのような事を知っているかたらおられましたら、ぜひ教えてください。

以下に自分の作ったコードを置いておきます。もちろん細部まで見てもらう必要はないですが、さらさらーとみて改善点などに気づいていただけたらなぁと思っております。(キャメルケースでなかったり読みづらいかもしれませんが)

kotlin

1class OptiAlgorithm { 2 private var field: IntArray = IntArray(48, {0}) 3 private var next: IntArray = IntArray(8, {0}) 4 private var field_check: IntArray = IntArray(48, {0}) 5 private var result:IntArray = IntArray(10, {0}) 6 7 private fun scanning_algorithm(point: Int, count_in: IntArray): IntArray{ 8 var count:IntArray = count_in 9 val color: Int = field[point] 10 11 field_check[point] = 2 12 13 var n: Int = point + 8 14 if (!(point >= 40 || field_check[n] != 0)) 15 count = rewrite_check(count, color, n) 16 n = point + 1 17 if (!(point%8 >= 7 || field_check[n] != 0)) 18 count = rewrite_check(count, color, n) 19 n = point - 8 20 if (!(point <= 7 || field_check[n] != 0)) 21 count = rewrite_check(count, color, n) 22 n = point - 1 23 if (!(point%8 <= 0 || field_check[n] != 0)) 24 count = rewrite_check(count, color, n) 25 26 return count 27 } 28 29 private fun rewrite_check(count_in:IntArray, color: Int, point:Int):IntArray{ 30 var count:IntArray = count_in 31 32 when (field[point]){ 33 //同色だった場合 34 color -> { 35 count[0] += 1 36 count = scanning_algorithm(point, count) 37 } 38 color + 7 -> { 39 count[0] += 1 40 count[3] += 1 41 count = scanning_algorithm(point, count) 42 } 43 0 -> { 44 field_check[point] = 5 45 } 46 6 -> { 47 field_check[point] = 3 48 count[1] += 1 49 } 50 7,18 -> { 51 field_check[point] = 3 52 count[2] += 1 53 } 54 13 -> { 55 field_check[point] = 4 56 count[2] += 1 57 } 58 14 -> { 59 field_check[point] = 3 60 count[4] += 1 61 } 62 15, 16, 17 -> { 63 field_check[point] = 3 64 count[5] += 1 65 } 66 } 67 return count 68 } 69 70 private fun serch_algorithm(point: Int){ 71 var count = IntArray(6, {0}) 72 val color: Int = field[point] 73 74 count = scanning_algorithm(point, count) 75 76 //countの数で分岐 77 if (3 <= count[0]){ 78 for (i in 0..47){ 79 when (field_check[i]){ 80 2 -> { 81 field[i] = 0 82 field_check[i] = 5 83 } 84 3 -> { 85 field[i] = 0 86 field_check[i] = 5 87 } 88 4 -> { 89 field[i] = 7 90 field_check[i] = 5 91 } 92 } 93 } 94 when(color){ 95 1 -> result[0] += count[0] + 1 96 2 -> result[1] += count[0] + 1 97 3 -> result[2] += count[0] + 1 98 4 -> result[3] += count[0] + 1 99 5 -> result[4] += count[0] + 1 100 } 101 result[5] += count[1] 102 result[6] += count[2] 103 result[7] += count[3] 104 result[8] += count[4] 105 result[9] += count[5] 106 107 }else { 108 for (i in 0..47) { 109 when (field_check[i]) { 110 2 -> field_check[i] = 5 111 3 -> field_check[i] = 0 112 4 -> field_check[i] = 0 113 } 114 } 115 } 116 } 117 118 private fun count_and_vanish(){ 119 field_check = IntArray(48, {0}) 120 result = IntArray(10, {0}) 121 122 for (i in 0..47) { 123 when(field[i]){ 124 0 -> field_check[i] = 5 125 1,2,3,4,5 -> { 126 if (field_check[i] == 0) 127 serch_algorithm(i) 128 } 129 } 130 } 131 } 132 133 private fun drop(){ 134 for (j in 0..7){ 135 //変化したかを確認するための配列 136 val check = IntArray(6, {-1}) 137 138 for (c in 0..5){ 139 if (!(check[5] != field[40 + j] || 140 check[4] != field[32 + j] || 141 check[3] != field[24 + j] || 142 check[2] != field[16 + j] || 143 check[1] != field[8 + j] || 144 check[0] != field[0 + j]) 145 ){ 146 break 147 } 148 for (i in 0..5) 149 check[i] = field[8*i + j] 150 for (i in 5 downTo 0){ 151 if (field[(8*i) + j] == 0){ 152 for (k in 0 until i) 153 field[8*(i-k) + j] = field[8*(i-k-1) + j] 154 if (next[j] != 0){ 155 field[j] = next[j] 156 next[j] = 0 157 }else 158 field[j] = 0 159 } 160 } 161 } 162 } 163 } 164 165 private fun drop_field(){ 166 for (j in 0..7){ 167 //変化したかを確認するための配列 168 val check = IntArray(6, {0}) 169 170 for (c in 0..5){ 171 if (!(check[5] != field[40 + j] || 172 check[4] != field[32 + j] || 173 check[3] != field[24 + j] || 174 check[2] != field[16 + j] || 175 check[1] != field[8 + j] || 176 check[0] != field[0 + j]) 177 ){ 178 break 179 } 180 for (i in 0..5) 181 check[i] = field[8*i + j] 182 for (i in 5 downTo 0){ 183 if (field[(8*i) + j] == 0){ 184 for (k in 0 until i) 185 field[8*(i-k) + j] = field[8*(i-k-1) + j] 186 field[j] = 0 187 } 188 } 189 } 190 } 191 } 192 193 fun collect_values(field_in: IntArray, next_in: IntArray): IntArray{ 194 field = field_in 195 next = next_in 196 var values = IntArray(0, {0}) 197 198 while (true) { 199 while (true) { 200 drop_field() 201 count_and_vanish() 202 203 //抜ける条件 204 if (!(result[0] != 0 || result[1] != 0 || result[2] != 0 || result[3] != 0 || result[4] != 0)) 205 break 206 207 values = values.plus(result) 208 } 209 210 drop() 211 count_and_vanish() 212 213 //抜ける条件 214 if (!(result[0] != 0 || result[1] != 0 || result[2] != 0 || result[3] != 0 || result[4] != 0)) 215 break 216 217 values = values.plus(result) 218 } 219 220 return values 221 } 222}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiramekun

2017/09/29 03:40

このプログラムは何を目的としたものですか?目的がわかればどの部分が無駄かを突き止めるのが楽になります
t_obara

2017/09/29 05:25

当該アルゴリズムはjavaと比べて遅くなったのでしょうか?その点も記載があれば、確認する箇所も限定されるのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問