openethereum/util/benches/bigint.rs

105 lines
3.0 KiB
Rust
Raw Normal View History

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;
2016-08-15 22:02:53 +02:00
extern crate bigint;
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-08-15 22:02:53 +02:00
use bigint::uint::{U256, U512, Uint, U128};
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);
(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
});
}