当前位置:网站首页>Rust: performance test criteria Library

Rust: performance test criteria Library

2020-11-08 11:21:00 osc_ju8o7gji

In the field of quantification , High performance requirements , Especially high frequency trading , That's nanosecond . stay RUST in , Test a function , Or a time-consuming operation, that is, performance analysis , How to do it ?

One 、 timer
Whether it can be used std::time::systime To calculate the time spent ? Let's have a try :


use std::time::SystemTime;
pub struct Stock{
   
   
    pub price:f64,
    pub volume:i32,
    pub code:String,
    pub amount:f64,
}
impl Stock{
   
   
    fn default()->Self{
   
   
        let p =10000.0_f64;
        let v =1_i32;
        Stock{
   
   
            price:p,
            volume:v,
            code:String::from("SH600036"),
            amount: p*v as f64,
        }
    }
}
fn main() {
   
   
    let now = SystemTime::now();
    let stock = Stock::default();
    let elapsed = now.elapsed().unwrap().as_nanos();
    println!("cost time :{:?} ",elapsed);

}

You'll find that :
 Insert picture description here Why does it take to create a structure 3500 nanosecond , It's amazing . Actually , The real situation is not like this , It's because of the test error of the timer .

therefore , If you want to do a professional performance test , Or with the help of professional tripartite performance test library .

Two 、 Professional tripartite Library

RUST in , There are still many professional tripartite libraries , To push the library criterion.rs.

https://github.com/bheisler/criterion.rs

You can take a look at .

3、 ... and 、 example

1、 Create a test directory
In the engineering , Create a special test directory : I'm here in
my_bench Under the table of contents , Specifically created benches Catalog

 Insert picture description here 2、toml file
about my_bench Under the project toml file
 Insert picture description here toml In file , increase :

[dev-dependencies]
criterion = "0.3"

[[bench]]
name = "my_benchmark"
harness = false

among ,name ="my_benchmark" It means something , It's not random . Here means , I am here my_bench Under the project , There is one my_benchmark.rs file , It has the performance test code I wrote . Don't go anywhere else .

3、 Prepare performance test code

because toml In file , Yes name =“my_benchmark” , that , The performance test code is my_benchmark.rs. Create this file .
Write the corresponding performance test code :

use criterion::{
   
   black_box, criterion_group, criterion_main, Criterion};

pub struct Stock{
   
   
    pub price:f64,
    pub volume:i32,
    pub code:String,
    pub amount:f64,
}
impl Stock{
   
   
    fn default()->Self{
   
   
        let p =10000.0_f64;
        let v =1_i32;
        Stock{
   
   
            price:p,
            volume:v,
            code:String::from("SH600036"),
            amount: p*v as f64,
        }
    }
}

pub fn set_heap()->Stock{
   
   
    Stock::default()
}

pub fn box_stock() ->Box<Stock>{
   
   
    Box::new(Stock::default())
}

fn criterion_benchmark_heap(c: &mut Criterion) {
   
   
    c.bench_function("stock ", |b| b.iter(|| set_heap()));
}

fn criterion_benchmark_box(c: &mut Criterion) {
   
   
    c.bench_function("box<stock> ", |b| b.iter(|| box_stock()));
}

criterion_group!(benches, criterion_benchmark_heap,criterion_benchmark_box);
criterion_main!(benches);

4、 function

In all the engineering my_bench Next , function cargo bench, That is, you can run the performance test code .



    Finished bench [optimized] target(s) in 2.80s
     Running target\release\deps\my_bench-95230ab505784caf.exe

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target\release\deps\my_benchmark-a468db13a6ba0ea3.exe
Gnuplot not found, using plotters backend
stock                   time:   [75.387 ns 83.206 ns 91.985 ns]
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild

box<stock>              time:   [168.68 ns 189.43 ns 212.00 ns]
Found 3 outliers among 100 measurements (3.00%)

From above , We can get detailed test information , Including the time distribution of the operation .

Professional performance testing tools show that , Create a Stock object , It takes about the average 73ns, Not the timer 3500ns;
however , Create a Stock Of Box The object takes twice as long .

版权声明
本文为[osc_ju8o7gji]所创,转载请带上原文链接,感谢