Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
CSDN 技术社区
skill_tree_rust
提交
612dca9a
S
skill_tree_rust
项目概览
CSDN 技术社区
/
skill_tree_rust
通知
32
Star
7
Fork
3
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
skill_tree_rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
612dca9a
编写于
9月 28, 2022
作者:
J
jackymao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add benchmark_test
上级
6a6bccae
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
199 addition
and
1 deletion
+199
-1
data/1.rust初阶/4.测试/4.性能测试/benchmark_tests.json
data/1.rust初阶/4.测试/4.性能测试/benchmark_tests.json
+8
-0
data/1.rust初阶/4.测试/4.性能测试/benchmark_tests.md
data/1.rust初阶/4.测试/4.性能测试/benchmark_tests.md
+187
-0
data/1.rust初阶/4.测试/4.性能测试/config.json
data/1.rust初阶/4.测试/4.性能测试/config.json
+4
-1
未找到文件。
data/1.rust初阶/4.测试/4.性能测试/benchmark_tests.json
0 → 100644
浏览文件 @
612dca9a
{
"type"
:
"code_options"
,
"author"
:
"jackymao_com"
,
"source"
:
"benchmark_tests.md"
,
"notebook_enable"
:
false
,
"exercise_id"
:
""
}
\ No newline at end of file
data/1.rust初阶/4.测试/4.性能测试/benchmark_tests.md
0 → 100644
浏览文件 @
612dca9a
# 基准测试
基准测试通常是在开发的最后阶段进行的(虽然也有例外),用途是知道代码运行所花的时间,或提供代码中存在的性能缺陷的测试信息。
对所开发的程序执行基准测试有多种方法。
第一种简单的方法是使用 std::time::Instant 来测量程序的执行时间,虽然这并不能提供精确和完善的数据。
```
rust
fn
main
()
{
use
std
::
time
::
Instant
;
let
now
=
Instant
::
now
();
// Code block to measure.
{
println!
(
"test"
);
}
let
elapsed
=
now
.elapsed
();
println!
(
"Elapsed: {:.2?}"
,
elapsed
);
}
```
第二种是使用 Rust 库,比较常见的库有 criterion 和 flamegraph
要做好一个基准测试及代码优化并不容易,需要考虑的因素很多:
-
不要过早的对代码进行优化和测试
-
在代码优化和安全性之间要平衡取舍
-
如果需要,对编译速度和编译文件大小之间要平衡取舍
-
使用优化编译命令对代码做基准测试,即编译的时候使用 rustc -O3 选项或 cargo build --release. 在使用 cargo bench 命令时它会自动打开优化
-
多次测试并进行统计。单次测试往往不够准确,测试用机的负载(操作系统,CPU,硬盘,缓存等)不同测试结果都会不同。
-
确保你的测试代码不会被后端优化掉,如 LLVM 会在后端进行各种级别的各种优化,或按照测试框架的库的说明来操作。
-
更多其他注意事项
对于 Fibonacci 序列算法,在以下的 Benchmark 中调用了四种算法
```
rust
use
criterion
::{
criterion_group
,
criterion_main
,
BenchmarkId
,
Criterion
};
use
rust_fibonacci
::
*
;
use
std
::
collections
::
HashMap
;
fn
bench_fibs
(
c
:
&
mut
Criterion
)
{
let
mut
group
=
c
.benchmark_group
(
"Fibonacci"
);
for
i
in
[
20
,
21
]
.iter
()
{
group
.bench_with_input
(
BenchmarkId
::
new
(
"Standard"
,
i
),
i
,
|
b
,
i
|
{
b
.iter
(||
fib_standard
(
*
i
))
});
group
.bench_with_input
(
BenchmarkId
::
new
(
"Recursion"
,
i
),
i
,
|
b
,
i
|
{
b
.iter
(||
fib_recursive
(
*
i
))
});
group
.bench_with_input
(
BenchmarkId
::
new
(
"Memoization"
,
i
),
i
,
|
b
,
i
|
{
b
.iter
(||
{
let
mut
memo
=
HashMap
::
new
();
fib_memoization
(
*
i
,
&
mut
memo
);
})
});
group
.bench_with_input
(
BenchmarkId
::
new
(
"Iterator"
,
i
),
i
,
|
b
,
i
|
{
b
.iter
(||
{
FibIterator
::
default
()
.nth
(
*
i
)
.unwrap
();
})
});
}
group
.finish
();
}
criterion_group!
(
benches
,
bench_fibs
);
criterion_main!
(
benches
);
```
问答:
在如下的四种算法代码中,预期最慢的是:
## 答案
A
```
rust
pub
fn
fib_recursive
(
n
:
usize
)
->
usize
{
match
n
{
0
|
1
=>
1
,
_
=>
fib_recursive
(
n
-
2
)
+
fib_recursive
(
n
-
1
),
}
}
```
## 选项
###
B
```
rust
pub
fn
fib_standard
(
n
:
usize
)
->
usize
{
let
mut
a
=
1
;
let
mut
b
=
1
;
for
_
in
1
..
n
{
let
old
=
a
;
a
=
b
;
b
+=
old
;
}
b
}
```
###
C
```
rust
use
std
::
collections
::
HashMap
;
pub
fn
fib_memoization
(
n
:
usize
,
memo
:
&
mut
HashMap
<
usize
,
usize
>
)
->
usize
{
if
let
Some
(
v
)
=
memo
.get
(
&
n
)
{
return
*
v
;
}
let
v
=
match
n
{
0
|
1
=>
1
,
_
=>
fib_memoization
(
n
-
2
,
memo
)
+
fib_memoization
(
n
-
1
,
memo
),
};
memo
.insert
(
n
,
v
);
v
}
```
###
D
```
rust
pub
struct
FibIterator
{
a
:
usize
,
b
:
usize
}
impl
Default
for
FibIterator
{
fn
default
()
->
Self
{
FibIterator
{
a
:
1
,
b
:
1
}
}
}
impl
Iterator
for
FibIterator
{
type
Item
=
usize
;
fn
next
(
&
mut
self
)
->
Option
<
Self
::
Item
>
{
let
curr
=
self
.a
;
self
.a
=
self
.b
;
self
.b
=
curr
+
self
.a
;
Some
(
curr
)
}
}
```
<!--
ref:
https://www.umcconnell.net/posts/2021-03-13-fibonacci-rust/
https://stackoverflow.com/questions/13322479/benchmarking-programs-in-rust
https://zhuanlan.zhihu.com/p/451184900
-->
\ No newline at end of file
data/1.rust初阶/4.测试/4.性能测试/config.json
浏览文件 @
612dca9a
...
@@ -2,7 +2,9 @@
...
@@ -2,7 +2,9 @@
"node_id"
:
"rust-f86c3d949b624756923c6931daf8ced0"
,
"node_id"
:
"rust-f86c3d949b624756923c6931daf8ced0"
,
"keywords"
:
[],
"keywords"
:
[],
"children"
:
[],
"children"
:
[],
"export"
:
[],
"export"
:
[
"benchmark_tests.json"
],
"keywords_must"
:
[],
"keywords_must"
:
[],
"keywords_forbid"
:
[]
"keywords_forbid"
:
[]
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录