Brian Goetz tarafından yapılan bazı yorumlarda, seri hale getirilebilen lambdaların "basılmamış lambdalara kıyasla önemli ölçüde daha yüksek performans maliyetlerine sahip olduğunu" okudum.Java 8'de serialize edilebilir lambdaların performansı
Şu an merak ediyorum: Nerede bu yük ve bunun nedeni nedir? Sadece bir lambda ya da aynı zamanda çağrışımın gerçekleşmesini etkiler mi?
Aşağıdaki kodda, her iki durumda da (CallExistingInstance() ve callWithNewInstance()) "MyFunction" işlevinin ya da yalnızca ikinci durumun serileştirilebilirliğinden etkilenir mi?
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);
}
}
Güzel açıklama için teşekkür ederiz. –
Bu açıklama, bu soruna isabet etmiyor. Desitleştirici nesneler, lambda ifadeleri kullanıp kullanmadığınızdan bağımsız olarak her zaman pahalı Yansıma kullanacaktır. Ancak sorunun kodu hiçbir şeyi kaldırmaz. – Holger
Soru, diğer lamdbas türlerinin aksine serileştirilebilir lambdaların serileştirilmesi ve kullanılmasıydı. OP, bu nesnelerin yaşam döngüsünün hangi kısmının normal lambdalardan daha az performans gösterdiğini soruyordu. Onun kodu, çağrı ve örnekleme arasında doğru bir şekilde ayrılıyor ve onun sorusu doğrudan bunu soruyor. Yanıtın belirttiği gibi, tam olarak davalarından biri etkilenmiştir. Destatörleştirici lambdalar diğer nesneleri ("özel yansıma") serpiştirmekten çok farklı şeyler yapar ve doğal olarak daha pahalıdır. – BadZen