Dlaczego podwójne sprawdzanie blokowania jest o 25% szybsze w Joshua Bloch Effective Java Example

Cześć poniżej to fragment z Effective Java 2nd Edition. Tutaj autor twierdzi, że następujący fragment kodu jest o 25% szybszy niż w którym nie używasz zmiennej wynikowej. Według książki „Zmienna ta zapewnia, że ​​pole jest odczytywane tylko raz w typowym przypadku, w którym jest już zainicjowane”. . Nie jestem w stanie zrozumieć, dlaczego ten kod byłby szybki po zainicjowaniu wartości, jak w przypadku, gdy nie korzystamy z wyniku zmiennej lokalnej. W obu przypadkach będziesz mieć tylko jeden odczyt ulotny po inicjalizacji, niezależnie od tego, czy użyjesz wyniku zmiennej lokalnej.

// Double-check idiom for lazy initialization of instance fields 
private volatile FieldType field;

FieldType getField() {
    FieldType result = field;
    if (result == null) {  // First check (no locking)
        synchronized(this) {
            result = field;
            if (result == null)  // Second check (with locking)
                field = result = computeFieldValue();
        }
    }
    return result;
}

questionAnswers(2)

yourAnswerToTheQuestion