コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】高速かつボックス化が発生しない Dictionary「BetterDictionary」紹介

はじめに

こちらの「BetterDictionary」は通常の Dictionary よりも高速で、
かつ、ボックス化の発生を防ぐことができます

以下、GitHub の README の引用になります

概要(引用)

  • BetterDictionary クラスは
    System.Collections.Generic.Dictionary クラスを Unity 向けに高速化したものです。
    (※.NET Core 2.0 等では逆に遅くなるのでご注意ください)

特徴(引用)

  • IL で実装した IEqualityComparer を使用する Dictionary クラスです。
    • System.Collections.Generic.Dictionary クラスを継承しているため、
      既存プロジェクトへの導入が容易です。
  • .NET 3.5 ランタイムにおいて、列挙型及びプリミティブ型
    (int や byte 等)をキーとした場合にパフォーマンスが向上します。
    • 列挙型は 70% 程度、プリミティブ型は 10~20% 程度の高速化。
    • 列挙型をキーとした場合にボックス化が発生しません。
      (IEqualityComparer を実装した場合と同等のパフォーマンスで動作します)
  • .NET 4.6 ランタイムにおいても、通常の Dictionary クラスよりは高速に動作します。
    • 列挙型は 30% 程度、プリミティブ型は 10~20% 程度の高速化。
  • IL2CPP(iOS) でもたぶん動作します。(※十分に検証できていません)

導入方法(引用)

f:id:baba_s:20171018202913p:plain

  1. BetterDictionary.dll を Assets/Plugins 以下に配置してください。
  2. さらに BetterDictionaryPatch.cs を配置することで、プロジェクトソースの
    System.Collections.Generic.Dictionary を BetterDictionary に置き換えることができます。

検証

通常の Dictionary と BetterDictionary の速度と GC の発生回数を比較してみました

検証用スクリプト

検証結果

  時間 GC 発生回数
Dictionary 0.071 秒 3 回
BetterDictionary 0.014 秒 0 回

関連記事