From 059ee96db8d9ea73db94375eb1365625a56b6ec8 Mon Sep 17 00:00:00 2001 From: Ian Storm Taylor Date: Sun, 2 Apr 2017 14:57:36 -0700 Subject: [PATCH] a handful of performance improvements (#705) * update large example * pass block down to for performance, closes #700 * add get-ranges benchmark * optimize getRanges(), closes #699 * add serialization benchmarks * optimize Raw.deserializeRanges() by computing marks once, closes #701 * change .merge calls to .set for performance * change updateDescendant() to use getAncestors() for memoization * change getPath() to use getAncestors() for memoization * switch getTexts() and friends to use arrays while iterating * rename split-block benchmark * update benchmark compare script --- benchmark/compare.js | 2 + benchmark/fixtures/models/get-path/index.js | 17 + .../normal => models/get-path}/input.yaml | 0 benchmark/fixtures/models/get-ranges/index.js | 17 + .../fixtures/models/get-ranges/input.yaml | 19 + .../models/update-descendant/index.js | 20 + .../update-descendant}/input.yaml | 0 .../{regular => rendering}/normal/index.js | 0 .../fixtures/rendering/normal/input.yaml | 683 ++++++++++++++++++ .../serializers/raw-deserialize/index.js | 10 + .../serializers/raw-deserialize/input.yaml | 683 ++++++++++++++++++ .../serializers/raw-serialize/index.js | 6 + .../serializers/raw-serialize/input.yaml | 683 ++++++++++++++++++ .../index.js | 0 .../transforms/split-block/input.yaml | 683 ++++++++++++++++++ examples/large-document/index.js | 63 +- src/components/content.js | 2 +- src/components/leaf.js | 4 +- src/components/node.js | 9 +- src/models/node.js | 163 +++-- src/models/text.js | 86 ++- src/models/transform.js | 2 +- src/plugins/core.js | 2 +- src/serializers/raw.js | 8 +- src/transforms/apply-operation.js | 26 +- src/transforms/at-current-range.js | 8 +- src/transforms/at-range.js | 4 +- src/transforms/by-key.js | 4 +- src/transforms/normalize.js | 2 +- src/transforms/on-history.js | 12 +- 30 files changed, 3071 insertions(+), 147 deletions(-) create mode 100644 benchmark/fixtures/models/get-path/index.js rename benchmark/fixtures/{regular/normal => models/get-path}/input.yaml (100%) create mode 100644 benchmark/fixtures/models/get-ranges/index.js create mode 100644 benchmark/fixtures/models/get-ranges/input.yaml create mode 100644 benchmark/fixtures/models/update-descendant/index.js rename benchmark/fixtures/{transforms/split-block-wide => models/update-descendant}/input.yaml (100%) rename benchmark/fixtures/{regular => rendering}/normal/index.js (100%) create mode 100644 benchmark/fixtures/rendering/normal/input.yaml create mode 100644 benchmark/fixtures/serializers/raw-deserialize/index.js create mode 100644 benchmark/fixtures/serializers/raw-deserialize/input.yaml create mode 100644 benchmark/fixtures/serializers/raw-serialize/index.js create mode 100644 benchmark/fixtures/serializers/raw-serialize/input.yaml rename benchmark/fixtures/transforms/{split-block-wide => split-block}/index.js (100%) create mode 100644 benchmark/fixtures/transforms/split-block/input.yaml diff --git a/benchmark/compare.js b/benchmark/compare.js index 286938aee..44a4fdea6 100644 --- a/benchmark/compare.js +++ b/benchmark/compare.js @@ -22,6 +22,8 @@ baseline.forEach((suite, i) => { suite.benchmarks.forEach((base, j) => { const comp = comparison[i].benchmarks[j] + if (!comp) return + const b = base.iterations / base.elapsed * 100 const c = comp.iterations / comp.elapsed * 100 const threshold = b * THRESHOLD diff --git a/benchmark/fixtures/models/get-path/index.js b/benchmark/fixtures/models/get-path/index.js new file mode 100644 index 000000000..9f195e453 --- /dev/null +++ b/benchmark/fixtures/models/get-path/index.js @@ -0,0 +1,17 @@ + +import { __clear } from '../../../../lib/utils/memoize' + +export default function ({ state, text }) { + state.document.getPath(text.key) +} + +export function before(state) { + const text = state.document.getLastText() + __clear() + return { state, text } +} + +export function after() { + __clear() +} + diff --git a/benchmark/fixtures/regular/normal/input.yaml b/benchmark/fixtures/models/get-path/input.yaml similarity index 100% rename from benchmark/fixtures/regular/normal/input.yaml rename to benchmark/fixtures/models/get-path/input.yaml diff --git a/benchmark/fixtures/models/get-ranges/index.js b/benchmark/fixtures/models/get-ranges/index.js new file mode 100644 index 000000000..4348237b0 --- /dev/null +++ b/benchmark/fixtures/models/get-ranges/index.js @@ -0,0 +1,17 @@ + +import { __clear } from '../../../../lib/utils/memoize' + +export default function (text) { + text.getRanges() +} + +export function before(state) { + const text = state.document.getFirstText() + __clear() + return text +} + +export function after() { + __clear() +} + diff --git a/benchmark/fixtures/models/get-ranges/input.yaml b/benchmark/fixtures/models/get-ranges/input.yaml new file mode 100644 index 000000000..4e8716ff3 --- /dev/null +++ b/benchmark/fixtures/models/get-ranges/input.yaml @@ -0,0 +1,19 @@ +nodes: +- kind: block + type: paragraph + nodes: + - kind: text + ranges: + - text: 'This is editable ' + - text: 'rich' + marks: + - type: bold + - text: ' text, ' + - text: 'much' + marks: + - type: italic + - text: ' better than a ' + - text: '