THREE = {};
    
THREE.Vector3 = function ( x, y, z ) {

    this.x = x || 0;
    this.y = y || 0;
    this.z = z || 0;

};

THREE.Vector3.prototype = {

    constructor: THREE.Vector3,
 
    setComponent: function ( index, value ) {

        this[ THREE.Vector3.__indexToName[ index ] ] = value;
        
    },

    getComponent: function ( index ) {

        return this[ THREE.Vector3.__indexToName[ index ] ];

    }, 



    setComponent2: function ( index, value ) {

        switch( index ) {

            case 0: this.x = value; break;
            case 1: this.y = value; break;
            case 2: this.z = value; break;
            default: throw new Error( "index is out of range: " + index );

        }

    },

    getComponent2: function ( index ) {

        switch( index ) {

            case 0: return this.x;
            case 1: return this.y;
            case 2: return this.z;
            default: throw new Error( "index is out of range: " + index );

        }

    },


    getComponent3: function ( index ) {

        if ( index === 0 ) return this.x;
        if ( index === 1 ) return this.y;
        if ( index === 2 ) return this.z;

        throw new Error( "index is out of range: " + index );

    },

    getComponent4: function ( index ) {

        if ( index === 0 ) return this.x;
        else if ( index === 1 ) return this.y;
        else if ( index === 2 ) return this.z;
        else throw new Error( "index is out of range: " + index );

    }
};


THREE.Vector3.__indexToName = {
  0: 'x',
  1: 'y',
  2: 'z'
};

var a = [];

for ( var i = 0; i < 100000; i ++ ) {
    
    a[ i ] = new THREE.Vector3( i * 0.01, i * 2, i * -1.3 );
    
}


var suite = new Benchmark.Suite;

suite.add('IndexToName', function() {

    var result = 0;

    for ( var i = 0; i < 100000; i ++ ) {
        result += a[i].getComponent( i % 3 );
    }

});

suite.add('SwitchStatement', function() {

    var result = 0;

    for ( var i = 0; i < 100000; i ++ ) {

        result += a[i].getComponent2( i % 3 );

    }

});

suite.add('IfAndReturnSeries', function() {

    var result = 0;

    for ( var i = 0; i < 100000; i ++ ) {

        result += a[i].getComponent3( i % 3 );

    }

});

suite.add('IfReturnElseSeries', function() {

    var result = 0;

    for ( var i = 0; i < 100000; i ++ ) {

        result += a[i].getComponent4( i % 3 );

    }

});

suite.on('cycle', function(event, bench) {
  console.log(String(event.target));
});

suite.on('complete', function() {
  console.log('Fastest is ' + this.filter('fastest').pluck('name'));
  console.log( "Done" );
});

suite.run(true);