20200515のC#に関する記事は2件です。

【.NET】最終的にソートされてるデータが欲しいだけならSortedSet<T>よりHashSet<T>のほうが高速

タイトルの通りです。

重複を削除してソート済みのデータが欲しいという場合は、途中の段階でもソートされているSortedSet<T>では余計な処理が入ってしまい遅くなってしまいます。
HashSet<T>やLINQのDistinctを使って重複を除いてから改めてソートする方が速いです。

ベンチマーク

Method Toolchain Mean Error StdDev Gen 0 Gen 1 Gen 2 Allocated
HashSetConstructor .NET Core 3.1 2.479 ms 0.0489 ms 0.1124 ms 687.5000 687.5000 433.5938 1894.9 KB
SortedSetConstructor .NET Core 3.1 5.914 ms 0.0905 ms 0.0847 ms 289.0625 289.0625 93.7500 820.74 KB
HashSetAdd .NET Core 3.1 1.905 ms 0.0209 ms 0.0185 ms 242.1875 242.1875 85.9375 565.09 KB
SortedSetAdd .NET Core 3.1 12.711 ms 0.0545 ms 0.0510 ms 78.1250 15.6250 - 430.09 KB
LINQ .NET Core 3.1 2.333 ms 0.0466 ms 0.0669 ms 218.7500 218.7500 82.0313 551.57 KB
HashSetConstructor net48 2.659 ms 0.0505 ms 0.0473 ms 500.0000 500.0000 500.0000 1899.78 KB
SortedSetConstructor net48 592.701 ms 10.3677 ms 9.6980 ms - - - 868.87 KB
HashSetAdd net48 2.115 ms 0.0348 ms 0.0325 ms 93.7500 93.7500 93.7500 565.41 KB
SortedSetAdd net48 13.160 ms 0.2547 ms 0.2502 ms 78.1250 15.6250 - 431.34 KB
LINQ net48 2.628 ms 0.0380 ms 0.0355 ms 136.7188 89.8438 89.8438 680.76 KB

測定コード

public class MyBenchmark
{
    [Benchmark]
    public int[] HashSetConstructor()
    {
        var res = new HashSet<int>(arr).ToArray();
        Array.Sort(res);
        return res;
    }
    [Benchmark]
    public int[] SortedSetConstructor()
    {
        return new SortedSet<int>(arr).ToArray();
    }

    [Benchmark]
    public int[] HashSetAdd()
    {
        var set = new HashSet<int>();
        foreach (var item in arr)
            set.Add(item);
        var res = set.ToArray();
        Array.Sort(res);
        return res;
    }
    [Benchmark]
    public int[] SortedSetAdd()
    {
        var set = new SortedSet<int>();
        foreach (var item in arr)
            set.Add(item);
        return set.ToArray();
    }
    [Benchmark]
    public int[] LINQ()
    {
        var res = arr.Distinct().ToArray();
        Array.Sort(res);
        return res;
    }


    int[] arr;
    public MyBenchmark()
    {
        var rnd = new Random(0);
        arr = Enumerable.Range(0, 100000).Select(i => rnd.Next(10000)).ToArray();
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Addressables.LoadAssetAsync を aync/await でスッキリ書く

こんにちは。Unity使い始めて1ヶ月ほどの初心者です。

外部リソースの読み込み事情が面倒すぎて心が折れそうですが
AAS(Addressable Assets System) を試しているところです。

今回はAASでのアセット読み込みを async/await でスッキリ書けたのでメモします。

Addressable Assets System でのアセット読み込み

AASではResources のように同期処理で読み込むメソッドが無く、
基本的には Addressables.LoadAssetAsyncで非同期に読み込むみたいです。

公式ドキュメントによると、以下のように読み込み完了時のイベントハンドラで目的のアセットを取得するよう書かれています。

Addressables.LoadAssetAsync<GameObject>("AssetAddress").Completed += OnLoadDone;

async/await を使って書いてみる

もっとスッキリ書けないかなーと模索していましたが、
.Task プロパティが用意されていて、async/await で書けます。

GameObject prefab = await Addressables.LoadAssetAsync<GameObject>("HogePrefab").Task

参考

Addressable Assets Systemを完全に理解する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む