次のシグネチャを持つメソッドがあるとします。
public int indexOf(byte[] bytes, byte toFind, int offset, int length) {
...
}
toFind
このメソッドは、[offset, offset+length) in の範囲内のバイトを探すような単純なことを行いますbytes
。のオフセットと長さが有効かどうかを事前に確認したいbytes
。つまり、そのオフセットとオフセット + 長さはバイト単位になります。
明示的なチェックは次のようになります。
if (offset < 0 || offset > bytes.length - length) {
throw ...; // bad santa!
}
代わりに「ダミー」配列アクセスを実行することで、これをより安価に実行できるようです (発行されたバイトコード、およびおそらく実行時のパフォーマンスの点で)。
public int indexOf(byte[] bytes, byte toFind, int offset, int length) {
int dummy = bytes[offset] + bytes[offset + length - 1];
...
}
できればint dummy
andを取り除くか、そのコストを削減したいと思います。+
おそらく、このようbytes[offset];
な式には通常副作用がなく、無意味であるためです (ただし、この場合はそうではありません)。ダミーの int を使用すると、抑制しなければならないコンパイラ警告も発生します。
最小量のバイトコードで変更を行う方法に関する提案 (実行時のパフォーマンスもここで重要ですが、ほとんどのソリューションは未使用部分が削除されるのと同じように最適化されていると思います)。