From 733eead8e16101e125a2687d408ad963769bf32b Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Tue, 26 Jan 2016 15:10:54 +0500 Subject: [PATCH] some performance improvement --- .gitignore | 4 +- benchmark/benchmark.js | 4 +- index.js | 88 +++++++++++++++++++++++------------------- package.json | 36 +++++++++-------- 4 files changed, 73 insertions(+), 59 deletions(-) diff --git a/.gitignore b/.gitignore index c2658d7..6112603 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -node_modules/ +node_modules + +npm-debug.log diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js index 2e8cc99..5494e69 100644 --- a/benchmark/benchmark.js +++ b/benchmark/benchmark.js @@ -3,8 +3,8 @@ var crypto = require('crypto') var benchmark = require('benchmark') -var baseX = require('../') -var bs58 = baseX('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz') +var bs58ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' +var bs58 = require('../')(bs58ALPHABET) var fixtureIndex = 0 var resetFixtureIndex = function () { fixtureIndex = 0 } diff --git a/index.js b/index.js index ccb1d7d..dccfc7f 100644 --- a/index.js +++ b/index.js @@ -6,6 +6,10 @@ // Merged Buffer refactorings from base58-native by Stephen Pair // Copyright (c) 2013 BitPay Inc +/** + * @param {string} ALPHABET + * @return {encode: function, decode: function} + */ module.exports = function base (ALPHABET) { var ALPHABET_MAP = {} var BASE = ALPHABET.length @@ -16,76 +20,82 @@ module.exports = function base (ALPHABET) { ALPHABET_MAP[ALPHABET.charAt(i)] = i } - function encode (buffer) { - if (buffer.length === 0) return '' + /** + * @param {(Buffer|number[])} source + * @return {string} + */ + function encode (source) { + if (source.length === 0) { + return '' + } - var i, j var digits = [0] - - for (i = 0; i < buffer.length; i++) { - for (j = 0; j < digits.length; j++) digits[j] <<= 8 - - digits[0] += buffer[i] - - var carry = 0 - for (j = 0; j < digits.length; ++j) { - digits[j] += carry - - carry = (digits[j] / BASE) | 0 - digits[j] %= BASE + for (var i = 0; i < source.length; ++i) { + var carry = (digits[0] << 8) + source[i] + digits[0] = carry % BASE + carry = (carry / BASE) | 0 + + for (var j = 1; j < digits.length; ++j) { + carry += digits[j] << 8 + digits[j] = carry % BASE + carry = (carry / BASE) | 0 } - while (carry) { + while (carry > 0) { digits.push(carry % BASE) - carry = (carry / BASE) | 0 } } // deal with leading zeros - for (i = 0; buffer[i] === 0 && i < buffer.length - 1; i++) { + for (var k = 0; source[k] === 0 && k < source.length - 1; ++k) { digits.push(0) } // convert digits to a string - var str = '' - for (i = digits.length - 1; i >= 0; i--) { - str += ALPHABET[digits[i]] + for (var ii = 0, jj = digits.length - 1; ii <= jj; ++ii, --jj) { + var tmp = ALPHABET[digits[ii]] + digits[ii] = ALPHABET[digits[jj]] + digits[jj] = tmp } - return str + return digits.join('') } + /** + * @param {string} string + * @return {number[]} + */ function decode (string) { - if (string.length === 0) return [] + if (string.length === 0) { + return [] + } - var i, j var bytes = [0] + for (var i = 0; i < string.length; i++) { + var value = ALPHABET_MAP[string[i]] + if (value === undefined) { + throw new Error('Non-base' + BASE + ' character') + } - for (i = 0; i < string.length; i++) { - var c = string[i] - if (!(c in ALPHABET_MAP)) throw new Error('Non-base' + BASE + ' character') - - for (j = 0; j < bytes.length; j++) bytes[j] *= BASE - bytes[0] += ALPHABET_MAP[c] - - var carry = 0 - for (j = 0; j < bytes.length; ++j) { - bytes[j] += carry + var carry = bytes[0] * BASE + value + bytes[0] = carry & 0xff + carry >>= 8 - carry = bytes[j] >> 8 - bytes[j] &= 0xff + for (var j = 1; j < bytes.length; ++j) { + carry += bytes[j] * BASE + bytes[j] = carry & 0xff + carry >>= 8 } - while (carry) { + while (carry > 0) { bytes.push(carry & 0xff) - carry >>= 8 } } // deal with leading zeros - for (i = 0; string[i] === LEADER && i < string.length - 1; i++) { + for (var k = 0; string[k] === LEADER && k < string.length - 1; ++k) { bytes.push(0) } diff --git a/package.json b/package.json index b245b79..be5f7e9 100644 --- a/package.json +++ b/package.json @@ -2,20 +2,6 @@ "name": "base-x", "version": "1.0.2", "description": "Fast base encoding / decoding of any given alphabet", - "main": "index.js", - "scripts": { - "standard": "standard", - "test": "npm run unit && npm run standard", - "unit": "mocha" - }, - "repository": { - "type": "git", - "url": "https://github.com/dcousens/base-x.git" - }, - "bugs": { - "url": "https://github.com/dcousens/base-x/issues" - }, - "homepage": "https://github.com/dcousens/base-x", "keywords": [ "base-x", "base58", @@ -28,15 +14,31 @@ "encode", "encoding" ], - "author": "Daniel Cousens", + "homepage": "https://github.com/cryptocoinjs/base-x", + "bugs": { + "url": "https://github.com/cryptocoinjs/base-x/issues" + }, "license": "MIT", + "author": "Daniel Cousens", "files": [ "index.js", "README.md" ], + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/cryptocoinjs/base-x.git" + }, + "scripts": { + "benchmark:node": "node benchmark/benchmark.js", + "standard": "standard", + "test": "npm run unit && npm run standard", + "unit": "mocha" + }, "devDependencies": { "benchmark": "^2.0.0", - "mocha": "*", - "standard": "*" + "mocha": "^2.3.4", + "node-gyp": "^3.2.1", + "standard": "^5.4.1" } }