FC2ブログ
    04 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 06

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】C#でArrayListって使わなくなったなぁと思ったので、処理時間とか調べてみた 

    こんにちは!GWが終わってしまいました。皆様GWはどうお過ごしでしたでしょうか?
    ずっと家に引きこもっていました。坂内っす。

    ポケットガール~受け継がれし希望~よろしくお願いします。
    URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
    URL(iOS):https://itunes.apple.com/jp/app/id1539553611

    PV:


    最近Unity(C#)でリストを扱う際には、Listをよく使っています。
    以前(15年くらい前とか?)Javaをやっていた時は、よくArrayListを使っていた。
    C#にもArrayListはあるらしいが、使うことはなくなったなぁと思ったので調べてみた。

    【ListとArrayListの違い】
     ArrayListはObjectしか格納できない。
     ListはTを格納できる。
     
     Objectをそのまま使うことはないため、ArrayListから取り出す際には必ずキャストをしないといけなくなる。
     キャストをするともちろん処理が重くなる。

    こんなコードを書いて、ArrayListとListの処理時間を確認してみた。

    [Blog20230508.cs]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class Blog20230508 : MonoBehaviour{

    public class TestA {
    public int num;
    public TestA(int i) {
    num = i;
    }
    }

    ArrayList array;
    List list;

    void Start()
    {
    var sw = new System.Diagnostics.Stopwatch();

    sw.Start();
    // ArrayList
    int intAry = 0;
    array = new ArrayList();
    for (int i = 0; i < 100000; i++) {
    array.Add(MakeTestA(i));
    }
    for (int i = 0; i < array.Count; i++) {
    TestA testA = array[i] as TestA;
    intAry += testA.num;
    }
    sw.Stop();
    Debug.Log("int : " + intAry);
    Debug.Log("ArrayList : " + sw.Elapsed.ToString());

    sw.Restart();
    // List
    int intList = 0;
    list = new List<TestA>();
    for (int i = 0; i < 100000; i++) {
    list.Add(MakeTestA(i));
    }
    for (int i = 0; i < list.Count; i++) {
    intList += list[i].num;
    }
    sw.Stop();
    Debug.Log("int : " + intList);
    Debug.Log("List : " + sw.Elapsed.ToString());

    }

    TestA MakeTestA(int i) {
    TestA testA = new TestA(i);
    return testA;
    }
    }



    それぞれTestAというクラスを10000個作りArrayListとListに突っ込む。
    それぞれ取り出して、TestAの中のNumを足しこんでいき時間を計測する。

    結果はこちら。

    int : 704982704
    ArrayList : 00:00:00.0148516
    int : 704982704
    List : 00:00:00.0184415

    あれ??
    ArrayListのほうが早くない・・・・???

    これくらいの処理だとキャストしても特に速度変わらないのかな・・・??

    TestAクラスが軽すぎるからなのか??

    TestAクラスをこんな感じにしてみたら、差が出てきました。


    public class TestA {
    public int num;
    public int num1;
    public int num2;
    public int num3;
    public int num4;
    public int num5;
    public int num6;
    public int num7;
    public string aa;
    public string ab;
    public string ac;
    public string ad;
    public string ae;
    public string af;
    public string ag;
    public string ah;
    public TestA(int i) {
    num = i;
    }
    }


    int : 704982704
    ArrayList : 00:00:00.0261743
    int : 704982704
    List : 00:00:00.0188563

    あからさまにキャストしたArrayListのほうが処理時間が増えてきました。

    Listの方は全然処理時間変わらないですね。

    結果

    軽いクラスをArrayListに突っ込むなら、特にListとの処理時間に差はないけど、クラスの中身が増えてくるとキャストに時間がかかっていくということですね。
    なので、ArrayListよりはListをそのまま使った方がいいと。

    ちょっと気になったので、ArrayListの話を掘ってみました。

    以上、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0