うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Enum の int キャストについて調べてみた

enum を int にキャストするときには (int)enumenum.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 キャストは利用しないほうがいいです