Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/troubear/BetterDictionary

Better performance generic Dictionary and HashSet optimized for Unity
https://github.com/troubear/BetterDictionary

Last synced: 3 months ago
JSON representation

Better performance generic Dictionary and HashSet optimized for Unity

Awesome Lists containing this project

README

        

BetterDictionary for Unity
===
本ライブラリが提供するDictionary/HashSetクラスは、System.Collections.Generic名前空間の同名クラスをUnity向けに高速化※したものです。  

※.NET Core 2.0等の環境で使用した場合、逆にパフォーマンスが低下する場合があります。

特徴
---
- 一部をILで実装したIEqualityComparer\を使用するDictionary/HashSetクラスです。
- System.Collections.Generic名前空間の同名クラスを継承しているため、既存プロジェクトへの導入が比較的容易です。
- .NET 3.5ランタイムにおいて、列挙型・プリミティブ型(intやbyte等)・string型をキーとした場合にパフォーマンスが向上します。
- 列挙型は\~70%程度、プリミティブ型は\~20%程度、string型は\~15%程度の高速化。
- **列挙型をキーとした場合にボックス化が発生しません。**(IEqualityComparerを実装した場合と同等のパフォーマンスで動作します)
- .NET 4.6ランタイムにおいても、通常のDictionary/HashSetクラスよりは高速に動作します。
- 列挙型は\~30%程度、プリミティブ型は\~20%程度、string型は\~20%程度の高速化。
- IL2CPP(iOS/Android)に対応しています。
- ※但し、IL2CPPが生成するC++コードのコンパイルエラーを強引に回避しているため、将来的にコンパイルが通らなくなる可能性があります。

導入方法
---
1. [リリースページ](https://github.com/komatus/BetterDictionary/releases)から最新版の.unitypackageをダウンロード&インストールします。
- リポジトリのAssets/Plugins以下を直接自身のプロジェクトにコピーしても問題ありません。
1. 既存コードを以下のように変更します。

```csharp
// Before:
Dictionary _dict = new Dictionary();
HashSet _strings = new HashSet();

// After:
Dictionary _dict = new Better.Dictionary();
HashSet _strings = new Better.HashSet();
```

1. または、`PlayerSettings`の`Scripting Define Symbols`に`BETTER_PATCH`を追加し、プロジェクトソース内で使用されているSystem.Collections.Generic名前空間のDictionary/HashSetクラスを本ライブラリのクラスで一括置換※します。
- ※`BETTER_PATCH`シンボルの追加によって、本ライブラリのDictionary/HashSetクラスがグローバル名前空間で定義されます。

StringKey (ハッシュ計算済み文字列キー)
---
Better.StringKeyを使用することで、Dictionary/HashSetへのアクセスを高速化することができます。

~~~csharp
using Better;

// Typical extension method of the Dictionary class
public static void AddOrUpdate(
this Dictionary dict, TKey key, TValue value)
{
if (dict.ContainsKey(key))
{
dict[key] = value;
}
else
{
dict.Add(key, value);
}
}

Dictionary dict1;
Dictionary dict2;

dict1.AddOrUpdate("hogehoge", 1234);

// Depending on the length of the string,
// several percent to tens of percent faster than the raw string key.
// 文字列の長さによって、stringキーより数パーセント~数十パーセント速くなります。
dict2.AddOrUpdate("hogehoge", 1234);

// Attention!!
// However, in the case of a single operation it will slow down about 30%.
// ※但し、単一オペレーションでは約30%程度遅くなります。
dict2["hogehoge"] = 5678;

// Therefore, it is strongly recommended to prepare StringKey in advance.
// 従って、StringKeyを事前に用意しておくことを強く推奨します。
static StringKey HogeHoge = "hogehoge";
dict2[HogeHoge] = 5678; // Faster than dict1["hogehoge"]
~~~

TODO
---
- 詳細なパフォーマンス計測&グラフ化
- Translate the README into English.

License
---
This library is under the MIT License.

Some code is borrowed from [Microsoft/referencesource](https://github.com/Microsoft/referencesource).