Merge branch 'master' of github.com:ethcore/parity-bitcoin into p2p_logging
This commit is contained in:
commit
b6584cd2ce
|
@ -72,6 +72,7 @@ name = "chain"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitcrypto 0.1.0",
|
||||
"heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"primitives 0.1.0",
|
||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serialization 0.1.0",
|
||||
|
@ -179,6 +180,14 @@ dependencies = [
|
|||
"rayon 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heapsize"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kernel32-sys"
|
||||
version = "0.2.2"
|
||||
|
@ -245,6 +254,7 @@ name = "miner"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"chain 0.1.0",
|
||||
"heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"primitives 0.1.0",
|
||||
"serialization 0.1.0",
|
||||
]
|
||||
|
@ -376,6 +386,7 @@ dependencies = [
|
|||
name = "primitives"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -617,6 +628,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum futures 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0bd34f72c0fffc9d2f6c570fd392bf99b9c5cd1481d79809e1cc2320befc0af0"
|
||||
"checksum futures-cpupool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bb982bb25cd8fa5da6a8eb3a460354c984ff1113da82bcb4f0b0862b5795db82"
|
||||
"checksum gcc 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "91ecd03771effb0c968fd6950b37e89476a578aaf1c70297d8e92b6516ec3312"
|
||||
"checksum heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8c80e194758495a9109566134dc06e42ea0423987d6ceca016edaa90381b3549"
|
||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||
"checksum lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "49247ec2a285bb3dcb23cbd9c35193c025e7251bfce77c1d5da97e6362dffe7f"
|
||||
"checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"
|
||||
|
|
|
@ -5,6 +5,7 @@ authors = ["debris <marek.kotewicz@gmail.com>"]
|
|||
|
||||
[dependencies]
|
||||
rustc-serialize = "0.3"
|
||||
heapsize = "0.3"
|
||||
bitcrypto = { path = "../crypto" }
|
||||
primitives = { path = "../primitives" }
|
||||
serialization = { path = "../serialization" }
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
extern crate rustc_serialize;
|
||||
extern crate heapsize;
|
||||
extern crate primitives;
|
||||
extern crate bitcrypto as crypto;
|
||||
extern crate serialization as ser;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
//! Bitcoin trainsaction.
|
||||
//! https://en.bitcoin.it/wiki/Protocol_documentation#tx
|
||||
|
||||
use heapsize::HeapSizeOf;
|
||||
use hex::FromHex;
|
||||
use bytes::Bytes;
|
||||
use ser::{
|
||||
|
@ -105,6 +106,12 @@ impl Deserializable for TransactionInput {
|
|||
}
|
||||
}
|
||||
|
||||
impl HeapSizeOf for TransactionInput {
|
||||
fn heap_size_of_children(&self) -> usize {
|
||||
self.script_sig.heap_size_of_children()
|
||||
}
|
||||
}
|
||||
|
||||
impl TransactionInput {
|
||||
pub fn previous_output(&self) -> &OutPoint {
|
||||
&self.previous_output
|
||||
|
@ -159,6 +166,12 @@ impl Default for TransactionOutput {
|
|||
}
|
||||
}
|
||||
|
||||
impl HeapSizeOf for TransactionOutput {
|
||||
fn heap_size_of_children(&self) -> usize {
|
||||
self.script_pubkey.heap_size_of_children()
|
||||
}
|
||||
}
|
||||
|
||||
impl TransactionOutput {
|
||||
pub fn value(&self) -> u64 {
|
||||
self.value
|
||||
|
@ -214,6 +227,12 @@ impl From<&'static str> for Transaction {
|
|||
}
|
||||
}
|
||||
|
||||
impl HeapSizeOf for Transaction {
|
||||
fn heap_size_of_children(&self) -> usize {
|
||||
self.inputs.heap_size_of_children() + self.outputs.heap_size_of_children()
|
||||
}
|
||||
}
|
||||
|
||||
impl Transaction {
|
||||
pub fn hash(&self) -> H256 {
|
||||
dhash256(&serialize(self))
|
||||
|
|
|
@ -4,6 +4,7 @@ version = "0.1.0"
|
|||
authors = ["Ethcore <admin@ethcore.io>"]
|
||||
|
||||
[dependencies]
|
||||
heapsize = "0.3"
|
||||
chain = { path = "../chain" }
|
||||
primitives = { path = "../primitives" }
|
||||
serialization = { path = "../serialization" }
|
||||
|
|
|
@ -0,0 +1,119 @@
|
|||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
extern crate miner;
|
||||
extern crate chain;
|
||||
extern crate primitives;
|
||||
extern crate serialization as ser;
|
||||
|
||||
#[cfg(test)]
|
||||
mod benchmarks {
|
||||
use std::collections::VecDeque;
|
||||
use super::chain::{Transaction, TransactionInput, OutPoint};
|
||||
use super::primitives::bytes::Bytes;
|
||||
use super::test::Bencher;
|
||||
use super::miner::{MemoryPool, MemoryPoolOrderingStrategy};
|
||||
|
||||
fn prepare_independent_transactions(n: usize) -> VecDeque<Transaction> {
|
||||
(0..n).map(|nonce| Transaction {
|
||||
version: nonce as i32,
|
||||
inputs: vec![],
|
||||
outputs: vec![],
|
||||
lock_time: 0,
|
||||
}).collect()
|
||||
}
|
||||
|
||||
fn prepare_dependent_transactions(n: usize) -> VecDeque<Transaction> {
|
||||
let previous_transaction: Transaction = "00000000000164000000000000000000000000".into();
|
||||
let mut previous_transaction_hash = previous_transaction.hash();
|
||||
let mut result = VecDeque::new();
|
||||
result.push_back(previous_transaction);
|
||||
result.extend((0..n).map(|_nonce| {
|
||||
let transaction = Transaction {
|
||||
version: 0,
|
||||
inputs: vec![
|
||||
TransactionInput {
|
||||
previous_output: OutPoint {
|
||||
hash: previous_transaction_hash.clone(),
|
||||
index: 0,
|
||||
},
|
||||
script_sig: Bytes::new_with_len(0),
|
||||
sequence: 0,
|
||||
},
|
||||
],
|
||||
outputs: vec![],
|
||||
lock_time: 0,
|
||||
};
|
||||
previous_transaction_hash = transaction.hash();
|
||||
transaction
|
||||
}));
|
||||
result
|
||||
}
|
||||
|
||||
#[bench]
|
||||
// test benchmarks::memory_pool_insert_independent_transactions ... bench: 1,455 ns/iter (+/- 12)
|
||||
fn memory_pool_insert_independent_transactions(b: &mut Bencher) {
|
||||
let iterations = 100;
|
||||
let mut pool = MemoryPool::new();
|
||||
let mut transactions = prepare_independent_transactions(iterations);
|
||||
b.bench_n(iterations as u64, |b| b.iter(|| {
|
||||
pool.insert_verified(transactions.pop_front().unwrap())
|
||||
}));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
// test benchmarks::memory_pool_insert_descendant_transaction ... bench: 7,834 ns/iter (+/- 288)
|
||||
fn memory_pool_insert_descendant_transaction(b: &mut Bencher) {
|
||||
let iterations = 100usize;
|
||||
let mut pool = MemoryPool::new();
|
||||
let mut transactions = prepare_dependent_transactions(iterations);
|
||||
pool.insert_verified(transactions.pop_front().unwrap());
|
||||
|
||||
b.bench_n(iterations as u64, |b| b.iter(|| {
|
||||
pool.insert_verified(transactions.pop_front().unwrap())
|
||||
}));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
// test benchmarks::memory_pool_insert_ancestor_transaction ... bench: 376,067 ns/iter (+/- 11,249)
|
||||
// very slow due to weird usage scenario:
|
||||
// (1) transactions inserted to memorypool are verified
|
||||
// (2) verified => ancestors already verified
|
||||
// (3) ancestors verified => they are already in memorypool (not this case) or in database (why inserting to memorypool then)
|
||||
fn memory_pool_insert_ancestor_transaction(b: &mut Bencher) {
|
||||
let iterations = 100usize;
|
||||
let mut pool = MemoryPool::new();
|
||||
let mut transactions = prepare_dependent_transactions(iterations);
|
||||
pool.insert_verified(transactions.pop_front().unwrap());
|
||||
|
||||
b.bench_n(iterations as u64, |b| b.iter(|| {
|
||||
pool.insert_verified(transactions.pop_back().unwrap())
|
||||
}));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
// test benchmarks::memory_pool_remove_independent_in_order ... bench: 460 ns/iter (+/- 47)
|
||||
fn memory_pool_remove_independent_in_order(b: &mut Bencher) {
|
||||
let iterations = 100;
|
||||
let mut pool = MemoryPool::new();
|
||||
for transaction in prepare_independent_transactions(iterations) {
|
||||
pool.insert_verified(transaction)
|
||||
}
|
||||
b.bench_n(iterations as u64, |b| b.iter(|| {
|
||||
pool.remove_with_strategy(MemoryPoolOrderingStrategy::ByTimestamp)
|
||||
}));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
// test benchmarks::memory_pool_remove_dependent_in_order ... bench: 754 ns/iter (+/- 111)
|
||||
fn memory_pool_remove_dependent_in_order(b: &mut Bencher) {
|
||||
let iterations = 100;
|
||||
let mut pool = MemoryPool::new();
|
||||
for transaction in prepare_dependent_transactions(iterations) {
|
||||
pool.insert_verified(transaction)
|
||||
}
|
||||
b.bench_n(iterations as u64, |b| b.iter(|| {
|
||||
pool.remove_with_strategy(MemoryPoolOrderingStrategy::ByTimestamp)
|
||||
}));
|
||||
}
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
extern crate chain;
|
||||
extern crate heapsize;
|
||||
extern crate primitives;
|
||||
extern crate serialization as ser;
|
||||
|
||||
|
@ -6,4 +7,4 @@ pub mod memory_pool;
|
|||
|
||||
pub use primitives::{hash};
|
||||
|
||||
pub use self::memory_pool::{MemoryPool, Information as MemoryPoolInformation};
|
||||
pub use self::memory_pool::{MemoryPool, Information as MemoryPoolInformation, OrderingStrategy as MemoryPoolOrderingStrategy};
|
File diff suppressed because it is too large
Load Diff
|
@ -4,4 +4,5 @@ version = "0.1.0"
|
|||
authors = ["debris <marek.kotewicz@gmail.com>"]
|
||||
|
||||
[dependencies]
|
||||
heapsize = "0.3"
|
||||
rustc-serialize = "0.3"
|
||||
|
|
|
@ -137,6 +137,8 @@ impl_hash!(H264, 33);
|
|||
impl_hash!(H512, 64);
|
||||
impl_hash!(H520, 65);
|
||||
|
||||
known_heap_size!(0, H32, H48, H96, H160, H256, H264, H512, H520);
|
||||
|
||||
impl H256 {
|
||||
#[inline]
|
||||
pub fn from_reversed_str(s: &'static str) -> Self {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
extern crate rustc_serialize;
|
||||
#[macro_use] extern crate heapsize;
|
||||
|
||||
pub mod bytes;
|
||||
pub mod hash;
|
||||
|
|
Loading…
Reference in New Issue