シリアライズ可能なラムダが「シリアル化できないラムダと比較してパフォーマンスが大幅に向上している」とのコメントをBrian Goetzが読みました。Javaでシリアライズ可能なラムダのパフォーマンス8
私は今興味があります:正確にそのオーバーヘッドとは何ですか?それはラムダのインスタンス化にのみ影響しますか、または呼び出しにも影響しますか?
以下のコードでは、callExistingInstance()とcallWithNewInstance()の両方のケースで、「MyFunction」のシリアル化機能、または2番目のケースのみが影響を受けますか?
interface MyFunction<IN, OUT> {
OUT call(IN arg);
}
void callExistingInstance() {
long toAdd = 1;
long value = 0;
final MyFunction<Long, Long> adder = (number) -> number + toAdd;
for (int i = 0; i < LARGE_NUMBER; i++) {
value = adder.call(value);
}
}
void callWithNewInstance() {
long value = 0;
for (int i = 0; i < LARGE_NUMBER; i++) {
long toAdd = 1;
MyFunction<Long, Long> adder = (number) -> number + toAdd;
value = adder.call(value);
}
}
すてきな説明ありがとうございました。 –
この説明は問題には当てはまりません。デシリアライズするオブジェクトは、ラムダ式を使用するかどうかに関係なく、常に高価なReflectionを使用します。しかし、質問のコードは何かを逆直列化しません。 – Holger
問題は、他のタイプのlamdbasではなく、シリアライズ可能なlambdaをシリアライズして使用することでした。 OPは、これらのオブジェクトのライフサイクルのどの部分が通常のラムダよりパフォーマンスが低いかを尋ねていました。彼のコードは呼び出しとインスタンス化を正確に区別しています。答えが示されているように、彼の症例の1つが影響を受ける。ラムダをデシリアライズすることは、他のオブジェクトをデシリアライズすること(「特別なリフレクション」)よりも非常に異なるものであり、本質的に高価です。 – BadZen