core: chain read/write speed benchmarks
This commit is contained in:
		| @@ -176,3 +176,122 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { | ||||
| 		b.Fatalf("insert error (block %d): %v\n", i, err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkChainRead_header_10k(b *testing.B) { | ||||
| 	benchReadChain(b, false, 10000) | ||||
| } | ||||
| func BenchmarkChainRead_full_10k(b *testing.B) { | ||||
| 	benchReadChain(b, true, 10000) | ||||
| } | ||||
| func BenchmarkChainRead_header_100k(b *testing.B) { | ||||
| 	benchReadChain(b, false, 100000) | ||||
| } | ||||
| func BenchmarkChainRead_full_100k(b *testing.B) { | ||||
| 	benchReadChain(b, true, 100000) | ||||
| } | ||||
| func BenchmarkChainRead_header_500k(b *testing.B) { | ||||
| 	benchReadChain(b, false, 500000) | ||||
| } | ||||
| func BenchmarkChainRead_full_500k(b *testing.B) { | ||||
| 	benchReadChain(b, true, 500000) | ||||
| } | ||||
| func BenchmarkChainWrite_header_10k(b *testing.B) { | ||||
| 	benchWriteChain(b, false, 10000) | ||||
| } | ||||
| func BenchmarkChainWrite_full_10k(b *testing.B) { | ||||
| 	benchWriteChain(b, true, 10000) | ||||
| } | ||||
| func BenchmarkChainWrite_header_100k(b *testing.B) { | ||||
| 	benchWriteChain(b, false, 100000) | ||||
| } | ||||
| func BenchmarkChainWrite_full_100k(b *testing.B) { | ||||
| 	benchWriteChain(b, true, 100000) | ||||
| } | ||||
| func BenchmarkChainWrite_header_500k(b *testing.B) { | ||||
| 	benchWriteChain(b, false, 500000) | ||||
| } | ||||
| func BenchmarkChainWrite_full_500k(b *testing.B) { | ||||
| 	benchWriteChain(b, true, 500000) | ||||
| } | ||||
|  | ||||
| // makeChainForBench writes a given number of headers or empty blocks/receipts | ||||
| // into a database. | ||||
| func makeChainForBench(db ethdb.Database, full bool, count uint64) { | ||||
| 	var hash common.Hash | ||||
| 	for n := uint64(0); n < count; n++ { | ||||
| 		header := &types.Header{ | ||||
| 			Coinbase:    common.Address{}, | ||||
| 			Number:      big.NewInt(int64(n)), | ||||
| 			ParentHash:  hash, | ||||
| 			Difficulty:  big.NewInt(1), | ||||
| 			UncleHash:   types.EmptyUncleHash, | ||||
| 			TxHash:      types.EmptyRootHash, | ||||
| 			ReceiptHash: types.EmptyRootHash, | ||||
| 		} | ||||
| 		hash = header.Hash() | ||||
| 		WriteHeader(db, header) | ||||
| 		WriteCanonicalHash(db, hash, n) | ||||
| 		WriteTd(db, hash, big.NewInt(int64(n+1))) | ||||
| 		if full || n == 0 { | ||||
| 			block := types.NewBlockWithHeader(header) | ||||
| 			WriteBody(db, hash, block.Body()) | ||||
| 			WriteBlockReceipts(db, hash, nil) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func benchWriteChain(b *testing.B, full bool, count uint64) { | ||||
| 	for i := 0; i < b.N; i++ { | ||||
| 		dir, err := ioutil.TempDir("", "eth-chain-bench") | ||||
| 		if err != nil { | ||||
| 			b.Fatalf("cannot create temporary directory: %v", err) | ||||
| 		} | ||||
| 		db, err := ethdb.NewLDBDatabase(dir, 128, 1024) | ||||
| 		if err != nil { | ||||
| 			b.Fatalf("error opening database at %v: %v", dir, err) | ||||
| 		} | ||||
| 		makeChainForBench(db, full, count) | ||||
| 		db.Close() | ||||
| 		os.RemoveAll(dir) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func benchReadChain(b *testing.B, full bool, count uint64) { | ||||
| 	dir, err := ioutil.TempDir("", "eth-chain-bench") | ||||
| 	if err != nil { | ||||
| 		b.Fatalf("cannot create temporary directory: %v", err) | ||||
| 	} | ||||
| 	defer os.RemoveAll(dir) | ||||
|  | ||||
| 	db, err := ethdb.NewLDBDatabase(dir, 128, 1024) | ||||
| 	if err != nil { | ||||
| 		b.Fatalf("error opening database at %v: %v", dir, err) | ||||
| 	} | ||||
| 	makeChainForBench(db, full, count) | ||||
| 	db.Close() | ||||
|  | ||||
| 	b.ReportAllocs() | ||||
| 	b.ResetTimer() | ||||
|  | ||||
| 	for i := 0; i < b.N; i++ { | ||||
| 		db, err := ethdb.NewLDBDatabase(dir, 128, 1024) | ||||
| 		if err != nil { | ||||
| 			b.Fatalf("error opening database at %v: %v", dir, err) | ||||
| 		} | ||||
| 		chain, err := NewBlockChain(db, testChainConfig(), FakePow{}, new(event.TypeMux)) | ||||
| 		if err != nil { | ||||
| 			b.Fatalf("error creating chain: %v", err) | ||||
| 		} | ||||
|  | ||||
| 		for n := uint64(0); n < count; n++ { | ||||
| 			header := chain.GetHeaderByNumber(n) | ||||
| 			if full { | ||||
| 				hash := header.Hash() | ||||
| 				GetBody(db, hash) | ||||
| 				GetBlockReceipts(db, hash) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		db.Close() | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user