enum を int にキャストするときには (int)enum
と enum.GetHashCode()
の2つがある(はず)
しかしながらどちらが早いのか、int をそのまま扱うのと比べてどれくらい遅いのかを調べたことがなかったので調べてみる
Unity Editor 上 で .NET 4.x にして Profiler を利用して計測する 何度もやったわけではないので、これが正しいと限らないのでご了承ください
計測
// ループは10万回 var loop = 100000; // 1. int をそのまま var sum1 = 0; for (var i = 0; i < loop; i++) sum1 += 1; // 2. GetHashCodeでのキャスト var sum2 = 0; for (var i = 0; i < loop; i++) { sum2 += Test.A.GetHashCode(); } // 3. int へのキャスト var sum3 = 0; for (var i = 0; i < loop; i++) sum3 += (int)Test.A; // 4. Generic メソッドを利用して変換 (GetHashCode) var sum4 = 0; for (var i = 0; i < loop; i++) sum4 += GetHashCode(Test.A); private static int GetHashCode<T>(T t) where T : Enum { return t.GetHashCode(); } // 5. Generic メソッドを利用して変換 (object cast) var sum5 = 0; for (var i = 0; i < loop; i++) sum5 += CastObject(Test.A); private static int CastObject<T>(T t) where T : Enum { return (int)(object)t; } // 6. Generic メソッドを利用して変換 (Convert.ToInt32) var sum6 = 0; for (var i = 0; i < loop; i++) sum6 += Convert(Test.A); private static int Convert<T>(T t) where T : Enum { return Convert.ToInt32(t); }
結果
番号 | 時間(ms) |
---|---|
1 | 0.03 |
2 | 0.07 |
3 | 0.04 |
4 | 0.12 |
5 | 17.97 |
6 | 51.85 |
GetHashCode
はやはり遅く、Convert.ToInt32
に至っては最も遅かった
object キャストしてからの int キャストとConvert.ToInt32
に関しては
boxing も発生してしまっているため GC も発生するという最悪の結果でした
これだけループしてそこまで大きく時間が違わないので、GetHashCode に関しては利用しても良さそうですが
object からの int キャストは利用しないほうがいいです