From f1ae13d7214b22d051bcccb52a4604b1fd7b61d2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 28 Mar 2018 17:41:28 -0700 Subject: [PATCH] faster hamt logic 1. Use a custom bitfield type instead of bigints. 2. Make iterating over a hamt *significantly* faster. License: MIT Signed-off-by: Steven Allen --- package.json | 6 +++++ unixfs/hamt/hamt.go | 55 ++++++++++++++-------------------------- unixfs/hamt/hamt_test.go | 2 +- unixfs/hamt/util.go | 15 ++++++----- unixfs/hamt/util_test.go | 13 ---------- 5 files changed, 35 insertions(+), 56 deletions(-) diff --git a/package.json b/package.json index e2f069fad..8fc8a7813 100644 --- a/package.json +++ b/package.json @@ -581,6 +581,12 @@ "hash": "QmPdqSMmiwtQCBC515gFtMW2mP14HsfgnyQ2k5xPQVxMge", "name": "go-fs-lock", "version": "0.1.2" + }, + { + "author": "Stebalien", + "hash": "QmTbBs3Y3u5F69XNJzdnnc6SP5GKgcXxCDzx6w8m6piVRT", + "name": "go-bitfield", + "version": "0.1.1" } ], "gxVersion": "0.10.0", diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 09bbb24e4..c83ec1cea 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -23,14 +23,13 @@ package hamt import ( "context" "fmt" - "math" - "math/big" "os" dag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" + bitfield "gx/ipfs/QmTbBs3Y3u5F69XNJzdnnc6SP5GKgcXxCDzx6w8m6piVRT/go-bitfield" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" @@ -46,7 +45,7 @@ const ( type Shard struct { nd *dag.ProtoNode - bitfield *big.Int + bitfield bitfield.Bitfield children []child @@ -75,22 +74,22 @@ func NewShard(dserv ipld.DAGService, size int) (*Shard, error) { return nil, err } - ds.bitfield = big.NewInt(0) ds.nd = new(dag.ProtoNode) ds.hashFunc = HashMurmur3 return ds, nil } func makeShard(ds ipld.DAGService, size int) (*Shard, error) { - lg2s := int(math.Log2(float64(size))) - if 1<