2016-02-24 19:17:29 +01:00
|
|
|
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
//! benchmarking for rlp
|
|
|
|
//! should be started with:
|
|
|
|
//! ```bash
|
|
|
|
//! multirust run nightly cargo bench
|
|
|
|
//! ```
|
|
|
|
|
|
|
|
#![feature(test)]
|
2016-02-25 00:00:34 +01:00
|
|
|
#![feature(asm)]
|
2016-02-24 19:17:29 +01:00
|
|
|
|
|
|
|
extern crate test;
|
|
|
|
extern crate ethcore_util;
|
2016-02-25 20:48:34 +01:00
|
|
|
extern crate rand;
|
2016-02-24 19:17:29 +01:00
|
|
|
|
|
|
|
use test::{Bencher, black_box};
|
2016-03-05 12:25:46 +01:00
|
|
|
use ethcore_util::numbers::*;
|
2016-02-24 19:17:29 +01:00
|
|
|
|
|
|
|
#[bench]
|
2016-02-24 21:08:21 +01:00
|
|
|
fn u256_add(b: &mut Bencher) {
|
2016-02-24 19:17:29 +01:00
|
|
|
b.iter(|| {
|
|
|
|
let n = black_box(10000);
|
2016-02-25 20:48:34 +01:00
|
|
|
(0..n).fold(U256([rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>()]), |old, new| { old.overflowing_add(U256::from(new)).0 })
|
2016-02-25 01:09:33 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-02-24 21:08:21 +01:00
|
|
|
#[bench]
|
|
|
|
fn u256_sub(b: &mut Bencher) {
|
|
|
|
b.iter(|| {
|
|
|
|
let n = black_box(10000);
|
2016-02-25 20:48:34 +01:00
|
|
|
(0..n).fold(U256([rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>()]), |old, new| { old.overflowing_sub(U256::from(new)).0 })
|
2016-02-25 00:00:34 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-02-26 21:37:13 +01:00
|
|
|
#[bench]
|
|
|
|
fn u512_sub(b: &mut Bencher) {
|
|
|
|
b.iter(|| {
|
|
|
|
let n = black_box(10000);
|
2016-03-09 00:05:47 +01:00
|
|
|
(0..n).fold(
|
|
|
|
U512([
|
|
|
|
rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>(),
|
|
|
|
rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>()
|
|
|
|
]),
|
|
|
|
|old, new| {
|
|
|
|
let p = new % 2;
|
|
|
|
old.overflowing_sub(U512([p, p, p, p, p, p, p, new])).0
|
|
|
|
}
|
|
|
|
)
|
2016-02-26 21:37:13 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn u512_add(b: &mut Bencher) {
|
|
|
|
b.iter(|| {
|
|
|
|
let n = black_box(10000);
|
|
|
|
(0..n).fold(U512([0, 0, 0, 0, 0, 0, 0, 0]),
|
|
|
|
|old, new| { old.overflowing_add(U512([new, new, new, new, new, new, new, new])).0 })
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-02-25 00:00:34 +01:00
|
|
|
#[bench]
|
|
|
|
fn u256_mul(b: &mut Bencher) {
|
|
|
|
b.iter(|| {
|
|
|
|
let n = black_box(10000);
|
2016-02-25 20:48:34 +01:00
|
|
|
(0..n).fold(U256([rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>()]), |old, new| { old.overflowing_mul(U256::from(new)).0 })
|
2016-02-25 00:00:34 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-29 16:57:46 +01:00
|
|
|
#[bench]
|
|
|
|
fn u256_full_mul(b: &mut Bencher) {
|
|
|
|
b.iter(|| {
|
|
|
|
let n = black_box(10000);
|
|
|
|
(0..n).fold(U256([rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>()]),
|
2016-03-07 16:17:14 +01:00
|
|
|
|old, _new| {
|
2016-02-29 16:57:46 +01:00
|
|
|
let U512(ref u512words) = old.full_mul(U256([rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>(), rand::random::<u64>()]));
|
|
|
|
U256([u512words[0], u512words[2], u512words[2], u512words[3]])
|
|
|
|
})
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-02-25 00:00:34 +01:00
|
|
|
#[bench]
|
|
|
|
fn u128_mul(b: &mut Bencher) {
|
|
|
|
b.iter(|| {
|
|
|
|
let n = black_box(10000);
|
|
|
|
(0..n).fold(U128([12345u64, 0u64]), |old, new| { old.overflowing_mul(U128::from(new)).0 })
|
2016-02-24 21:08:21 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|