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

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

ただいまの
回答率

90.51%

  • Android

    6522questions

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

  • Android Studio

    3702questions

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

  • Kotlin

    326questions

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

  • for

    226questions

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

  • ArrayList

    90questions

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

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 427

Righty_Kitten

score 18

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

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

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

class OptiAlgorithm {
    private var field: IntArray = IntArray(48, {0})
    private var next: IntArray = IntArray(8, {0})
    private var field_check: IntArray = IntArray(48, {0})
    private var result:IntArray = IntArray(10, {0})

    private fun scanning_algorithm(point: Int, count_in: IntArray): IntArray{
        var count:IntArray = count_in
        val color: Int = field[point]

        field_check[point] = 2

        var n: Int = point + 8
        if (!(point >= 40 || field_check[n] != 0))
            count = rewrite_check(count, color, n)
        n = point + 1
        if (!(point%8 >= 7 || field_check[n] != 0))
            count = rewrite_check(count, color, n)
        n = point - 8
        if (!(point <= 7 || field_check[n] != 0))
            count = rewrite_check(count, color, n)
        n = point - 1
        if (!(point%8 <= 0 || field_check[n] != 0))
            count = rewrite_check(count, color, n)

        return count
    }

    private fun rewrite_check(count_in:IntArray, color: Int, point:Int):IntArray{
        var count:IntArray = count_in

        when (field[point]){
        //同色だった場合
            color -> {
                count[0] += 1
                count = scanning_algorithm(point, count)
            }
            color + 7 -> {
                count[0] += 1
                count[3] += 1
                count = scanning_algorithm(point, count)
            }
            0 -> {
                field_check[point] = 5
            }
            6 -> {
                field_check[point] = 3
                count[1] += 1
            }
            7,18 -> {
                field_check[point] = 3
                count[2] += 1
            }
            13 -> {
                field_check[point] = 4
                count[2] += 1
            }
            14 -> {
                field_check[point] = 3
                count[4] += 1
            }
            15, 16, 17 -> {
                field_check[point] = 3
                count[5] += 1
            }
        }
        return count
    }

    private fun serch_algorithm(point: Int){
        var count = IntArray(6, {0})
        val color: Int = field[point]

        count = scanning_algorithm(point, count)

        //countの数で分岐
        if (3 <= count[0]){
            for (i in 0..47){
                when (field_check[i]){
                    2 -> {
                        field[i] = 0
                        field_check[i] = 5
                    }
                    3 -> {
                        field[i] = 0
                        field_check[i] = 5
                    }
                    4 -> {
                        field[i] = 7
                        field_check[i] = 5
                    }
                }
            }
            when(color){
                1 -> result[0] += count[0] + 1
                2 -> result[1] += count[0] + 1
                3 -> result[2] += count[0] + 1
                4 -> result[3] += count[0] + 1
                5 -> result[4] += count[0] + 1
            }
            result[5] += count[1]
            result[6] += count[2]
            result[7] += count[3]
            result[8] += count[4]
            result[9] += count[5]

        }else {
            for (i in 0..47) {
                when (field_check[i]) {
                    2 -> field_check[i] = 5
                    3 -> field_check[i] = 0
                    4 -> field_check[i] = 0
                }
            }
        }
    }

    private fun count_and_vanish(){
        field_check = IntArray(48, {0})
        result = IntArray(10, {0})

        for (i in 0..47) {
            when(field[i]){
                0 -> field_check[i] = 5
                1,2,3,4,5 -> {
                    if (field_check[i] == 0)
                        serch_algorithm(i)
                }
            }
        }
    }

    private fun drop(){
        for (j in 0..7){
            //変化したかを確認するための配列
            val check = IntArray(6, {-1})

            for (c in 0..5){
                if (!(check[5] != field[40 + j] ||
                        check[4] != field[32 + j] ||
                        check[3] != field[24 + j] ||
                        check[2] != field[16 + j] ||
                        check[1] != field[8 + j] ||
                        check[0] != field[0 + j])
                        ){
                    break
                }
                for (i in 0..5)
                    check[i] = field[8*i + j]
                for (i in 5 downTo 0){
                    if (field[(8*i) + j] == 0){
                        for (k in 0 until i)
                            field[8*(i-k) + j] = field[8*(i-k-1) + j]
                        if (next[j] != 0){
                            field[j] = next[j]
                            next[j] = 0
                        }else
                            field[j] = 0
                    }
                }
            }
        }
    }

    private fun drop_field(){
        for (j in 0..7){
            //変化したかを確認するための配列
            val check = IntArray(6, {0})

            for (c in 0..5){
                if (!(check[5] != field[40 + j] ||
                        check[4] != field[32 + j] ||
                        check[3] != field[24 + j] ||
                        check[2] != field[16 + j] ||
                        check[1] != field[8 + j] ||
                        check[0] != field[0 + j])
                        ){
                    break
                }
                for (i in 0..5)
                    check[i] = field[8*i + j]
                for (i in 5 downTo 0){
                    if (field[(8*i) + j] == 0){
                        for (k in 0 until i)
                            field[8*(i-k) + j] = field[8*(i-k-1) + j]
                        field[j] = 0
                    }
                }
            }
        }
    }

    fun collect_values(field_in: IntArray, next_in: IntArray): IntArray{
        field = field_in
        next = next_in
        var values = IntArray(0, {0})

        while (true) {
            while (true) {
                drop_field()
                count_and_vanish()

                //抜ける条件
                if (!(result[0] != 0 || result[1] != 0 || result[2] != 0 || result[3] != 0 || result[4] != 0))
                    break

                values = values.plus(result)
            }

            drop()
            count_and_vanish()

            //抜ける条件
            if (!(result[0] != 0 || result[1] != 0 || result[2] != 0 || result[3] != 0 || result[4] != 0))
                break

            values = values.plus(result)
        }

        return values
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • hiramekun

    2017/09/29 12:40

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

    キャンセル

  • t_obara

    2017/09/29 14:25

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

    キャンセル

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

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    kotlinでparcelable

    ArrayList<Any>にparcelableを実装する方法が分かりません。 作成したリストの中にはString型と独自に作成したクラス(UploadedItem)が入っていま

  • 受付中

    クロージャについて詳しく教えてください

    現在、Kotlinの勉強をしていてクロージャを理解しようとしているのですが、考え方があっているのか分かりません。 私の考え方では、クロージャとは、クラスのprivateメンバに

  • 解決済

    Kotlinの型チェックについて

    初歩的な質問です。 Kotlinのwhen文でisを使った型チェックを学んでいるのですが、when文を学習中に下記のコードでよくわからなくなっていて困っています。 (Kotlinに

  • 解決済

    int型またはlong型の文字列変換時の桁区切りについて

    前提・実現したいこと Javaで実装されている既存コードをKotlinへ変換しようとしています。 その際にJavaで実装されたUtilクラスを整理しようとした際に、 以下のint型

  • 解決済

    myFavoriteIntでエラーになる

    いつもお世話になっております。 Kotlinスタートブックを読みながら、記載してあるリストを一つ一つ試しています。 現在はwhen式を行っているのですが、 下記ソースのmyFa

  • 解決済

    Kotlinで文字列の抜き出しがしたいです。

    以下のような文字列から、文字列を抜き出したいです。 """ id:10, category:Default, todo:hoge id:11, category:Default

  • 解決済

    RuntimeException: Unable to resume activity、 Failu...

    【目標】 ncmb(nifty cloud mobile backend)とkotlinでログイン機能の実装 【経緯】 githubにあるjavaファイルをkotlinに変更し

  • 解決済

    kotlinでREPLを使って実行するとエラーになる

    お世話になります 下記の分がエラーになってしまいます。```ここに言語を入力 C:\Users\mtg-1>kotlinc Welcome to Kotlin version

同じタグがついた質問を見る

  • Android

    6522questions

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

  • Android Studio

    3702questions

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

  • Kotlin

    326questions

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

  • for

    226questions

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

  • ArrayList

    90questions

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