Skip to content

Commit c1535b4

Browse files
Cursor.Put: doesn't have bench, but has heap-pointer cgo overhead (#205)
* save * save * save * save * save * save * save * save * save * save * save * save * save * save * save
1 parent 0f8b00a commit c1535b4

File tree

4 files changed

+116
-19
lines changed

4 files changed

+116
-19
lines changed

go.mod

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
module github.com/erigontech/mdbx-go
22

3-
go 1.23.0
4-
5-
toolchain go1.24.1
3+
go 1.24.0
64

75
require github.com/ianlancetaylor/cgosymbolizer v0.0.0-20241129212102-9c50ad6b591e
86

mdbx/cursor.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,9 @@ func (c *Cursor) getVal(setkey, setval []byte, op uint) error {
228228
//
229229
// See mdb_cursor_put.
230230
func (c *Cursor) Put(key, val []byte, flags uint) error {
231+
if c._c == nil || c.txn == nil {
232+
return operrno("mdbx_cursor_put", C.MDBX_EINVAL)
233+
}
231234
var k, v *C.char
232235
if len(key) > 0 {
233236
k = (*C.char)(unsafe.Pointer(&key[0]))

mdbx/cursor_test.go

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,20 +1736,21 @@ func BenchmarkCursor_Set_OneKey(b *testing.B) {
17361736
func BenchmarkCursor_Set_Sequence(b *testing.B) {
17371737
env, _ := setup(b)
17381738

1739-
var db DBI
1740-
keys := make([][]byte, b.N)
1739+
const N = 100
1740+
var keys [N][]byte
17411741
for i := range keys {
1742-
keys[i] = make([]byte, 8)
1743-
binary.BigEndian.PutUint64(keys[i], uint64(i))
1742+
keys[i] = make([]byte, 4)
1743+
binary.BigEndian.PutUint32(keys[i], uint32(i))
17441744
}
17451745

1746+
var db DBI
17461747
if err := env.Update(func(txn *Txn) (err error) {
17471748
db, err = txn.OpenRoot(0)
17481749
if err != nil {
17491750
return err
17501751
}
1751-
for _, k := range keys {
1752-
err = txn.Put(db, k, k, 0)
1752+
for i := range keys {
1753+
err = txn.Put(db, keys[i], keys[i], 0)
17531754
if err != nil {
17541755
return err
17551756
}
@@ -1766,10 +1767,12 @@ func BenchmarkCursor_Set_Sequence(b *testing.B) {
17661767
return err
17671768
}
17681769
b.ResetTimer()
1769-
for i := 0; i < b.N; i++ {
1770-
_, _, err = c.Get(keys[i], nil, Set)
1771-
if err != nil {
1772-
return err
1770+
for b.Loop() {
1771+
for i := range keys {
1772+
_, _, err = c.Get(keys[i], nil, Set)
1773+
if err != nil {
1774+
return err
1775+
}
17731776
}
17741777
}
17751778
return nil
@@ -1823,3 +1826,51 @@ func BenchmarkCursor_Set_Random(b *testing.B) {
18231826
b.Errorf("put: %v", err)
18241827
}
18251828
}
1829+
1830+
func BenchmarkCursor_Put_Sequence(b *testing.B) {
1831+
env, _ := setup(b)
1832+
1833+
const N = 100
1834+
var keys [N][]byte
1835+
for i := range keys {
1836+
keys[i] = make([]byte, 4)
1837+
binary.BigEndian.PutUint32(keys[i], uint32(i))
1838+
}
1839+
1840+
var db DBI
1841+
1842+
if err := env.Update(func(txn *Txn) (err error) {
1843+
db, err = txn.OpenRoot(0)
1844+
if err != nil {
1845+
return err
1846+
}
1847+
for i := range keys {
1848+
err = txn.Put(db, keys[i], keys[i], 0)
1849+
if err != nil {
1850+
return err
1851+
}
1852+
}
1853+
return nil
1854+
}); err != nil {
1855+
b.Errorf("dbi: %v", err)
1856+
return
1857+
}
1858+
1859+
if err := env.Update(func(txn *Txn) (err error) {
1860+
c, err := txn.OpenCursor(db)
1861+
if err != nil {
1862+
return err
1863+
}
1864+
b.ResetTimer()
1865+
for b.Loop() {
1866+
for i := 0; i < N; i++ {
1867+
if err = c.Put(keys[i], keys[i], 0); err != nil {
1868+
return err
1869+
}
1870+
}
1871+
}
1872+
return nil
1873+
}); err != nil {
1874+
b.Errorf("put: %v", err)
1875+
}
1876+
}

mdbx/txn_test.go

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,13 +1326,14 @@ func BenchmarkTxn_Get_OneKey(b *testing.B) {
13261326
func BenchmarkTxn_Get_Sequence(b *testing.B) {
13271327
env, _ := setup(b)
13281328

1329-
var db DBI
1330-
keys := make([][]byte, b.N)
1329+
const N = 100
1330+
var keys [N][]byte
13311331
for i := range keys {
1332-
keys[i] = make([]byte, 8)
1333-
binary.BigEndian.PutUint64(keys[i], uint64(i))
1332+
keys[i] = make([]byte, 4)
1333+
binary.BigEndian.PutUint32(keys[i], uint32(i))
13341334
}
13351335

1336+
var db DBI
13361337
if err := env.Update(func(txn *Txn) (err error) {
13371338
db, err = txn.OpenRoot(0)
13381339
if err != nil {
@@ -1352,13 +1353,57 @@ func BenchmarkTxn_Get_Sequence(b *testing.B) {
13521353

13531354
if err := env.View(func(txn *Txn) (err error) {
13541355
b.ResetTimer()
1355-
for i := 0; i < b.N; i++ {
1356-
_, err := txn.Get(db, keys[i])
1356+
for b.Loop() {
1357+
for i := 0; i < N; i++ {
1358+
if _, err = txn.Get(db, keys[i]); err != nil {
1359+
return err
1360+
}
1361+
}
1362+
}
1363+
return nil
1364+
}); err != nil {
1365+
b.Errorf("put: %v", err)
1366+
}
1367+
}
1368+
1369+
func BenchmarkTxn_Put_Sequence(b *testing.B) {
1370+
env, _ := setup(b)
1371+
1372+
const N = 100
1373+
var keys [N][]byte
1374+
for i := range keys {
1375+
keys[i] = make([]byte, 4)
1376+
binary.BigEndian.PutUint32(keys[i], uint32(i))
1377+
}
1378+
1379+
var db DBI
1380+
if err := env.Update(func(txn *Txn) (err error) {
1381+
db, err = txn.OpenRoot(0)
1382+
if err != nil {
1383+
return err
1384+
}
1385+
for _, k := range keys {
1386+
err = txn.Put(db, k, k, 0)
13571387
if err != nil {
13581388
return err
13591389
}
13601390
}
13611391
return nil
1392+
}); err != nil {
1393+
b.Errorf("dbi: %v", err)
1394+
return
1395+
}
1396+
1397+
if err := env.Update(func(txn *Txn) (err error) {
1398+
b.ResetTimer()
1399+
for b.Loop() {
1400+
for i := 0; i < N; i++ {
1401+
if err = txn.Put(db, keys[i], keys[i], 0); err != nil {
1402+
return err
1403+
}
1404+
}
1405+
}
1406+
return nil
13621407
}); err != nil {
13631408
b.Errorf("put: %v", err)
13641409
}

0 commit comments

Comments
 (0)