はじめに
こちらの「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) でもたぶん動作します。(※十分に検証できていません)
導入方法(引用)
- BetterDictionary.dll を Assets/Plugins 以下に配置してください。
- さらに BetterDictionaryPatch.cs を配置することで、プロジェクトソースの
System.Collections.Generic.Dictionary を BetterDictionary に置き換えることができます。
検証
通常の Dictionary と BetterDictionary の速度と GC の発生回数を比較してみました
検証用スクリプト
検証結果
時間 | GC 発生回数 | |
---|---|---|
Dictionary | 0.071 秒 | 3 回 |
BetterDictionary | 0.014 秒 | 0 回 |