【ハルシオンブログ】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]
それぞれTestAというクラスを10000個作りArrayListとListに突っ込む。
それぞれ取り出して、TestAの中のNumを足しこんでいき時間を計測する。
結果はこちら。
int : 704982704
ArrayList : 00:00:00.0148516
int : 704982704
List : 00:00:00.0184415
あれ??
ArrayListのほうが早くない・・・・???
これくらいの処理だとキャストしても特に速度変わらないのかな・・・??
TestAクラスが軽すぎるからなのか??
TestAクラスをこんな感じにしてみたら、差が出てきました。
int : 704982704
ArrayList : 00:00:00.0261743
int : 704982704
List : 00:00:00.0188563
あからさまにキャストしたArrayListのほうが処理時間が増えてきました。
Listの方は全然処理時間変わらないですね。
結果
軽いクラスをArrayListに突っ込むなら、特にListとの処理時間に差はないけど、クラスの中身が増えてくるとキャストに時間がかかっていくということですね。
なので、ArrayListよりはListをそのまま使った方がいいと。
ちょっと気になったので、ArrayListの話を掘ってみました。
以上、あでゅ~ノシ
ずっと家に引きこもっていました。坂内っす。
ポケットガール~受け継がれし希望~よろしくお願いします。
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はObjectしか格納できない。
List
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)
« 【ハルシオンブログ】Dictionaryをforeachで更新する | 【ハルシオンブログ】Unityで画像データがおおきい場合、こういう設定にすればデータ圧縮ができますよ。 »
コメント
| h o m e |