@fluidframework/merge-tree 2.92.0 → 2.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/dist/test/Insertion.perf.spec.js +52 -39
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/PartialLengths.perf.spec.js +44 -41
- package/dist/test/PartialLengths.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js +105 -100
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js +14 -18
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +41 -31
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/eslint.config.mts +1 -1
- package/lib/test/Insertion.perf.spec.js +53 -40
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/PartialLengths.perf.spec.js +45 -42
- package/lib/test/PartialLengths.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js +106 -101
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/Snapshot.perf.spec.js +15 -19
- package/lib/test/Snapshot.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js +42 -32
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +24 -27
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @fluidframework/merge-tree
|
|
2
2
|
|
|
3
|
+
## 2.100.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Node 22 is now the minimum supported Node.js version ([#27116](https://github.com/microsoft/FluidFramework/pull/27116)) [e8214d29663](https://github.com/microsoft/FluidFramework/commit/e8214d29663f5ee98d737daed82506a25d8de8d0)
|
|
8
|
+
|
|
9
|
+
All Fluid Framework client packages now require Node.js 22 or later. This aligns with the standing Node upgrade policy as Node 20 reaches end-of-life on April 30, 2026.
|
|
10
|
+
|
|
11
|
+
## 2.93.0
|
|
12
|
+
|
|
13
|
+
Dependency updates only.
|
|
14
|
+
|
|
3
15
|
## 2.92.0
|
|
4
16
|
|
|
5
17
|
Dependency updates only.
|
package/README.md
CHANGED
|
@@ -153,7 +153,7 @@ When making such a request please include if the configuration already works (an
|
|
|
153
153
|
|
|
154
154
|
### Supported Runtimes
|
|
155
155
|
|
|
156
|
-
- NodeJs ^
|
|
156
|
+
- NodeJs ^22.22.2 except that we will drop support for it [when NodeJs 22 loses its upstream support on 2027-04-30](https://github.com/nodejs/release#release-schedule), and will support a newer LTS version of NodeJS at least 1 year before 22 is end-of-life.
|
|
157
157
|
- Running Fluid in a Node.js environment with the `--no-experimental-fetch` flag is not supported.
|
|
158
158
|
- Modern browsers supporting the es2022 standard library: in response to asks we can add explicit support for using babel to polyfill to target specific standards or runtimes (meaning we can avoid/remove use of things that don't polyfill robustly, but otherwise target modern standards).
|
|
159
159
|
|
|
@@ -17,52 +17,65 @@ function constructTree(numOfSegments) {
|
|
|
17
17
|
}
|
|
18
18
|
const TREE_SIZE = 7500;
|
|
19
19
|
describe("MergeTree insertion", () => {
|
|
20
|
-
(0, benchmark_1.
|
|
21
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
20
|
+
(0, benchmark_1.benchmarkIt)({
|
|
22
21
|
title: "insert into empty tree",
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
23
|
+
benchmarkFn: () => {
|
|
24
|
+
const emptyTree = new mergeTree_js_1.MergeTree();
|
|
25
|
+
emptyTree.insertSegments(0, [textSegment_js_1.TextSegment.make("a")], emptyTree.localPerspective, { seq: 0, clientId: 0 }, { op: { type: ops_js_1.MergeTreeDeltaType.INSERT } });
|
|
26
|
+
},
|
|
27
|
+
}),
|
|
27
28
|
});
|
|
28
|
-
|
|
29
|
-
(0, benchmark_1.benchmark)({
|
|
30
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
29
|
+
(0, benchmark_1.benchmarkIt)({
|
|
31
30
|
title: "insert at start of large tree",
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
31
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
32
|
+
benchmarkFnCustom: async (state) => {
|
|
33
|
+
let startTree = constructTree(TREE_SIZE);
|
|
34
|
+
let keepRunning;
|
|
35
|
+
do {
|
|
36
|
+
startTree = constructTree(TREE_SIZE);
|
|
37
|
+
keepRunning = state.timeBatch(() => {
|
|
38
|
+
for (let i = TREE_SIZE; i < TREE_SIZE + 25; i++) {
|
|
39
|
+
startTree.insertSegments(0, [textSegment_js_1.TextSegment.make("a")], startTree.localPerspective, { seq: i + 1, clientId: 0 }, { op: { type: ops_js_1.MergeTreeDeltaType.INSERT } });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
} while (keepRunning);
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
40
45
|
});
|
|
41
|
-
|
|
42
|
-
(0, benchmark_1.benchmark)({
|
|
43
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
46
|
+
(0, benchmark_1.benchmarkIt)({
|
|
44
47
|
title: "insert at middle of large tree",
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
middleTree
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
49
|
+
benchmarkFnCustom: async (state) => {
|
|
50
|
+
let middleTree = constructTree(TREE_SIZE);
|
|
51
|
+
let keepRunning;
|
|
52
|
+
do {
|
|
53
|
+
middleTree = constructTree(TREE_SIZE);
|
|
54
|
+
keepRunning = state.timeBatch(() => {
|
|
55
|
+
for (let i = TREE_SIZE; i < TREE_SIZE + 25; i++) {
|
|
56
|
+
middleTree.insertSegments(TREE_SIZE / 2, [textSegment_js_1.TextSegment.make("a")], middleTree.localPerspective, { seq: i + 1, clientId: 0 }, { op: { type: ops_js_1.MergeTreeDeltaType.INSERT } });
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
} while (keepRunning);
|
|
60
|
+
},
|
|
61
|
+
}),
|
|
53
62
|
});
|
|
54
|
-
|
|
55
|
-
(0, benchmark_1.benchmark)({
|
|
56
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
63
|
+
(0, benchmark_1.benchmarkIt)({
|
|
57
64
|
title: "insert at end of large tree",
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
66
|
+
benchmarkFnCustom: async (state) => {
|
|
67
|
+
let endTree = constructTree(TREE_SIZE);
|
|
68
|
+
let keepRunning;
|
|
69
|
+
do {
|
|
70
|
+
endTree = constructTree(TREE_SIZE);
|
|
71
|
+
keepRunning = state.timeBatch(() => {
|
|
72
|
+
for (let i = TREE_SIZE; i < TREE_SIZE + 25; i++) {
|
|
73
|
+
endTree.insertSegments(i, [textSegment_js_1.TextSegment.make("a")], endTree.localPerspective, { seq: i + 1, clientId: 0 }, { op: { type: ops_js_1.MergeTreeDeltaType.INSERT } });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
} while (keepRunning);
|
|
77
|
+
},
|
|
78
|
+
}),
|
|
66
79
|
});
|
|
67
80
|
});
|
|
68
81
|
//# sourceMappingURL=Insertion.perf.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Insertion.perf.spec.js","sourceRoot":"","sources":["../../src/test/Insertion.perf.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,
|
|
1
|
+
{"version":3,"file":"Insertion.perf.spec.js","sourceRoot":"","sources":["../../src/test/Insertion.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { benchmarkDuration, benchmarkIt } from \"@fluid-tools/benchmark\";\n\nimport { MergeTree } from \"../mergeTree.js\";\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nfunction constructTree(numOfSegments: number): MergeTree {\n\tconst mergeTree = new MergeTree();\n\tfor (let i = 0; i < numOfSegments; i++) {\n\t\tmergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"a\")],\n\t\t\tmergeTree.localPerspective,\n\t\t\t{ seq: i, clientId: 0 },\n\t\t\t{ op: { type: MergeTreeDeltaType.INSERT } },\n\t\t);\n\t}\n\treturn mergeTree;\n}\n\nconst TREE_SIZE: number = 7500;\n\ndescribe(\"MergeTree insertion\", () => {\n\tbenchmarkIt({\n\t\ttitle: \"insert into empty tree\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tconst emptyTree = new MergeTree();\n\t\t\t\temptyTree.insertSegments(\n\t\t\t\t\t0,\n\t\t\t\t\t[TextSegment.make(\"a\")],\n\t\t\t\t\temptyTree.localPerspective,\n\t\t\t\t\t{ seq: 0, clientId: 0 },\n\t\t\t\t\t{ op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t\t);\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"insert at start of large tree\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tlet startTree = constructTree(TREE_SIZE);\n\t\t\t\tlet keepRunning: boolean;\n\t\t\t\tdo {\n\t\t\t\t\tstartTree = constructTree(TREE_SIZE);\n\t\t\t\t\tkeepRunning = state.timeBatch(() => {\n\t\t\t\t\t\tfor (let i = TREE_SIZE; i < TREE_SIZE + 25; i++) {\n\t\t\t\t\t\t\tstartTree.insertSegments(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t[TextSegment.make(\"a\")],\n\t\t\t\t\t\t\t\tstartTree.localPerspective,\n\t\t\t\t\t\t\t\t{ seq: i + 1, clientId: 0 },\n\t\t\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} while (keepRunning);\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"insert at middle of large tree\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tlet middleTree = constructTree(TREE_SIZE);\n\t\t\t\tlet keepRunning: boolean;\n\t\t\t\tdo {\n\t\t\t\t\tmiddleTree = constructTree(TREE_SIZE);\n\t\t\t\t\tkeepRunning = state.timeBatch(() => {\n\t\t\t\t\t\tfor (let i = TREE_SIZE; i < TREE_SIZE + 25; i++) {\n\t\t\t\t\t\t\tmiddleTree.insertSegments(\n\t\t\t\t\t\t\t\tTREE_SIZE / 2,\n\t\t\t\t\t\t\t\t[TextSegment.make(\"a\")],\n\t\t\t\t\t\t\t\tmiddleTree.localPerspective,\n\t\t\t\t\t\t\t\t{ seq: i + 1, clientId: 0 },\n\t\t\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} while (keepRunning);\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"insert at end of large tree\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tlet endTree = constructTree(TREE_SIZE);\n\t\t\t\tlet keepRunning: boolean;\n\t\t\t\tdo {\n\t\t\t\t\tendTree = constructTree(TREE_SIZE);\n\t\t\t\t\tkeepRunning = state.timeBatch(() => {\n\t\t\t\t\t\tfor (let i = TREE_SIZE; i < TREE_SIZE + 25; i++) {\n\t\t\t\t\t\t\tendTree.insertSegments(\n\t\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\t\t[TextSegment.make(\"a\")],\n\t\t\t\t\t\t\t\tendTree.localPerspective,\n\t\t\t\t\t\t\t\t{ seq: i + 1, clientId: 0 },\n\t\t\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} while (keepRunning);\n\t\t\t},\n\t\t}),\n\t});\n});\n"]}
|
|
@@ -10,50 +10,53 @@ const ops_js_1 = require("../ops.js");
|
|
|
10
10
|
const perspective_js_1 = require("../perspective.js");
|
|
11
11
|
const textSegment_js_1 = require("../textSegment.js");
|
|
12
12
|
describe("MergeTree partial lengths", () => {
|
|
13
|
-
const originalIncrementalUpdate = mergeTree_js_1.MergeTree.options.incrementalUpdate;
|
|
14
13
|
for (const incremental of [true, false]) {
|
|
15
|
-
(0, benchmark_1.
|
|
16
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
14
|
+
(0, benchmark_1.benchmarkIt)({
|
|
17
15
|
title: `incremental updates = ${incremental}`,
|
|
18
16
|
category: "partial lengths",
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
17
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
18
|
+
benchmarkFnCustom: async (state) => {
|
|
19
|
+
const originalIncrementalUpdate = mergeTree_js_1.MergeTree.options.incrementalUpdate;
|
|
20
|
+
mergeTree_js_1.MergeTree.options.incrementalUpdate = incremental;
|
|
21
|
+
try {
|
|
22
|
+
state.timeAllBatches(() => {
|
|
23
|
+
const mergeTree = new mergeTree_js_1.MergeTree();
|
|
24
|
+
const clientId = 0;
|
|
25
|
+
let i = 1;
|
|
26
|
+
for (; i < 1001; i++) {
|
|
27
|
+
const stamp = {
|
|
28
|
+
seq: i,
|
|
29
|
+
clientId,
|
|
30
|
+
};
|
|
31
|
+
mergeTree.insertSegments(0, [textSegment_js_1.TextSegment.make("a")], new perspective_js_1.PriorPerspective(i, clientId), stamp, {
|
|
32
|
+
op: { type: ops_js_1.MergeTreeDeltaType.INSERT },
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
for (; i < 2001; i++) {
|
|
36
|
+
const stamp = {
|
|
37
|
+
seq: i,
|
|
38
|
+
clientId,
|
|
39
|
+
};
|
|
40
|
+
mergeTree.markRangeRemoved(i - 1001, i - 1000, new perspective_js_1.PriorPerspective(i, clientId), stamp, {
|
|
41
|
+
op: { type: ops_js_1.MergeTreeDeltaType.REMOVE },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
for (; i < 3001; i++) {
|
|
45
|
+
const stamp = {
|
|
46
|
+
seq: i,
|
|
47
|
+
clientId,
|
|
48
|
+
};
|
|
49
|
+
mergeTree.insertSegments(0, [textSegment_js_1.TextSegment.make("a")], new perspective_js_1.PriorPerspective(i, clientId), stamp, {
|
|
50
|
+
op: { type: ops_js_1.MergeTreeDeltaType.INSERT },
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
mergeTree_js_1.MergeTree.options.incrementalUpdate = originalIncrementalUpdate;
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
57
60
|
});
|
|
58
61
|
}
|
|
59
62
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PartialLengths.perf.spec.js","sourceRoot":"","sources":["../../src/test/PartialLengths.perf.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,
|
|
1
|
+
{"version":3,"file":"PartialLengths.perf.spec.js","sourceRoot":"","sources":["../../src/test/PartialLengths.perf.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,sDAAwE;AAExE,kDAA4C;AAC5C,sCAA+C;AAC/C,sDAAqD;AAErD,sDAAgD;AAEhD,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,KAAK,MAAM,WAAW,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,IAAA,uBAAW,EAAC;YACX,KAAK,EAAE,yBAAyB,WAAW,EAAE;YAC7C,QAAQ,EAAE,iBAAiB;YAC3B,GAAG,IAAA,6BAAiB,EAAC;gBACpB,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAClC,MAAM,yBAAyB,GAAY,wBAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC;oBAC/E,wBAAS,CAAC,OAAO,CAAC,iBAAiB,GAAG,WAAW,CAAC;oBAClD,IAAI,CAAC;wBACJ,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE;4BACzB,MAAM,SAAS,GAAG,IAAI,wBAAS,EAAE,CAAC;4BAElC,MAAM,QAAQ,GAAG,CAAC,CAAC;4BACnB,IAAI,CAAC,GAAG,CAAC,CAAC;4BACV,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gCACtB,MAAM,KAAK,GAAmB;oCAC7B,GAAG,EAAE,CAAC;oCACN,QAAQ;iCACR,CAAC;gCACF,SAAS,CAAC,cAAc,CACvB,CAAC,EACD,CAAC,4BAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvB,IAAI,iCAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,EACjC,KAAK,EACL;oCACC,EAAE,EAAE,EAAE,IAAI,EAAE,2BAAkB,CAAC,MAAM,EAAE;iCACvC,CACD,CAAC;4BACH,CAAC;4BAED,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gCACtB,MAAM,KAAK,GAAmB;oCAC7B,GAAG,EAAE,CAAC;oCACN,QAAQ;iCACR,CAAC;gCACF,SAAS,CAAC,gBAAgB,CACzB,CAAC,GAAG,IAAI,EACR,CAAC,GAAG,IAAI,EACR,IAAI,iCAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,EACjC,KAAK,EACL;oCACC,EAAE,EAAE,EAAE,IAAI,EAAE,2BAAkB,CAAC,MAAM,EAAE;iCACvC,CACD,CAAC;4BACH,CAAC;4BAED,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gCACtB,MAAM,KAAK,GAAmB;oCAC7B,GAAG,EAAE,CAAC;oCACN,QAAQ;iCACR,CAAC;gCACF,SAAS,CAAC,cAAc,CACvB,CAAC,EACD,CAAC,4BAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvB,IAAI,iCAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,EACjC,KAAK,EACL;oCACC,EAAE,EAAE,EAAE,IAAI,EAAE,2BAAkB,CAAC,MAAM,EAAE;iCACvC,CACD,CAAC;4BACH,CAAC;wBACF,CAAC,CAAC,CAAC;oBACJ,CAAC;4BAAS,CAAC;wBACV,wBAAS,CAAC,OAAO,CAAC,iBAAiB,GAAG,yBAAyB,CAAC;oBACjE,CAAC;gBACF,CAAC;aACD,CAAC;SACF,CAAC,CAAC;IACJ,CAAC;AACF,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { benchmarkDuration, benchmarkIt } from \"@fluid-tools/benchmark\";\n\nimport { MergeTree } from \"../mergeTree.js\";\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport type { OperationStamp } from \"../stamps.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\ndescribe(\"MergeTree partial lengths\", () => {\n\tfor (const incremental of [true, false]) {\n\t\tbenchmarkIt({\n\t\t\ttitle: `incremental updates = ${incremental}`,\n\t\t\tcategory: \"partial lengths\",\n\t\t\t...benchmarkDuration({\n\t\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\t\tconst originalIncrementalUpdate: boolean = MergeTree.options.incrementalUpdate;\n\t\t\t\t\tMergeTree.options.incrementalUpdate = incremental;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tstate.timeAllBatches(() => {\n\t\t\t\t\t\t\tconst mergeTree = new MergeTree();\n\n\t\t\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\t\t\tlet i = 1;\n\t\t\t\t\t\t\tfor (; i < 1001; i++) {\n\t\t\t\t\t\t\t\tconst stamp: OperationStamp = {\n\t\t\t\t\t\t\t\t\tseq: i,\n\t\t\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tmergeTree.insertSegments(\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t[TextSegment.make(\"a\")],\n\t\t\t\t\t\t\t\t\tnew PriorPerspective(i, clientId),\n\t\t\t\t\t\t\t\t\tstamp,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\top: { type: MergeTreeDeltaType.INSERT },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfor (; i < 2001; i++) {\n\t\t\t\t\t\t\t\tconst stamp: OperationStamp = {\n\t\t\t\t\t\t\t\t\tseq: i,\n\t\t\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tmergeTree.markRangeRemoved(\n\t\t\t\t\t\t\t\t\ti - 1001,\n\t\t\t\t\t\t\t\t\ti - 1000,\n\t\t\t\t\t\t\t\t\tnew PriorPerspective(i, clientId),\n\t\t\t\t\t\t\t\t\tstamp,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\top: { type: MergeTreeDeltaType.REMOVE },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfor (; i < 3001; i++) {\n\t\t\t\t\t\t\t\tconst stamp: OperationStamp = {\n\t\t\t\t\t\t\t\t\tseq: i,\n\t\t\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tmergeTree.insertSegments(\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t[TextSegment.make(\"a\")],\n\t\t\t\t\t\t\t\t\tnew PriorPerspective(i, clientId),\n\t\t\t\t\t\t\t\t\tstamp,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\top: { type: MergeTreeDeltaType.INSERT },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tMergeTree.options.incrementalUpdate = originalIncrementalUpdate;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\t}\n});\n"]}
|
|
@@ -10,129 +10,134 @@ const perspective_js_1 = require("../perspective.js");
|
|
|
10
10
|
const revertibles_js_1 = require("../revertibles.js");
|
|
11
11
|
const snapshot_utils_js_1 = require("./snapshot.utils.js");
|
|
12
12
|
describe("MergeTree remove", () => {
|
|
13
|
-
|
|
14
|
-
(0, benchmark_1.benchmark)({
|
|
15
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
13
|
+
(0, benchmark_1.benchmarkIt)({
|
|
16
14
|
// baseline summary benchmark to compare to other remove tests. such a
|
|
17
15
|
// comparison should give a (rough) sense of overhead caused by summary
|
|
18
16
|
// loading
|
|
19
17
|
title: "baseline summary load",
|
|
20
18
|
category: "remove",
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
20
|
+
benchmarkFnCustom: async (state) => {
|
|
21
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
22
|
+
for (let i = 0; i < 1000; i++) {
|
|
23
|
+
str.append("a", false);
|
|
24
|
+
}
|
|
25
|
+
str.applyPendingOps();
|
|
26
|
+
const summary = str.getSummary();
|
|
27
|
+
await state.timeAllBatchesAsync(async () => {
|
|
28
|
+
await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
32
|
});
|
|
33
|
-
(0, benchmark_1.
|
|
34
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
33
|
+
(0, benchmark_1.benchmarkIt)({
|
|
35
34
|
title: "remove large range of large tree",
|
|
36
35
|
category: "remove",
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for (let i = 0; i < 1000; i++) {
|
|
40
|
-
str.append("a", false);
|
|
41
|
-
}
|
|
42
|
-
str.applyPendingOps();
|
|
43
|
-
summary = str.getSummary();
|
|
44
|
-
},
|
|
45
|
-
benchmarkFnAsync: async () => {
|
|
46
|
-
const str = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
47
|
-
const refSeq = 1000;
|
|
48
|
-
const clientId = 0;
|
|
49
|
-
str.mergeTree.markRangeRemoved(0, 1000, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
for (const length of [10, 100, 1000]) {
|
|
53
|
-
(0, benchmark_1.benchmark)({
|
|
54
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
55
|
-
title: `remove range of length ${length} from large tree with undo-redo`,
|
|
56
|
-
category: "remove",
|
|
57
|
-
before: () => {
|
|
36
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
37
|
+
benchmarkFnCustom: async (state) => {
|
|
58
38
|
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
59
|
-
for (let i = 0; i <
|
|
60
|
-
str.append("a",
|
|
61
|
-
str.appendMarker(true);
|
|
39
|
+
for (let i = 0; i < 1000; i++) {
|
|
40
|
+
str.append("a", false);
|
|
62
41
|
}
|
|
63
42
|
str.applyPendingOps();
|
|
64
|
-
summary = str.getSummary();
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, revertibles);
|
|
43
|
+
const summary = str.getSummary();
|
|
44
|
+
await state.timeAllBatchesAsync(async () => {
|
|
45
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
46
|
+
const refSeq = 1000;
|
|
47
|
+
const clientId = 0;
|
|
48
|
+
loadedStr.mergeTree.markRangeRemoved(0, 1000, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
71
49
|
});
|
|
72
|
-
const op = str.removeRangeLocal(0, length - 1);
|
|
73
|
-
str.applyMsg(str.makeOpMessage(op,
|
|
74
|
-
/* seq */ length + 1,
|
|
75
|
-
/* refSeq */ length, str.longClientId,
|
|
76
|
-
/* minSeq */ length));
|
|
77
50
|
},
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
for (const length of [10, 100, 1000]) {
|
|
54
|
+
(0, benchmark_1.benchmarkIt)({
|
|
55
|
+
title: `remove range of length ${length} from large tree with undo-redo`,
|
|
56
|
+
category: "remove",
|
|
57
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
58
|
+
benchmarkFnCustom: async (state) => {
|
|
59
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
60
|
+
for (let i = 0; i < length / 2; i++) {
|
|
61
|
+
str.append("a", true);
|
|
62
|
+
str.appendMarker(true);
|
|
63
|
+
}
|
|
64
|
+
str.applyPendingOps();
|
|
65
|
+
const summary = str.getSummary();
|
|
66
|
+
await state.timeAllBatchesAsync(async () => {
|
|
67
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
68
|
+
const revertibles = [];
|
|
69
|
+
loadedStr.on("delta", (_op, delta) => {
|
|
70
|
+
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, revertibles);
|
|
71
|
+
});
|
|
72
|
+
const op = loadedStr.removeRangeLocal(0, length - 1);
|
|
73
|
+
loadedStr.applyMsg(loadedStr.makeOpMessage(op,
|
|
74
|
+
/* seq */ length + 1,
|
|
75
|
+
/* refSeq */ length, loadedStr.longClientId,
|
|
76
|
+
/* minSeq */ length));
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
}),
|
|
78
80
|
});
|
|
79
81
|
}
|
|
80
|
-
(0, benchmark_1.
|
|
81
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
82
|
+
(0, benchmark_1.benchmarkIt)({
|
|
82
83
|
title: "remove start of large tree",
|
|
83
84
|
category: "remove",
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
86
|
+
benchmarkFnCustom: async (state) => {
|
|
87
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
88
|
+
for (let i = 0; i < 1000; i++) {
|
|
89
|
+
str.append("a", false);
|
|
90
|
+
}
|
|
91
|
+
str.applyPendingOps();
|
|
92
|
+
const summary = str.getSummary();
|
|
93
|
+
await state.timeAllBatchesAsync(async () => {
|
|
94
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
95
|
+
const refSeq = 1000;
|
|
96
|
+
const clientId = 0;
|
|
97
|
+
loadedStr.mergeTree.markRangeRemoved(0, 1, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
}),
|
|
98
101
|
});
|
|
99
|
-
(0, benchmark_1.
|
|
100
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
102
|
+
(0, benchmark_1.benchmarkIt)({
|
|
101
103
|
title: "remove middle of large tree",
|
|
102
104
|
category: "remove",
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
105
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
106
|
+
benchmarkFnCustom: async (state) => {
|
|
107
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
108
|
+
for (let i = 0; i < 1000; i++) {
|
|
109
|
+
str.append("a", false);
|
|
110
|
+
}
|
|
111
|
+
str.applyPendingOps();
|
|
112
|
+
const summary = str.getSummary();
|
|
113
|
+
await state.timeAllBatchesAsync(async () => {
|
|
114
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
115
|
+
const refSeq = 1000;
|
|
116
|
+
const clientId = 0;
|
|
117
|
+
loadedStr.mergeTree.markRangeRemoved(499, 501, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
}),
|
|
117
121
|
});
|
|
118
|
-
(0, benchmark_1.
|
|
119
|
-
type: benchmark_1.BenchmarkType.Measurement,
|
|
122
|
+
(0, benchmark_1.benchmarkIt)({
|
|
120
123
|
title: "remove end of large tree",
|
|
121
124
|
category: "remove",
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
125
|
+
...(0, benchmark_1.benchmarkDuration)({
|
|
126
|
+
benchmarkFnCustom: async (state) => {
|
|
127
|
+
const str = new snapshot_utils_js_1.TestString("id", {});
|
|
128
|
+
for (let i = 0; i < 1000; i++) {
|
|
129
|
+
str.append("a", false);
|
|
130
|
+
}
|
|
131
|
+
str.applyPendingOps();
|
|
132
|
+
const summary = str.getSummary();
|
|
133
|
+
await state.timeAllBatchesAsync(async () => {
|
|
134
|
+
const loadedStr = await (0, snapshot_utils_js_1.loadSnapshot)(summary);
|
|
135
|
+
const refSeq = 1000;
|
|
136
|
+
const clientId = 0;
|
|
137
|
+
loadedStr.mergeTree.markRangeRemoved(999, 1000, new perspective_js_1.PriorPerspective(refSeq, clientId), { seq: 1001, clientId }, { op: { type: ops_js_1.MergeTreeDeltaType.REMOVE } });
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
}),
|
|
136
141
|
});
|
|
137
142
|
});
|
|
138
143
|
//# sourceMappingURL=Removal.perf.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Removal.perf.spec.js","sourceRoot":"","sources":["../../src/test/Removal.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\n\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\ndescribe(\"MergeTree remove\", () => {\n\tlet summary: ISummaryTree;\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\t// baseline summary benchmark to compare to other remove tests. such a\n\t\t// comparison should give a (rough) sense of overhead caused by summary\n\t\t// loading\n\t\ttitle: \"baseline summary load\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tawait loadSnapshot(summary);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove large range of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tfor (const length of [10, 100, 1000]) {\n\t\tbenchmark({\n\t\t\ttype: BenchmarkType.Measurement,\n\t\t\ttitle: `remove range of length ${length} from large tree with undo-redo`,\n\t\t\tcategory: \"remove\",\n\t\t\tbefore: () => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < length / 2; i++) {\n\t\t\t\t\tstr.append(\"a\", true);\n\t\t\t\t\tstr.appendMarker(true);\n\t\t\t\t}\n\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tsummary = str.getSummary();\n\t\t\t},\n\t\t\tbenchmarkFnAsync: async () => {\n\t\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\tstr.on(\"delta\", (_op, delta) => {\n\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t\t});\n\n\t\t\t\tconst op = str.removeRangeLocal(0, length - 1);\n\t\t\t\tstr.applyMsg(\n\t\t\t\t\tstr.makeOpMessage(\n\t\t\t\t\t\top,\n\t\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\t\tstr.longClientId,\n\t\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove start of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\t1,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove middle of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t499,\n\t\t\t\t501,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n\n\tbenchmark({\n\t\ttype: BenchmarkType.Measurement,\n\t\ttitle: \"remove end of large tree\",\n\t\tcategory: \"remove\",\n\t\tbefore: () => {\n\t\t\tconst str = new TestString(\"id\", {});\n\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\tstr.append(\"a\", false);\n\t\t\t}\n\n\t\t\tstr.applyPendingOps();\n\t\t\tsummary = str.getSummary();\n\t\t},\n\t\tbenchmarkFnAsync: async () => {\n\t\t\tconst str = await loadSnapshot(summary);\n\n\t\t\tconst refSeq = 1000;\n\t\t\tconst clientId = 0;\n\t\t\tstr.mergeTree.markRangeRemoved(\n\t\t\t\t999,\n\t\t\t\t1000,\n\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t);\n\t\t},\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"Removal.perf.spec.js","sourceRoot":"","sources":["../../src/test/Removal.perf.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { benchmarkDuration, benchmarkIt } from \"@fluid-tools/benchmark\";\n\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { TestString, loadSnapshot } from \"./snapshot.utils.js\";\n\ndescribe(\"MergeTree remove\", () => {\n\tbenchmarkIt({\n\t\t// baseline summary benchmark to compare to other remove tests. such a\n\t\t// comparison should give a (rough) sense of overhead caused by summary\n\t\t// loading\n\t\ttitle: \"baseline summary load\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tawait loadSnapshot(summary);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"remove large range of large tree\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\tconst refSeq = 1000;\n\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\tloadedStr.mergeTree.markRangeRemoved(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t1000,\n\t\t\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n\n\tfor (const length of [10, 100, 1000]) {\n\t\tbenchmarkIt({\n\t\t\ttitle: `remove range of length ${length} from large tree with undo-redo`,\n\t\t\tcategory: \"remove\",\n\t\t\t...benchmarkDuration({\n\t\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\t\tfor (let i = 0; i < length / 2; i++) {\n\t\t\t\t\t\tstr.append(\"a\", true);\n\t\t\t\t\t\tstr.appendMarker(true);\n\t\t\t\t\t}\n\t\t\t\t\tstr.applyPendingOps();\n\t\t\t\t\tconst summary = str.getSummary();\n\t\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\t\t\tloadedStr.on(\"delta\", (_op, delta) => {\n\t\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst op = loadedStr.removeRangeLocal(0, length - 1);\n\t\t\t\t\t\tloadedStr.applyMsg(\n\t\t\t\t\t\t\tloadedStr.makeOpMessage(\n\t\t\t\t\t\t\t\top,\n\t\t\t\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\t\t\t\tloadedStr.longClientId,\n\t\t\t\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\t}\n\n\tbenchmarkIt({\n\t\ttitle: \"remove start of large tree\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\tconst refSeq = 1000;\n\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\tloadedStr.mergeTree.markRangeRemoved(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"remove middle of large tree\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\tconst refSeq = 1000;\n\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\tloadedStr.mergeTree.markRangeRemoved(\n\t\t\t\t\t\t499,\n\t\t\t\t\t\t501,\n\t\t\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n\n\tbenchmarkIt({\n\t\ttitle: \"remove end of large tree\",\n\t\tcategory: \"remove\",\n\t\t...benchmarkDuration({\n\t\t\tbenchmarkFnCustom: async (state) => {\n\t\t\t\tconst str = new TestString(\"id\", {});\n\t\t\t\tfor (let i = 0; i < 1000; i++) {\n\t\t\t\t\tstr.append(\"a\", false);\n\t\t\t\t}\n\t\t\t\tstr.applyPendingOps();\n\t\t\t\tconst summary = str.getSummary();\n\t\t\t\tawait state.timeAllBatchesAsync(async () => {\n\t\t\t\t\tconst loadedStr = await loadSnapshot(summary);\n\n\t\t\t\t\tconst refSeq = 1000;\n\t\t\t\t\tconst clientId = 0;\n\t\t\t\t\tloadedStr.mergeTree.markRangeRemoved(\n\t\t\t\t\t\t999,\n\t\t\t\t\t\t1000,\n\t\t\t\t\t\tnew PriorPerspective(refSeq, clientId),\n\t\t\t\t\t\t{ seq: 1001, clientId },\n\t\t\t\t\t\t{ op: { type: MergeTreeDeltaType.REMOVE } },\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t},\n\t\t}),\n\t});\n});\n"]}
|