在量化领域,对性能要求比较高,特别是高频交易,那是纳秒必争。在RUST中,测试一个函数,或一个操作耗时即性能分析,应是如何做呢?

一、计时器:systime
是否可以用std::time::systime 来计算花时情况?我们来试一试:


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);}

你会发现:
为什么创建一个结构体要花3500纳秒,这也太不可思议了吧。其实,真实的情况并不是这样的,是因为计时器的测试误差导致。

二、计时器: Instant

use std::time::Instant;fn main()
{let start = Instant::now();let a = Box::new(5);println!("cost seconds[秒] : {}", start.elapsed().as_secs());// 不需要println!("cost miliseconds[毫秒] : {}", start.elapsed().as_millis()); //不需要println!("cost microseconds[微秒] : {}", start.elapsed().as_micros());//根据需要选择println!("cost nanseconds[纳秒] : {}", start.elapsed().as_nanos());}

output:

    Finished release [optimized] target(s) in 0.57sRunning `target/release/my_bench`
cost seconds[秒] : 0
cost miliseconds[毫秒] : 0
cost microseconds[微秒] : 32
cost nanseconds[纳秒] : 39500

注意,以上只用一个就可以。否则会把打印时间包括在内,这里只是说明使用的时间精确维度。

如,

    Finished release [optimized] target(s) in 0.59sRunning `target/release/my_bench`
cost nanseconds[纳秒] : 1400

三、专业三方库
如果要进行专业的性能测试,可以借助于专业三方性能测试库。
RUST中,专业三方库还是有不少如bencher ,criterion等。强烈推荐用criterion.rs.

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

具体大家可以到github上看看。

四、实例

1、创建测试目录
在工程中,建一个专门的测试用的目录:我这儿是在
my_bench目录下,专门创建了benches目录

2、设置toml文件

对于my_bench工程下toml文件
toml文件中,增加:

[dev-dependencies]
criterion = "0.3"[[bench]]
name = "my_benchmark"
harness = false

其中,name ="my_benchmark"是有所指的,不是随便写的。这里是指,我在my_bench工程下,有一个my_benchmark.rs文件,里面有我写的性能测试代码。别的地方就不要去找了。

3、准备性能测试代码

因为toml文件中,有name =“my_benchmark” ,那么,性能测试代码就是my_benchmark.rs. 创建这个文件。
写入相应的性能测试代码:

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、运行cargo bench

在工程my_bench下,运行cargo bench,即可以进行性能测试代码的运行了。

Finished bench [optimized] target(s) in 2.80sRunning target\release\deps\my_bench-95230ab505784caf.exerunning 0 teststest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered outRunning 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 mildbox<stock>              time:   [168.68 ns 189.43 ns 212.00 ns]
Found 3 outliers among 100 measurements (3.00%)

从上面,我们可以得到详细的测试信息,包括运行的时间分布情况。

专业性能测试工具表明,创建一个Stock对象,大约平均需要73ns,而不是计时器显示的3500ns;
但是,创建一个Stock 的Box对象需要的时间是双倍。

五、传入参数的情况

当有参数需要传入时,可以这样:

use criterion::{black_box, criterion_group, criterion_main, Criterion};
use criterion::BenchmarkId;
fn get_buf2(s:&String)-> *const [c_char;10]{    //let s = String::from("hello world!");let v = s.as_bytes().as_ptr() as *const [c_char;10];v
}
fn criterion_benchmark_buf2(c: &mut Criterion) {let s = &String::from("hello world!");c.bench_with_input(BenchmarkId::new("hello world!", &s), &s,  |b, &s| {b.iter(|| get_buf2(s));});
}
criterion_group!(benches, criterion_benchmark_buf2);
criterion_main!(benches);

Rust : 性能测试criterion库相关推荐

  1. 从零开始的 Rust 语言 blas 库之预备篇(1)—— blas 基础介绍

    从零开始的 Rust 语言 blas 库之预备篇(1)-- blas 基础介绍 下一篇:从零开始的 Rust 语言 blas 库之预备篇(2)-- blas 矩阵格式详解 文章部分参考:https:/ ...

  2. Rust 每天一库系列 Ftp 库

    基础的还不是很牢固,还是写点代码比较好 FTP 作为基础还是不错的 1. First build ftp server on windows 1.1 使用 python3 ftpd 服务库 pip i ...

  3. python硬件_「大神器!」硬件的AI性能测试Python库发布

    目前人工智能技术发展速度很快,也很吸引眼球.但是对于各种多如牛毛的方法,目前并米有一个可靠的精准的基准来衡量各项硬件在不同算法训练和推理的性能. 现在,不用愁了.国外的一个哥们, Andrey Ign ...

  4. rust: 引用第三方库(Cargo.toml、Cargo.lock文件)

    接下来我要使用随机数生成函数,这个函数在 rand 库中.我们在 Cargo.toml 文件中的依赖项中,加入对 rand 的依赖说明. [package] name = "game&quo ...

  5. 【Rust】日志库log

    日志库一般会实现日志分级.日志过滤.日志输出格式化.日志回滚等功能.本文介绍了Rust log库的使用,并给出了几个常用日志库的使用示例. 一.Rust log 1.log库 这个log库给出了日志库 ...

  6. 高密度部署,基于动态库的尝试,rust动态调库

    目录 前言 faas特点 方案 思考 实践 制作动态库 调用动态库 尾语 前言  最近在搞faas平台,也试了各大云厂商的产品,效果都不是很理想.和我心目中的faas想去甚远.  和小伙伴们吹完牛逼, ...

  7. 使用rust的image库进行图片压缩

    image库中有许多对图片处理方法. 可以参考一份中文翻译(https://www.jianshu.com/p/342c6a4bc7a1). 也可以去仓库地址中查看(https://github.co ...

  8. webstorm代码行数统计_【Rust每周一库】Tokei 统计代码行数等信息的实用工具

    Tokei是一个按语言统计代码行数等统计信息的工具.其实这些信息还是非常有用的,首先程序猿可以用它来估计别人的实力或者观察自己实力成长的速度(神马,行数论英雄么?).其次,管理人员可以用它来估计工程的 ...

  9. golang byte转string_Golang和Rust语言常见功能/库

    时下最流行.最具发展前途的的两门语言是Golang和Rust.Golang语言简洁.高效.并发.并且有个强大的囊括了常见功能标准库.与之相对比,Rust语言则主要是安全.高性能.虽然Rust没有gol ...

  10. 这一天,我用 Rust 重写了已有 19 年历史的 C++ 库!

    从版本 56 开始,Firefox 浏览器支持一种新的字符编码转换库,叫做 encoding_rs.它是用 Rust 编写的,代替了从 1999 年就开始使用的 C++ 编写的字符编码库 uconv. ...

最新文章

  1. 安卓高手之路之 图形系统之 图形框架(1)
  2. 更新CentOS Mysql到官方较新版本[以6.5为例]
  3. php+mysql封装增删查改
  4. python无法导入模块_python怎么导入模块
  5. php中函数封装怎么弄,php封装函数步骤
  6. kfaka storm写入mysql_基于Storm+Kafka+Zookeeper锁+Memcached+mysql架构全方位系统Storm项目案例实战...
  7. hx711压力传感器工作原理_压电式压力传感器原理,你了解吗?
  8. matlab cftool 最小二乘,【转】最小二乘法与matlab拟合工具箱cftool
  9. error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“: h
  10. 用云真机测试本地应用程序
  11. 《人生哲理》一.我们必须活在当下!
  12. 裸金属服务器开通原理
  13. 你一个包含n个整数nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?
  14. 挑战微软 + GitHub!谷歌联手 Replit,升级 AI 编程“神器”:曾拒绝微软 10 亿美元的收购...
  15. 将Windows驱动程序从一台计算机复制到另一台计算机
  16. 在DW中实现鼠标移入字体变色
  17. c语言之圆的周长、面积、圆球的体积--改良版
  18. 电商b2b_企业对企业– B2B | 第2部分
  19. Android修改圆形progressBar颜色
  20. 2014最新的淘宝客网站SEO操作方法

热门文章

  1. 把合同中红色印章实现打印不显示方法
  2. SCOM 2007 R2监控系统安装部署(一)SCOM简介及安装SQL Server 2008 R2 数据库
  3. CentOS 7上升级openssh7.5
  4. Java实现读取文件夹下(包括子目录)所有文件的文件名
  5. python GUI初步
  6. 安全策略篇 ASPF:隐形通道
  7. 使用Quartz.Net定时删除Log
  8. Python数据预处理之清及
  9. AARRR:数据运营模型
  10. 构建手机apk的过程