Skip to content

Commit

Permalink
Split the tree concurrency test codes
Browse files Browse the repository at this point in the history
  • Loading branch information
justiceHui committed Jan 19, 2024
1 parent 0b80f61 commit 0741b44
Show file tree
Hide file tree
Showing 2 changed files with 278 additions and 247 deletions.
278 changes: 278 additions & 0 deletions test/integration/tree_concurrency_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,278 @@
//go:build integration

/*
* Copyright 2024 The Yorkie Authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package integration

import (
"context"
"testing"

"github.com/stretchr/testify/assert"

"github.com/yorkie-team/yorkie/pkg/document"
"github.com/yorkie-team/yorkie/pkg/document/json"
"github.com/yorkie-team/yorkie/pkg/document/presence"
"github.com/yorkie-team/yorkie/test/helper"
)

type rangeType struct {
from, to int
}

type rangeWithMiddleType struct {
from, mid, to int
}

type twoRangesType struct {
ranges [2]rangeWithMiddleType
desc string
}

type rangeSelector int

const (
RangeUnknown rangeSelector = iota
RangeFront
RangeMiddle
RangeBack
RangeAll
)

func getRange(ranges twoRangesType, selector rangeSelector, user int) rangeType {
if selector == RangeFront {
return rangeType{ranges.ranges[user].from, ranges.ranges[user].from}
} else if selector == RangeMiddle {
return rangeType{ranges.ranges[user].mid, ranges.ranges[user].mid}
} else if selector == RangeBack {
return rangeType{ranges.ranges[user].to, ranges.ranges[user].to}
} else if selector == RangeAll {
return rangeType{ranges.ranges[user].from, ranges.ranges[user].to}
}
return rangeType{-1, -1}
}

type styleOperationType struct {
selector rangeSelector
op styleOpCode
key, value string
desc string
}

type editOperationType struct {
selector rangeSelector
op editOpCode
content *json.TreeNode
splitLevel int
desc string
}

type styleOpCode int
type editOpCode int

const (
StyleUndefined styleOpCode = iota
StyleRemove
StyleSet
)

const (
EditUndefined editOpCode = iota
EditUpdate
)

func makeTwoRanges(from1, mid1, to1 int, from2, mid2, to2 int, desc string) twoRangesType {
range0 := rangeWithMiddleType{from1, mid1, to1}
range1 := rangeWithMiddleType{from2, mid2, to2}
return twoRangesType{[2]rangeWithMiddleType{range0, range1}, desc}
}

var rangesToTestSameTypeOperation = []twoRangesType{
makeTwoRanges(3, -1, 6, 3, -1, 6, `equal`), // (3, 6) - (3, 6)
makeTwoRanges(0, -1, 9, 3, -1, 6, `contain`), // (0, 9) - (3, 6)
makeTwoRanges(0, -1, 6, 3, -1, 9, `intersect`), // (0, 6) - (3, 9)
makeTwoRanges(0, -1, 3, 3, -1, 6, `side-by-side`), // (0, 3) - (3, 6)
}

var rangesToTestMixedTypeOperation = []twoRangesType{
makeTwoRanges(3, 3, 6, 3, -1, 6, `equal`), // (3, 6) - (3, 6)
makeTwoRanges(0, 3, 9, 3, -1, 6, `A contains B`), // (0, 9) - (3, 6)
makeTwoRanges(3, 3, 6, 0, -1, 9, `B contains A`), // (0, 9) - (3, 6)
makeTwoRanges(0, 3, 6, 3, -1, 9, `intersect`), // (0, 6) - (3, 9)
makeTwoRanges(0, 3, 3, 3, -1, 6, `A -> B`), // (0, 3) - (3, 6)
makeTwoRanges(3, 3, 6, 0, -1, 3, `B -> A`), // (0, 3) - (3, 6)
}

func runStyleOperation(t *testing.T, doc *document.Document, user int, ranges twoRangesType, operation styleOperationType) {
interval := getRange(ranges, operation.selector, user)
from, to := interval.from, interval.to

assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error {
if operation.op == StyleRemove {
root.GetTree("t").RemoveStyle(from, to, []string{operation.key})
} else if operation.op == StyleSet {
root.GetTree("t").Style(from, to, map[string]string{operation.key: operation.value})
}
return nil
}))
}

func runEditOperation(t *testing.T, doc *document.Document, user int, ranges twoRangesType, operation editOperationType) {
interval := getRange(ranges, operation.selector, user)
from, to := interval.from, interval.to

assert.NoError(t, doc.Update(func(root *json.Object, p *presence.Presence) error {
root.GetTree("t").Edit(from, to, operation.content, operation.splitLevel)
return nil
}))
}

func TestTreeConcurrencyStyle(t *testing.T) {
// 0 1 2 3 4 5 6 7 8 9
// <root> <p> a </p> <p> b </p> <p> c </p> </root>
// 0,3 : |----------|
// 3,6 : |----------|
// 6,9 : |----------|

initialState := json.TreeNode{
Type: "root",
Children: []json.TreeNode{
{Type: "p", Children: []json.TreeNode{{Type: "text", Value: "a"}}},
{Type: "p", Children: []json.TreeNode{{Type: "text", Value: "b"}}},
{Type: "p", Children: []json.TreeNode{{Type: "text", Value: "c"}}},
},
}
initialXML := `<root><p>a</p><p>b</p><p>c</p></root>`

styleOperationsToTest := []styleOperationType{
{RangeAll, StyleRemove, "bold", "", `remove-bold`},
{RangeAll, StyleSet, "bold", "aa", `set-bold-aa`},
{RangeAll, StyleSet, "bold", "bb", `set-bold-bb`},
{RangeAll, StyleRemove, "italic", "", `remove-italic`},
{RangeAll, StyleSet, "italic", "aa", `set-italic-aa`},
{RangeAll, StyleSet, "italic", "bb", `set-italic-bb`},
}

runStyleTest := func(ranges twoRangesType, op1, op2 styleOperationType) {
clients := activeClients(t, 2)
c1, c2 := clients[0], clients[1]
defer deactivateAndCloseClients(t, clients)

ctx := context.Background()
d1 := document.New(helper.TestDocKey(t))
assert.NoError(t, c1.Attach(ctx, d1))
d2 := document.New(helper.TestDocKey(t))
assert.NoError(t, c2.Attach(ctx, d2))

assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error {
root.SetNewTree("t", &initialState)
return nil
}))
assert.NoError(t, c1.Sync(ctx))
assert.NoError(t, c2.Sync(ctx))
assert.Equal(t, initialXML, d1.Root().GetTree("t").ToXML())
assert.Equal(t, initialXML, d2.Root().GetTree("t").ToXML())

runStyleOperation(t, d1, 0, ranges, op1)
runStyleOperation(t, d2, 1, ranges, op2)
syncClientsThenAssertEqual(t, []clientAndDocPair{{c1, d1}, {c2, d2}})
}

for _, interval := range rangesToTestSameTypeOperation {
for _, op1 := range styleOperationsToTest {
for _, op2 := range styleOperationsToTest {
desc := "concurrently style-style test " + interval.desc + "(" + op1.desc + " " + op2.desc + ")"
t.Run(desc, func(t *testing.T) {
runStyleTest(interval, op1, op2)
})
}
}
}
}

func TestTreeConcurrencyEditAndStyle(t *testing.T) {
// 0 1 2 3 4 5 6 7 8 9
// <root> <p> a </p> <p> b </p> <p> c </p> </root>
// 0,3 : |----------|
// 3,6 : |----------|
// 6,9 : |----------|

initialState := json.TreeNode{
Type: "root",
Children: []json.TreeNode{
{Type: "p", Children: []json.TreeNode{{Type: "text", Value: "a"}}},
{Type: "p", Children: []json.TreeNode{{Type: "text", Value: "b"}}},
{Type: "p", Children: []json.TreeNode{{Type: "text", Value: "c"}}},
},
}
initialXML := `<root><p>a</p><p>b</p><p>c</p></root>`

content := &json.TreeNode{Type: "p", Attributes: map[string]string{"italic": "true"}, Children: []json.TreeNode{{Type: "text", Value: `d`}}}

editOperationsToTest := []editOperationType{
{RangeFront, EditUpdate, content, 0, `insertFront`},
{RangeMiddle, EditUpdate, content, 0, `insertMiddle`},
{RangeBack, EditUpdate, content, 0, `insertBack`},
{RangeAll, EditUpdate, nil, 0, `erase`},
{RangeAll, EditUpdate, content, 0, `change`},
}

styleOperationsToTest := []styleOperationType{
{RangeAll, StyleRemove, "bold", "", `remove-bold`},
{RangeAll, StyleSet, "bold", "aa", `set-bold-aa`},
}

runEditStyleTest := func(ranges twoRangesType, op1 editOperationType, op2 styleOperationType) bool {
clients := activeClients(t, 2)
c1, c2 := clients[0], clients[1]
defer deactivateAndCloseClients(t, clients)

ctx := context.Background()
d1 := document.New(helper.TestDocKey(t))
assert.NoError(t, c1.Attach(ctx, d1))
d2 := document.New(helper.TestDocKey(t))
assert.NoError(t, c2.Attach(ctx, d2))

assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error {
root.SetNewTree("t", &initialState)
return nil
}))
assert.NoError(t, c1.Sync(ctx))
assert.NoError(t, c2.Sync(ctx))
assert.Equal(t, initialXML, d1.Root().GetTree("t").ToXML())
assert.Equal(t, initialXML, d2.Root().GetTree("t").ToXML())

runEditOperation(t, d1, 0, ranges, op1)
runStyleOperation(t, d2, 1, ranges, op2)

return syncClientsThenCheckEqual(t, []clientAndDocPair{{c1, d1}, {c2, d2}})
}

for _, interval := range rangesToTestMixedTypeOperation {
for _, op1 := range editOperationsToTest {
for _, op2 := range styleOperationsToTest {
desc := "concurrently edit-style test-" + interval.desc + "("
desc += op1.desc + "," + op2.desc + ")"
t.Run(desc, func(t *testing.T) {
if !runEditStyleTest(interval, op1, op2) {
t.Skip()
}
})
}
}
}
}
Loading

1 comment on commit 0741b44

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Go Benchmark

Benchmark suite Current: 0741b44 Previous: 4ea4eae Ratio
BenchmarkDocument/constructor_test - ns/op 1416 ns/op 1336 ns/op 1.06
BenchmarkDocument/constructor_test - B/op 1224 B/op 1208 B/op 1.01
BenchmarkDocument/constructor_test - allocs/op 21 allocs/op 20 allocs/op 1.05
BenchmarkDocument/status_test - ns/op 855.1 ns/op 785.2 ns/op 1.09
BenchmarkDocument/status_test - B/op 1192 B/op 1176 B/op 1.01
BenchmarkDocument/status_test - allocs/op 19 allocs/op 18 allocs/op 1.06
BenchmarkDocument/equals_test - ns/op 7498 ns/op 7092 ns/op 1.06
BenchmarkDocument/equals_test - B/op 6977 B/op 6913 B/op 1.01
BenchmarkDocument/equals_test - allocs/op 124 allocs/op 120 allocs/op 1.03
BenchmarkDocument/nested_update_test - ns/op 16806 ns/op 16151 ns/op 1.04
BenchmarkDocument/nested_update_test - B/op 12059 B/op 11963 B/op 1.01
BenchmarkDocument/nested_update_test - allocs/op 260 allocs/op 254 allocs/op 1.02
BenchmarkDocument/delete_test - ns/op 25713 ns/op 21933 ns/op 1.17
BenchmarkDocument/delete_test - B/op 15284 B/op 15188 B/op 1.01
BenchmarkDocument/delete_test - allocs/op 339 allocs/op 333 allocs/op 1.02
BenchmarkDocument/object_test - ns/op 8616 ns/op 8361 ns/op 1.03
BenchmarkDocument/object_test - B/op 6753 B/op 6721 B/op 1.00
BenchmarkDocument/object_test - allocs/op 118 allocs/op 116 allocs/op 1.02
BenchmarkDocument/array_test - ns/op 29515 ns/op 32610 ns/op 0.91
BenchmarkDocument/array_test - B/op 11883 B/op 11819 B/op 1.01
BenchmarkDocument/array_test - allocs/op 274 allocs/op 270 allocs/op 1.01
BenchmarkDocument/text_test - ns/op 31073 ns/op 30219 ns/op 1.03
BenchmarkDocument/text_test - B/op 14915 B/op 14795 B/op 1.01
BenchmarkDocument/text_test - allocs/op 470 allocs/op 468 allocs/op 1.00
BenchmarkDocument/text_composition_test - ns/op 29514 ns/op 28748 ns/op 1.03
BenchmarkDocument/text_composition_test - B/op 18428 B/op 18278 B/op 1.01
BenchmarkDocument/text_composition_test - allocs/op 479 allocs/op 477 allocs/op 1.00
BenchmarkDocument/rich_text_test - ns/op 81780 ns/op 79589 ns/op 1.03
BenchmarkDocument/rich_text_test - B/op 38676 B/op 38540 B/op 1.00
BenchmarkDocument/rich_text_test - allocs/op 1149 allocs/op 1147 allocs/op 1.00
BenchmarkDocument/counter_test - ns/op 17553 ns/op 16595 ns/op 1.06
BenchmarkDocument/counter_test - B/op 10466 B/op 10210 B/op 1.03
BenchmarkDocument/counter_test - allocs/op 238 allocs/op 236 allocs/op 1.01
BenchmarkDocument/text_edit_gc_100 - ns/op 2988843 ns/op 2884438 ns/op 1.04
BenchmarkDocument/text_edit_gc_100 - B/op 1658610 B/op 1655268 B/op 1.00
BenchmarkDocument/text_edit_gc_100 - allocs/op 17095 allocs/op 17093 allocs/op 1.00
BenchmarkDocument/text_edit_gc_1000 - ns/op 232908590 ns/op 230271811 ns/op 1.01
BenchmarkDocument/text_edit_gc_1000 - B/op 144394620 B/op 144376180 B/op 1.00
BenchmarkDocument/text_edit_gc_1000 - allocs/op 200985 allocs/op 201058 allocs/op 1.00
BenchmarkDocument/text_split_gc_100 - ns/op 3472233 ns/op 3383745 ns/op 1.03
BenchmarkDocument/text_split_gc_100 - B/op 2316771 B/op 2314004 B/op 1.00
BenchmarkDocument/text_split_gc_100 - allocs/op 16195 allocs/op 16197 allocs/op 1.00
BenchmarkDocument/text_split_gc_1000 - ns/op 296887427 ns/op 288385837 ns/op 1.03
BenchmarkDocument/text_split_gc_1000 - B/op 228933972 B/op 228887600 B/op 1.00
BenchmarkDocument/text_split_gc_1000 - allocs/op 204000 allocs/op 203930 allocs/op 1.00
BenchmarkDocument/text_delete_all_10000 - ns/op 10839998 ns/op 11000897 ns/op 0.99
BenchmarkDocument/text_delete_all_10000 - B/op 5810495 B/op 5809330 B/op 1.00
BenchmarkDocument/text_delete_all_10000 - allocs/op 40673 allocs/op 40669 allocs/op 1.00
BenchmarkDocument/text_delete_all_100000 - ns/op 203299568 ns/op 182534409 ns/op 1.11
BenchmarkDocument/text_delete_all_100000 - B/op 81899909 B/op 81903677 B/op 1.00
BenchmarkDocument/text_delete_all_100000 - allocs/op 411610 allocs/op 411647 allocs/op 1.00
BenchmarkDocument/text_100 - ns/op 241203 ns/op 218449 ns/op 1.10
BenchmarkDocument/text_100 - B/op 120138 B/op 118483 B/op 1.01
BenchmarkDocument/text_100 - allocs/op 5082 allocs/op 5080 allocs/op 1.00
BenchmarkDocument/text_1000 - ns/op 2561650 ns/op 2374004 ns/op 1.08
BenchmarkDocument/text_1000 - B/op 1169130 B/op 1153070 B/op 1.01
BenchmarkDocument/text_1000 - allocs/op 50086 allocs/op 50084 allocs/op 1.00
BenchmarkDocument/array_1000 - ns/op 1291307 ns/op 1196526 ns/op 1.08
BenchmarkDocument/array_1000 - B/op 1091411 B/op 1091301 B/op 1.00
BenchmarkDocument/array_1000 - allocs/op 11830 allocs/op 11826 allocs/op 1.00
BenchmarkDocument/array_10000 - ns/op 13632662 ns/op 13416629 ns/op 1.02
BenchmarkDocument/array_10000 - B/op 9800273 B/op 9799640 B/op 1.00
BenchmarkDocument/array_10000 - allocs/op 120296 allocs/op 120291 allocs/op 1.00
BenchmarkDocument/array_gc_100 - ns/op 157936 ns/op 143463 ns/op 1.10
BenchmarkDocument/array_gc_100 - B/op 132680 B/op 132481 B/op 1.00
BenchmarkDocument/array_gc_100 - allocs/op 1259 allocs/op 1248 allocs/op 1.01
BenchmarkDocument/array_gc_1000 - ns/op 1463647 ns/op 1378307 ns/op 1.06
BenchmarkDocument/array_gc_1000 - B/op 1159080 B/op 1158986 B/op 1.00
BenchmarkDocument/array_gc_1000 - allocs/op 12875 allocs/op 12865 allocs/op 1.00
BenchmarkDocument/counter_1000 - ns/op 236924 ns/op 198075 ns/op 1.20
BenchmarkDocument/counter_1000 - B/op 192917 B/op 192851 B/op 1.00
BenchmarkDocument/counter_1000 - allocs/op 5767 allocs/op 5765 allocs/op 1.00
BenchmarkDocument/counter_10000 - ns/op 2380218 ns/op 2156556 ns/op 1.10
BenchmarkDocument/counter_10000 - B/op 2087852 B/op 2087769 B/op 1.00
BenchmarkDocument/counter_10000 - allocs/op 59774 allocs/op 59772 allocs/op 1.00
BenchmarkDocument/object_1000 - ns/op 1452013 ns/op 1317018 ns/op 1.10
BenchmarkDocument/object_1000 - B/op 1428092 B/op 1427906 B/op 1.00
BenchmarkDocument/object_1000 - allocs/op 9847 allocs/op 9845 allocs/op 1.00
BenchmarkDocument/object_10000 - ns/op 15319401 ns/op 14690867 ns/op 1.04
BenchmarkDocument/object_10000 - B/op 12168214 B/op 12166752 B/op 1.00
BenchmarkDocument/object_10000 - allocs/op 100567 allocs/op 100562 allocs/op 1.00
BenchmarkDocument/tree_100 - ns/op 1089955 ns/op 1009303 ns/op 1.08
BenchmarkDocument/tree_100 - B/op 943783 B/op 943675 B/op 1.00
BenchmarkDocument/tree_100 - allocs/op 6102 allocs/op 6099 allocs/op 1.00
BenchmarkDocument/tree_1000 - ns/op 77936458 ns/op 72072982 ns/op 1.08
BenchmarkDocument/tree_1000 - B/op 86481709 B/op 86459854 B/op 1.00
BenchmarkDocument/tree_1000 - allocs/op 60116 allocs/op 60114 allocs/op 1.00
BenchmarkDocument/tree_10000 - ns/op 9916790407 ns/op 9443141797 ns/op 1.05
BenchmarkDocument/tree_10000 - B/op 8580657776 B/op 8580991992 B/op 1.00
BenchmarkDocument/tree_10000 - allocs/op 600199 allocs/op 600248 allocs/op 1.00
BenchmarkDocument/tree_delete_all_1000 - ns/op 80974312 ns/op 71663719 ns/op 1.13
BenchmarkDocument/tree_delete_all_1000 - B/op 86990019 B/op 86990239 B/op 1.00
BenchmarkDocument/tree_delete_all_1000 - allocs/op 67753 allocs/op 67749 allocs/op 1.00
BenchmarkDocument/tree_edit_gc_100 - ns/op 3953160 ns/op 3632525 ns/op 1.09
BenchmarkDocument/tree_edit_gc_100 - B/op 4121106 B/op 4121046 B/op 1.00
BenchmarkDocument/tree_edit_gc_100 - allocs/op 14359 allocs/op 14356 allocs/op 1.00
BenchmarkDocument/tree_edit_gc_1000 - ns/op 321778256 ns/op 295614209 ns/op 1.09
BenchmarkDocument/tree_edit_gc_1000 - B/op 383466982 B/op 383467646 B/op 1.00
BenchmarkDocument/tree_edit_gc_1000 - allocs/op 145414 allocs/op 145413 allocs/op 1.00
BenchmarkDocument/tree_split_gc_100 - ns/op 2642082 ns/op 2433512 ns/op 1.09
BenchmarkDocument/tree_split_gc_100 - B/op 2386979 B/op 2386869 B/op 1.00
BenchmarkDocument/tree_split_gc_100 - allocs/op 10344 allocs/op 10341 allocs/op 1.00
BenchmarkDocument/tree_split_gc_1000 - ns/op 195286280 ns/op 183611128 ns/op 1.06
BenchmarkDocument/tree_split_gc_1000 - B/op 221992025 B/op 221991942 B/op 1.00
BenchmarkDocument/tree_split_gc_1000 - allocs/op 112268 allocs/op 112259 allocs/op 1.00
BenchmarkRPC/client_to_server - ns/op 358370229 ns/op 355717978 ns/op 1.01
BenchmarkRPC/client_to_server - B/op 17793632 B/op 17228981 B/op 1.03
BenchmarkRPC/client_to_server - allocs/op 166926 allocs/op 166831 allocs/op 1.00
BenchmarkRPC/client_to_client_via_server - ns/op 606773688 ns/op 606482578 ns/op 1.00
BenchmarkRPC/client_to_client_via_server - B/op 35337256 B/op 32116544 B/op 1.10
BenchmarkRPC/client_to_client_via_server - allocs/op 312071 allocs/op 312901 allocs/op 1.00
BenchmarkRPC/attach_large_document - ns/op 1416748029 ns/op 1170164855 ns/op 1.21
BenchmarkRPC/attach_large_document - B/op 1879521152 B/op 1888403296 B/op 1.00
BenchmarkRPC/attach_large_document - allocs/op 7565 allocs/op 7527 allocs/op 1.01
BenchmarkRPC/adminCli_to_server - ns/op 542278634 ns/op 542495623 ns/op 1.00
BenchmarkRPC/adminCli_to_server - B/op 35982928 B/op 36802124 B/op 0.98
BenchmarkRPC/adminCli_to_server - allocs/op 289643 allocs/op 289677 allocs/op 1.00
BenchmarkLocker - ns/op 66.61 ns/op 65.96 ns/op 1.01
BenchmarkLocker - B/op 16 B/op 16 B/op 1
BenchmarkLocker - allocs/op 1 allocs/op 1 allocs/op 1
BenchmarkLockerParallel - ns/op 45.71 ns/op 38.94 ns/op 1.17
BenchmarkLockerParallel - B/op 0 B/op 0 B/op NaN
BenchmarkLockerParallel - allocs/op 0 allocs/op 0 allocs/op NaN
BenchmarkLockerMoreKeys - ns/op 153.3 ns/op 141.9 ns/op 1.08
BenchmarkLockerMoreKeys - B/op 15 B/op 15 B/op 1
BenchmarkLockerMoreKeys - allocs/op 0 allocs/op 0 allocs/op NaN
BenchmarkChange/Push_10_Changes - ns/op 3788035 ns/op 3782260 ns/op 1.00
BenchmarkChange/Push_10_Changes - B/op 125999 B/op 125995 B/op 1.00
BenchmarkChange/Push_10_Changes - allocs/op 1254 allocs/op 1253 allocs/op 1.00
BenchmarkChange/Push_100_Changes - ns/op 14279468 ns/op 14268879 ns/op 1.00
BenchmarkChange/Push_100_Changes - B/op 645207 B/op 639349 B/op 1.01
BenchmarkChange/Push_100_Changes - allocs/op 6537 allocs/op 6540 allocs/op 1.00
BenchmarkChange/Push_1000_Changes - ns/op 113919497 ns/op 114005417 ns/op 1.00
BenchmarkChange/Push_1000_Changes - B/op 6133951 B/op 6146349 B/op 1.00
BenchmarkChange/Push_1000_Changes - allocs/op 62160 allocs/op 62158 allocs/op 1.00
BenchmarkChange/Pull_10_Changes - ns/op 2852375 ns/op 2883610 ns/op 0.99
BenchmarkChange/Pull_10_Changes - B/op 100200 B/op 100810 B/op 0.99
BenchmarkChange/Pull_10_Changes - allocs/op 952 allocs/op 952 allocs/op 1
BenchmarkChange/Pull_100_Changes - ns/op 4308575 ns/op 4323201 ns/op 1.00
BenchmarkChange/Pull_100_Changes - B/op 256953 B/op 258124 B/op 1.00
BenchmarkChange/Pull_100_Changes - allocs/op 3154 allocs/op 3153 allocs/op 1.00
BenchmarkChange/Pull_1000_Changes - ns/op 8557467 ns/op 8208312 ns/op 1.04
BenchmarkChange/Pull_1000_Changes - B/op 1393652 B/op 1395853 B/op 1.00
BenchmarkChange/Pull_1000_Changes - allocs/op 26871 allocs/op 26874 allocs/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - ns/op 16632142 ns/op 16781594 ns/op 0.99
BenchmarkSnapshot/Push_3KB_snapshot - B/op 809855 B/op 806918 B/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - allocs/op 6542 allocs/op 6543 allocs/op 1.00
BenchmarkSnapshot/Push_30KB_snapshot - ns/op 117074822 ns/op 117538584 ns/op 1.00
BenchmarkSnapshot/Push_30KB_snapshot - B/op 6268760 B/op 6293910 B/op 1.00
BenchmarkSnapshot/Push_30KB_snapshot - allocs/op 62257 allocs/op 62159 allocs/op 1.00
BenchmarkSnapshot/Pull_3KB_snapshot - ns/op 6496266 ns/op 6555276 ns/op 0.99
BenchmarkSnapshot/Pull_3KB_snapshot - B/op 903796 B/op 905327 B/op 1.00
BenchmarkSnapshot/Pull_3KB_snapshot - allocs/op 14880 allocs/op 14879 allocs/op 1.00
BenchmarkSnapshot/Pull_30KB_snapshot - ns/op 14697894 ns/op 14921599 ns/op 0.99
BenchmarkSnapshot/Pull_30KB_snapshot - B/op 6979675 B/op 6982547 B/op 1.00
BenchmarkSnapshot/Pull_30KB_snapshot - allocs/op 144143 allocs/op 144138 allocs/op 1.00
BenchmarkSync/memory_sync_10_test - ns/op 6910 ns/op 6869 ns/op 1.01
BenchmarkSync/memory_sync_10_test - B/op 1286 B/op 1286 B/op 1
BenchmarkSync/memory_sync_10_test - allocs/op 38 allocs/op 38 allocs/op 1
BenchmarkSync/memory_sync_100_test - ns/op 51473 ns/op 51839 ns/op 0.99
BenchmarkSync/memory_sync_100_test - B/op 8656 B/op 8646 B/op 1.00
BenchmarkSync/memory_sync_100_test - allocs/op 274 allocs/op 273 allocs/op 1.00
BenchmarkSync/memory_sync_1000_test - ns/op 584647 ns/op 597671 ns/op 0.98
BenchmarkSync/memory_sync_1000_test - B/op 74563 B/op 74301 B/op 1.00
BenchmarkSync/memory_sync_1000_test - allocs/op 2120 allocs/op 2106 allocs/op 1.01
BenchmarkSync/memory_sync_10000_test - ns/op 6932562 ns/op 7337210 ns/op 0.94
BenchmarkSync/memory_sync_10000_test - B/op 746693 B/op 759441 B/op 0.98
BenchmarkSync/memory_sync_10000_test - allocs/op 20433 allocs/op 20499 allocs/op 1.00
BenchmarkTextEditing - ns/op 19079766838 ns/op 18812245791 ns/op 1.01
BenchmarkTextEditing - B/op 9042654040 B/op 9038099880 B/op 1.00
BenchmarkTextEditing - allocs/op 19923411 allocs/op 19923868 allocs/op 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.