core: add blockchain benchmarks
This commit is contained in:
		
							parent
							
								
									14c9215dd3
								
							
						
					
					
						commit
						8c31d2897b
					
				| @ -1338,3 +1338,114 @@ func TestLargeReorgTrieGC(t *testing.T) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // Benchmarks large blocks with value transfers to non-existing accounts
 | ||||||
|  | func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks int, recipientFn func(uint64) common.Address, dataFn func(uint64) []byte) { | ||||||
|  | 	var ( | ||||||
|  | 		signer          = types.HomesteadSigner{} | ||||||
|  | 		testBankKey, _  = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") | ||||||
|  | 		testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey) | ||||||
|  | 		bankFunds       = big.NewInt(100000000000000000) | ||||||
|  | 		gspec           = Genesis{ | ||||||
|  | 			Config: params.TestChainConfig, | ||||||
|  | 			Alloc: GenesisAlloc{ | ||||||
|  | 				testBankAddress: {Balance: bankFunds}, | ||||||
|  | 				common.HexToAddress("0xc0de"): { | ||||||
|  | 					Code:    []byte{0x60, 0x01, 0x50}, | ||||||
|  | 					Balance: big.NewInt(0), | ||||||
|  | 				}, // push 1, pop
 | ||||||
|  | 			}, | ||||||
|  | 			GasLimit: 100e6, // 100 M
 | ||||||
|  | 		} | ||||||
|  | 	) | ||||||
|  | 	// Generate the original common chain segment and the two competing forks
 | ||||||
|  | 	engine := ethash.NewFaker() | ||||||
|  | 	db, _ := ethdb.NewMemDatabase() | ||||||
|  | 	genesis := gspec.MustCommit(db) | ||||||
|  | 
 | ||||||
|  | 	blockGenerator := func(i int, block *BlockGen) { | ||||||
|  | 		block.SetCoinbase(common.Address{1}) | ||||||
|  | 		for txi := 0; txi < numTxs; txi++ { | ||||||
|  | 			uniq := uint64(i*numTxs + txi) | ||||||
|  | 			recipient := recipientFn(uniq) | ||||||
|  | 			//recipient := common.BigToAddress(big.NewInt(0).SetUint64(1337 + uniq))
 | ||||||
|  | 			tx, err := types.SignTx(types.NewTransaction(uniq, recipient, big.NewInt(1), params.TxGas, big.NewInt(1), nil), signer, testBankKey) | ||||||
|  | 			if err != nil { | ||||||
|  | 				b.Error(err) | ||||||
|  | 			} | ||||||
|  | 			block.AddTx(tx) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	shared, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, numBlocks, blockGenerator) | ||||||
|  | 	b.StopTimer() | ||||||
|  | 	b.ResetTimer() | ||||||
|  | 	for i := 0; i < b.N; i++ { | ||||||
|  | 		// Import the shared chain and the original canonical one
 | ||||||
|  | 		diskdb, _ := ethdb.NewMemDatabase() | ||||||
|  | 		gspec.MustCommit(diskdb) | ||||||
|  | 
 | ||||||
|  | 		chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}) | ||||||
|  | 		if err != nil { | ||||||
|  | 			b.Fatalf("failed to create tester chain: %v", err) | ||||||
|  | 		} | ||||||
|  | 		b.StartTimer() | ||||||
|  | 		if _, err := chain.InsertChain(shared); err != nil { | ||||||
|  | 			b.Fatalf("failed to insert shared chain: %v", err) | ||||||
|  | 		} | ||||||
|  | 		b.StopTimer() | ||||||
|  | 		if got := chain.CurrentBlock().Transactions().Len(); got != numTxs*numBlocks { | ||||||
|  | 			b.Fatalf("Transactions were not included, expected %d, got %d", (numTxs * numBlocks), got) | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | func BenchmarkBlockChain_1x1000ValueTransferToNonexisting(b *testing.B) { | ||||||
|  | 	var ( | ||||||
|  | 		numTxs    = 1000 | ||||||
|  | 		numBlocks = 1 | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	recipientFn := func(nonce uint64) common.Address { | ||||||
|  | 		return common.BigToAddress(big.NewInt(0).SetUint64(1337 + nonce)) | ||||||
|  | 	} | ||||||
|  | 	dataFn := func(nonce uint64) []byte { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) | ||||||
|  | } | ||||||
|  | func BenchmarkBlockChain_1x1000ValueTransferToExisting(b *testing.B) { | ||||||
|  | 	var ( | ||||||
|  | 		numTxs    = 1000 | ||||||
|  | 		numBlocks = 1 | ||||||
|  | 	) | ||||||
|  | 	b.StopTimer() | ||||||
|  | 	b.ResetTimer() | ||||||
|  | 
 | ||||||
|  | 	recipientFn := func(nonce uint64) common.Address { | ||||||
|  | 		return common.BigToAddress(big.NewInt(0).SetUint64(1337)) | ||||||
|  | 	} | ||||||
|  | 	dataFn := func(nonce uint64) []byte { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) | ||||||
|  | } | ||||||
|  | func BenchmarkBlockChain_1x1000Executions(b *testing.B) { | ||||||
|  | 	var ( | ||||||
|  | 		numTxs    = 1000 | ||||||
|  | 		numBlocks = 1 | ||||||
|  | 	) | ||||||
|  | 	b.StopTimer() | ||||||
|  | 	b.ResetTimer() | ||||||
|  | 
 | ||||||
|  | 	recipientFn := func(nonce uint64) common.Address { | ||||||
|  | 		return common.BigToAddress(big.NewInt(0).SetUint64(0xc0de)) | ||||||
|  | 	} | ||||||
|  | 	dataFn := func(nonce uint64) []byte { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user