Performance - Why Variable Caching?

/**
 * Don't rely on engines' optimization.
 * Consider the following prototype
 * chain and the corresponding tests
 * for property retrieval with and
 * without caching:
 *
**/

var o1 = {
    p1: {
        p2: {
            p3: {
                length: 1000000000
            }
        }
    }
};

var o2 = Object.create(o1);


// The object member resolution process for
// own properties may not impose performance penalty:

console.time('own property without caching');
for (var y = 0; y < o1.p1.p2.p3.length; y++) {
    // see the output on line 54
}
console.timeEnd('own property without caching');

console.time('own property with caching');
for (var y = 0, len = o1.p1.p2.p3.length; y < len; y++) {
    // see the output on line 55
}
console.timeEnd('own property with caching');


// However the object member resolution process for
// prototype properties imposes performance penalty:

console.time('prototype property without caching');
for (var y = 0; y < o2.p1.p2.p3.length; y++) {
    // see the output on line 56
}
console.timeEnd('prototype property without caching');

console.time('prototype property with caching');
for (var y = 0, len = o2.p1.p2.p3.length; y < len; y++) {
    // see the output on line 57
}
console.timeEnd('prototype property with caching');

// own property without property caching: 1125ms
// own property with property caching: 1130ms
// prototype property without property caching: 5995ms
// prototype property with property caching: 1113ms