Zenjectの動作速度を検証した

# 概要
最近Zenjectを使っていましたが、なんとなくInjectが重い気がしたので、具体的に動作速度を調べてみました。

# 調査方法
- PrefabにおけるFactory.Createの動作速度を調べたい
- 毎フレーム下記のPrefabをFactory.Create＆Destroyを行ってグラフを見る
    - 1個のGameObjectに対して、1個のComponent
    - 201個のGameObjectに対して、1個のComponent
    - 201個のGameObjectに対して、201個のComponent
    - 1個のGameObjectに対して、201個のComponent
- ここで割増に使うComponentはInject属性を使っていない

## コード
```c#
using Zenject;

public class TestInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container.BindFactory<TestMonoBehaviour, TestMonoBehaviour.Factory>().FromComponentInNewPrefabResource("TestPrefab 3");
    }
}
```

```c#
using UnityEngine;
using Zenject;

public class TestMonoBehaviour : MonoBehaviour
{
    public class Factory : Factory<TestMonoBehaviour>
    {
    }
}
```

```c#
using UnityEngine;
using Zenject;

public class TestMain : MonoBehaviour
{
    [Inject]
    private TestMonoBehaviour.Factory _factory;
    
	void Update ()
    {
        var obj = _factory.Create();
        Destroy(obj.gameObject);
    }
}
```

```c#
using UnityEngine;

public class TestMonoBehaviour2 : MonoBehaviour
{
}
```

```c#
using UnityEditor;

public class AutoMonoBehaviourSetter : Editor {
    [MenuItem("Tools/Set MonoBehaviours")]
    public static void SetMonoBehaviours()
    {
        for (var i = 0; i < 200; i++)
        {
            Selection.gameObjects[0].AddComponent<TestMonoBehaviour2>();
        }
    }
}
```
## 201個のGameObjectを刺したPrefab
<img width="321" alt="SnapCrab_NoName_2017-3-28_14-10-7_No-00.png (14.2 kB)" src="https://img.esa.io/uploads/production/attachments/2738/2017/03/28/13967/5743f86a-d834-4535-9291-16b813712d4b.png">

## 201個のComponentを刺したPrefab
<img width="471" alt="SnapCrab_NoName_2017-3-28_10-5-13_No-00.png (51.5 kB)" src="https://img.esa.io/uploads/production/attachments/2738/2017/03/28/13967/75e9ef5e-7f1b-49fd-8278-69ce407fb6f2.png">

# 結果

## 1個のGameObjectに対して、1個のComponent
- 0.26ms
- 4.4KB Alloc
<img width="790.5" alt="SnapCrab_NoName_2017-3-28_9-34-20_No-00.png (136.6 kB)" src="https://img.esa.io/uploads/production/attachments/2738/2017/03/28/13967/6cba290f-e86e-4fc8-8c90-658bf3e529e7.png">

## 201個のGameObjectに対して、1個のComponent
- 1.08ms
- 4.4KB Alloc
<img width="790.5" alt="SnapCrab_NoName_2017-3-28_9-36-56_No-00.png (144.7 kB)" src="https://img.esa.io/uploads/production/attachments/2738/2017/03/28/13967/e7a9be27-cdf1-484c-bd04-5ddd50915a12.png">

## 201個のGameObjectに対して、201個のComponent
- 14.60ms
- 0.5MB Alloc
<img width="798.75" alt="SnapCrab_NoName_2017-3-28_9-38-20_No-00.png (158.3 kB)" src="https://img.esa.io/uploads/production/attachments/2738/2017/03/28/13967/707a22a6-99d7-4e23-bb25-961f90c38020.png">

## 1個のGameObjectに対して、201個のComponent
- 11.62ms
- 484.8KB Alloc
<img width="794.25" alt="SnapCrab_NoName_2017-3-28_14-18-22_No-00.png (138.9 kB)" src="https://img.esa.io/uploads/production/attachments/2738/2017/03/28/13967/ff9c8a2c-cc59-456f-beb6-d4b7a9dd079f.png">

# まとめ
| GameObject | Component | Time ms | GC Allock |
| --- | --- | --- | --- |
| 1 | 1 | 0.26ms | 4.4KB |
|201 | 1 | 1.08ms | 4.4KB |
|1 | 201 | 11.62ms | 484.8KB |
|201 | 201 | 14.08ms | 0.5MB |

- Inject属性を使っているかどうかに関わらず、Componentが増えるほどInjectが重くなる
- GameObjectの数は大して関係ないが、分散するよりは一つのGameObjectにまとめたほうが軽くなる