30

Java の String クラスでは、trimメソッドに次のものが含まれます。

int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

「getfield オペコードを避ける」というコメントに少し困惑しています...

これは何を意味するのでしょうか?(これによりバイトコードでgetfieldの使用が回避されると思いますが、なぜこれが良いこと [TM] なのですか?)

トリムが何もしない(したがってこれが返される)場合にオブジェクトの作成を防ぐためですか?

4

2 に答える 2

23

私の推測では、次の数行のループの反復ごとにフィールド値をヒープから繰り返しフェッチする必要がないように、値をローカル変数に一度コピーすることがポイントです。

もちろん、同じコメントが「len」ローカル変数に適用されていないのはなぜかという疑問が生じます。(特に変数が final であるため、とにかく JIT が再フェッチを回避することも期待しています。)

于 2011-01-21T17:21:39.013 に答える
14

getfieldクラスのメンバー変数を取得するために使用されます。

残りのコードからわかるように:

while ((st < len) && (val[off + st] <= ' ')) {
    st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
    len--;
}

したがって、ループにいるときは、orgetfieldを参照するたびに実行する必要があります。ループが長時間実行されると、大きなパフォーマンス ヒットが発生する可能性があります (ループ条件がテストされるたびに、との両方に対して a が実行されるため)。したがって、ローカル変数とを使用することで、パフォーマンスへの影響を軽減できます。valueoffsetgetfieldoffsetvalueoffval

于 2011-01-21T17:27:48.823 に答える