From bdf4260431d270f506477bc0731e2d1e83cfcfa6 Mon Sep 17 00:00:00 2001 From: Icebob Date: Mon, 24 Apr 2017 20:19:03 +0200 Subject: [PATCH] improve perf getCacheKey method --- benchmark/perf-runner.js | 15 ++++++++++++++- benchmark/suites/cachers.js | 8 ++++---- benchmark/suites/call.js | 15 +++++++-------- src/cachers/base.js | 21 ++++++++++++++------- test/unit/cachers/base.spec.js | 3 +++ 5 files changed, 42 insertions(+), 20 deletions(-) diff --git a/benchmark/perf-runner.js b/benchmark/perf-runner.js index dd06ec967..51c50b4a8 100644 --- a/benchmark/perf-runner.js +++ b/benchmark/perf-runner.js @@ -1,6 +1,7 @@ "use strict"; let ServiceBroker = require("../src/service-broker"); +let Cacher = require("../src/cachers/memory-map"); let Transporters = require("../src/transporters"); let Serializer = require("../src/serializers/json"); @@ -17,6 +18,7 @@ function createBrokers(Transporter, opts) { let b2 = new ServiceBroker({ transporter: new Transporter(opts), + cacher: new Cacher(), //requestTimeout: 0, //logger: console, //logLevel: "debug", @@ -29,6 +31,16 @@ function createBrokers(Transporter, opts) { actions: { reply(ctx) { return ctx.params; + }, + get: { + cache: { + keys: ["id"] + }, + handler() { + return { + name: "User" + }; + } } } }); @@ -43,7 +55,8 @@ let [b1, b2] = createBrokers(Transporters.Fake); let count = 0; function doRequest() { count++; - return b2.call("echo.reply", { a: count }).then(res => { + //return b2.call("echo.reply", { a: count }).then(res => { + return b2.call("echo.get", { id: 5 }).then(res => { if (count % 10000) { // Fast cycle doRequest(); diff --git a/benchmark/suites/cachers.js b/benchmark/suites/cachers.js index 30a7a8d8a..c06a10368 100644 --- a/benchmark/suites/cachers.js +++ b/benchmark/suites/cachers.js @@ -85,11 +85,11 @@ Suite: Set & get 1k data with cacher ----------------------------------------------------------------------- Suite: Test getCacheKey -√ Dynamic 534,814 rps -√ Static 1,684,070 rps +√ Dynamic 507,894 rps +√ Static 19,409,900 rps - Dynamic -68.24% (534,814 rps) (avg: 1μs) - Static 0% (1,684,070 rps) (avg: 593ns) + Dynamic -97.38% (507,894 rps) (avg: 1μs) + Static 0% (19,409,900 rps) (avg: 51ns) ----------------------------------------------------------------------- */ \ No newline at end of file diff --git a/benchmark/suites/call.js b/benchmark/suites/call.js index 082fbe3cb..500cca9a3 100644 --- a/benchmark/suites/call.js +++ b/benchmark/suites/call.js @@ -143,8 +143,7 @@ let bench5 = benchmark.createSuite("Call with statistics & metrics"); }); })(); -//benchmark.run([bench1, bench2, bench3, bench4, bench5]); -benchmark.run([bench3]); +benchmark.run([bench1, bench2, bench3, bench4, bench5]); /* @@ -178,13 +177,13 @@ Suite: Call with middlewares ----------------------------------------------------------------------- Suite: Call with cachers -√ No cacher* 1,093,232 rps -√ Built-in cacher* 221,052 rps -√ Built-in cacher (keys filter)* 445,376 rps +√ No cacher* 1,054,783 rps +√ Built-in cacher* 226,415 rps +√ Built-in cacher (keys filter)* 794,494 rps - No cacher* (#) 0% (1,093,232 rps) (avg: 914ns) - Built-in cacher* -79.78% (221,052 rps) (avg: 4μs) - Built-in cacher (keys filter)* -59.26% (445,376 rps) (avg: 2μs) + No cacher* (#) 0% (1,054,783 rps) (avg: 948ns) + Built-in cacher* -78.53% (226,415 rps) (avg: 4μs) + Built-in cacher (keys filter)* -24.68% (794,494 rps) (avg: 1μs) ----------------------------------------------------------------------- Suite: Call with param validator diff --git a/src/cachers/base.js b/src/cachers/base.js index 6fa0c5720..8f238536d 100644 --- a/src/cachers/base.js +++ b/src/cachers/base.js @@ -125,19 +125,26 @@ class Cacher { * Get a cache key by name and params. * Concatenate the name and the hashed params object * - * @param {any} name - * @param {any} params - * @param {any} keys + * @param {String} name + * @param {Object} params + * @param {Array|null} keys * @returns */ getCacheKey(name, params, keys) { if (params) { - if (keys && Array.isArray(keys)) { - if (keys.length > 0) - return name + ":" + keys.map(key => params[key]).join("-"); + const keyPrefix = name + ":"; + if (keys) { + if (keys.length == 1) { + // Quick solution for 'id' only keys + return keyPrefix + params[keys[0]]; + } + + if (keys.length > 0) { + return keys.reduce((a, key, i) => a + (i ? "|" : "") + params[key], keyPrefix); + } } else { - return name + ":" + hash(params); + return keyPrefix + hash(params); } } return name; diff --git a/test/unit/cachers/base.spec.js b/test/unit/cachers/base.spec.js index 12bf5eac2..39362d9d5 100644 --- a/test/unit/cachers/base.spec.js +++ b/test/unit/cachers/base.spec.js @@ -91,6 +91,9 @@ describe("Test BaseCacher", () => { res = cacher.getCacheKey("user", {a: 5, b: 3, c: 5}, ["a"]); expect(res).toBe("user:5"); + + res = cacher.getCacheKey("user", {a: 5, b: 3, c: 5}, ["a", "b", "c"]); + expect(res).toBe("user:5|3|5"); res = cacher.getCacheKey("user", {a: 5, b: { id: 3 }}, ["a", "c", "b"]); // FIXME