From 098cdef69bc92e5715d4961b85e78e58652e0de1 Mon Sep 17 00:00:00 2001 From: TheoryOfNekomata Date: Sat, 8 Aug 2020 20:42:23 +0800 Subject: [PATCH] Improve memoization Dedicate caches to same functions --- package.json | 2 +- src/services/caches.ts | 7 +++++++ src/services/getFractionalOctaveCount.ts | 3 ++- src/services/getKeyLeft.ts | 5 +++-- src/services/getKeyWidth.ts | 21 ++++++++++----------- src/services/getOctaveCompleteness.ts | 5 +++-- src/services/getOctaveCount.ts | 3 ++- 7 files changed, 28 insertions(+), 18 deletions(-) create mode 100644 src/services/caches.ts diff --git a/package.json b/package.json index 03881da..a174aa4 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "1.0.3", + "version": "1.0.4", "license": "MIT", "main": "dist/index.js", "typings": "dist/index.d.ts", diff --git a/src/services/caches.ts b/src/services/caches.ts new file mode 100644 index 0000000..d10a60c --- /dev/null +++ b/src/services/caches.ts @@ -0,0 +1,7 @@ +export const getKeyOctave = new Map() + +export const getOctaveCompleteness = new Map() + +export const getKeyXOffset = new Map() + +export const isNaturalKey = new Map() diff --git a/src/services/getFractionalOctaveCount.ts b/src/services/getFractionalOctaveCount.ts index 849872e..787d0fb 100644 --- a/src/services/getFractionalOctaveCount.ts +++ b/src/services/getFractionalOctaveCount.ts @@ -2,8 +2,9 @@ import mem from 'mem' import generateKeys from './generateKeys' import groupKeysIntoOctaves from './groupKeysIntoOctaves' import getOctaveCompletenessUnmemoized from './getOctaveCompleteness' +import * as caches from './caches' -const getOctaveCompleteness = mem(getOctaveCompletenessUnmemoized) +const getOctaveCompleteness = mem(getOctaveCompletenessUnmemoized, { cache: caches.getOctaveCompleteness }) interface GetFractionalOctaveCount { (startKey: number, endKey: number): number diff --git a/src/services/getKeyLeft.ts b/src/services/getKeyLeft.ts index 4a7f0ea..e3025ae 100644 --- a/src/services/getKeyLeft.ts +++ b/src/services/getKeyLeft.ts @@ -3,11 +3,12 @@ import getKeyXOffsetUnmemoized from './getKeyXOffset' import getOctaveCountUnmemoized from './getOctaveCount' import getFractionalOctaveCountUnmemoized from './getFractionalOctaveCount' import getKeyOctaveUnmemoized from './getKeyOctave' +import * as caches from './caches' -const getKeyXOffset = mem(getKeyXOffsetUnmemoized) +const getKeyXOffset = mem(getKeyXOffsetUnmemoized, { cache: caches.getKeyXOffset }) const getOctaveCount = mem(getOctaveCountUnmemoized, { cacheKey: (args) => args.join(':') }) const getFractionalOctaveCount = mem(getFractionalOctaveCountUnmemoized, { cacheKey: (args) => args.join(':') }) -const getKeyOctave = mem(getKeyOctaveUnmemoized) +const getKeyOctave = mem(getKeyOctaveUnmemoized, { cache: caches.getKeyOctave }) export interface GetKeyLeft { (k: number): number diff --git a/src/services/getKeyWidth.ts b/src/services/getKeyWidth.ts index a4b650a..2d71b71 100644 --- a/src/services/getKeyWidth.ts +++ b/src/services/getKeyWidth.ts @@ -3,6 +3,7 @@ import isNaturalKeyUnmemoized from './isNaturalKey' import getOctaveCountUnmemoized from './getOctaveCount' import getFractionalOctaveCountUnmemoized from './getFractionalOctaveCount' import { ACCIDENTAL_KEY_TO_NATURAL_KEY_WIDTH_RATIO } from './constants' +import * as caches from './caches' export interface GetKeyWidth { (k: number): number @@ -12,19 +13,17 @@ interface GetKeyWidthDecorator { (startKey: number, endKey: number): GetKeyWidth } -const isNaturalKey = mem(isNaturalKeyUnmemoized) -const getFractionalOctaveCount = mem(getFractionalOctaveCountUnmemoized, { cacheKey: (args) => args.join(':') }) +const isNaturalKey = mem(isNaturalKeyUnmemoized, { cache: caches.isNaturalKey }) +const getFractionalOctaveCount = mem(getFractionalOctaveCountUnmemoized, { + cacheKey: (args) => args.join(':'), +}) const getOctaveCount = mem(getOctaveCountUnmemoized, { cacheKey: (args) => args.join(':') }) -const getKeyWidthDecorator: GetKeyWidthDecorator = (startKey, endKey) => { - const getKeyWidth: GetKeyWidth = (k) => { - const fractionalOctaveCount = getFractionalOctaveCount(startKey, endKey) - const octaveCount = getOctaveCount(startKey, endKey) - const naturalKeyWidth = (100 * (octaveCount / fractionalOctaveCount)) / (octaveCount * 7) - return isNaturalKey(k) ? naturalKeyWidth : naturalKeyWidth * ACCIDENTAL_KEY_TO_NATURAL_KEY_WIDTH_RATIO - } - - return mem(getKeyWidth) +const getKeyWidthDecorator: GetKeyWidthDecorator = (startKey, endKey) => (k) => { + const fractionalOctaveCount = getFractionalOctaveCount(startKey, endKey) + const octaveCount = getOctaveCount(startKey, endKey) + const naturalKeyWidth = (100 * (octaveCount / fractionalOctaveCount)) / (octaveCount * 7) + return isNaturalKey(k) ? naturalKeyWidth : naturalKeyWidth * ACCIDENTAL_KEY_TO_NATURAL_KEY_WIDTH_RATIO } export default getKeyWidthDecorator diff --git a/src/services/getOctaveCompleteness.ts b/src/services/getOctaveCompleteness.ts index af1b393..f25e5c9 100644 --- a/src/services/getOctaveCompleteness.ts +++ b/src/services/getOctaveCompleteness.ts @@ -1,9 +1,10 @@ import mem from 'mem' +import * as caches from './caches' import getKeyXOffsetUnmemoized from './getKeyXOffset' import isNaturalKeyUnmemoized from './isNaturalKey' -const getKeyXOffset = mem(getKeyXOffsetUnmemoized) -const isNaturalKey = mem(isNaturalKeyUnmemoized) +const getKeyXOffset = mem(getKeyXOffsetUnmemoized, { cache: caches.getKeyXOffset }) +const isNaturalKey = mem(isNaturalKeyUnmemoized, { cache: caches.isNaturalKey }) interface GetOctaveCompleteness { (firstKey: number, lastKey: number): number diff --git a/src/services/getOctaveCount.ts b/src/services/getOctaveCount.ts index a743d6f..6902786 100644 --- a/src/services/getOctaveCount.ts +++ b/src/services/getOctaveCount.ts @@ -1,7 +1,8 @@ import mem from 'mem' import getKeyOctaveUnmemoized from './getKeyOctave' +import * as caches from './caches' -const getKeyOctave = mem(getKeyOctaveUnmemoized) +const getKeyOctave = mem(getKeyOctaveUnmemoized, { cache: caches.getKeyOctave }) interface GetOctaveCount { (startKey: number, endKey: number): number