Skip to content

Commit 1162b6a

Browse files
committed
little performance improvement by replacing Math.pow with precalculated value
1 parent 53a2e17 commit 1162b6a

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

lib/mongodb/bson/binary_parser.js

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ var sys = require('sys');
33
//+ Jonas Raoni Soares Silva
44
//@ http://jsfromhell.com/classes/binary-parser [v1.0]
55
var chr = String.fromCharCode;
6+
var maxBits = [];
7+
for(var i = 0; i<64; i++)
8+
maxBits[i] = Math.pow(2, i);
69

710
var p = exports.BinaryParser = function( bigEndian, allowExceptions ){
811
this.bigEndian = bigEndian;
@@ -52,19 +55,23 @@ p.warn = function( msg ){
5255
p.decodeFloat = function( data, precisionBits, exponentBits ){
5356
var b = new this.Buffer( this.bigEndian, data );
5457
b.checkBuffer( precisionBits + exponentBits + 1 );
55-
var bias = Math.pow( 2, exponentBits - 1 ) - 1, signal = b.readBits( precisionBits + exponentBits, 1 ), exponent = b.readBits( precisionBits, exponentBits ), significand = 0,
58+
//var bias = Math.pow( 2, exponentBits - 1 ) - 1,
59+
var bias = maxBits[exponentBits - 1] - 1,
60+
signal = b.readBits( precisionBits + exponentBits, 1 ), exponent = b.readBits( precisionBits, exponentBits ), significand = 0,
5661
divisor = 2, curByte = b.buffer.length + ( -precisionBits >> 3 ) - 1;
5762
do{
5863
for( var byteValue = b.buffer[ ++curByte ], startBit = precisionBits % 8 || 8, mask = 1 << startBit; mask >>= 1; ( byteValue & mask ) && ( significand += 1 / divisor ), divisor *= 2 );
5964
}while( precisionBits -= startBit );
6065
return exponent == ( bias << 1 ) + 1 ? significand ? NaN : signal ? -Infinity : +Infinity : ( 1 + signal * -2 ) * ( exponent || significand ? !exponent ? Math.pow( 2, -bias + 1 ) * significand : Math.pow( 2, exponent - bias ) * ( 1 + significand ) : 0 );
6166
};
6267
p.decodeInt = function( data, bits, signed, forceBigEndian ){
63-
var b = new this.Buffer( this.bigEndian||forceBigEndian, data ), x = b.readBits( 0, bits ), max = Math.pow( 2, bits );
68+
var b = new this.Buffer( this.bigEndian||forceBigEndian, data ), x = b.readBits( 0, bits ), max = maxBits[bits]; //max = Math.pow( 2, bits );
6469
return signed && x >= max / 2 ? x - max : x;
6570
};
6671
p.encodeFloat = function( data, precisionBits, exponentBits ){
67-
var bias = Math.pow( 2, exponentBits - 1 ) - 1, minExp = -bias + 1, maxExp = bias, minUnnormExp = minExp - precisionBits,
72+
//var bias = Math.pow( 2, exponentBits - 1 ) - 1,
73+
var bias = maxBits[exponentBits - 1] - 1,
74+
minExp = -bias + 1, maxExp = bias, minUnnormExp = minExp - precisionBits,
6875
status = isNaN( n = parseFloat( data ) ) || n == -Infinity || n == +Infinity ? n : 0,
6976
exp = 0, len = 2 * bias + 1 + precisionBits + 3, bin = new Array( len ),
7077
signal = ( n = status !== 0 ? 0 : n ) < 0, n = Math.abs( n ), intPart = Math.floor( n ), floatPart = n - intPart,
@@ -106,13 +113,17 @@ p.encodeFloat = function( data, precisionBits, exponentBits ){
106113
r[r.length] = n ? String.fromCharCode( n ) : "";
107114
return ( this.bigEndian ? r.reverse() : r ).join( "" );
108115
};
116+
109117
p.encodeInt = function( data, bits, signed, forceBigEndian ){
110-
var max = Math.pow( 2, bits );
118+
//var max = Math.pow( 2, bits );
119+
var max = maxBits[bits];
120+
111121
( data >= max || data < -( max / 2 ) ) && this.warn( "encodeInt::overflow" ) && ( data = 0 );
112122
data < 0 && ( data += max );
113123
for( var r = []; data; r[r.length] = String.fromCharCode( data % 256 ), data = Math.floor( data / 256 ) );
114124
for( bits = -( -bits >> 3 ) - r.length; bits--; r[r.length] = "\0" );
115-
return ( (this.bigEndian||forceBigEndian) ? r.reverse() : r ).join( "" );
125+
126+
return ( (this.bigEndian||forceBigEndian) ? r.reverse() : r ).join( "" );
116127
};
117128
p.toSmall = function( data ){ return this.decodeInt( data, 8, true ); };
118129
p.fromSmall = function( data ){ return this.encodeInt( data, 8, true ); };

0 commit comments

Comments
 (0)