AssumeRange 属性
AssumeRange 属性を使用すると、指定したスカラー整数が特定の制限された範囲内に含まれることを Burst に伝えることができます。Burst にこの情報を与えると、アプリケーションのパフォーマンスを向上させることができます。以下のコードは、その例です。
[return:AssumeRange(0u, 13u)]
static uint WithConstrainedRange([AssumeRange(0, 26)] int x)
{
return (uint)x / 2u;
}
この例では、Burst に以下のことを伝えます。
- 変数
xの範囲は[0..26]という閉区間、わかりやすくするとx >= 0 && x <= 26である。 WithConstrainedRangeの戻り値の範囲は[0..13]という閉区間、わかりやすくするとx >= 0 && x <= 13である。
Burst は、これらの想定を使用してより適切なコード生成を行います。ただし、いくつかの制限事項があります。
- これらはスカラー整数 (符号ありまたは符号なし) 型でのみ指定できます。
- 範囲引数の型は、属性の型と一致する必要があります。
Burst は、NativeArray と NativeSlice の .Length プロパティについて、それらが常に負以外の整数を返すという推論を行います。
static bool IsLengthNegative(NativeArray<float> na)
{
// Burst はこれを常に定数 false に置き換えます
return na.Length < 0;
}
例えば、以下のようなコンテナがあるとします。
struct MyContainer
{
public int Length;
// 他のデータ...
}
以下の例は、Length が常に正の整数であることを Burst に伝える方法を示しています。
struct MyContainer
{
private int _length;
[return: AssumeRange(0, int.MaxValue)]
private int LengthGetter()
{
return _length;
}
public int Length
{
get => LengthGetter();
set => _length = value;
}
// 他のデータ...
}