feat: add bench and update tracing version
This commit is contained in:
parent
f10b8971e1
commit
6c9fdc5d26
|
|
@ -2,27 +2,23 @@
|
|||
|
||||
# 使用方式
|
||||
|
||||
使用`cargo`新建一个项目,如`cargo new ip-test`
|
||||
|
||||
配置`Cargo.toml`如下
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
search = { git = "https://github.com/lionsoul2014/ip2region.git", branch = "master" }
|
||||
# 如果要在异步环境下使用,需要加上如下依赖
|
||||
tokio = { version = "1", features = ["full"]}
|
||||
```
|
||||
|
||||
程序启动的时候是没加载文件,这个程序占用内存`1M`左右
|
||||
`ip2region.xdb`文件会直接加载到内存,程序占用内存`13M`左右
|
||||
|
||||
一旦开始执行查询,`ip2region.xdb`文件会直接加载到内存,程序占用内存`12M`左右
|
||||
|
||||
预先加载整个` ip2region.xdb` 到内存,完全基于内存查询,该方式线程安全,采用`once_cell::sync::OnceCell`,只会加载一次数据,多线程安全,可以自由使用`tokio`异步运行时或者标准库的多线程`std::thread`
|
||||
预先加载整个` ip2region.xdb` 到内存,完全基于内存查询,只会加载一次数据,多线程安全,可以自由使用`tokio`异步运行时或者标准库的多线程`std::thread`
|
||||
|
||||
### 缓存整个 `xdb` 数据
|
||||
|
||||
编写`main.rs`
|
||||
|
||||
**需要使用`XDB_FILEPATH`指定`ip2region.xdb`文件的路径**,该参数可以使用相对路径或者绝对路径,如果使用相对路径报错,请修改为绝对路径
|
||||
|
||||
```rust
|
||||
use std::env;
|
||||
|
||||
|
|
@ -65,17 +61,39 @@ Ok("0|0|0|内网IP|内网IP")
|
|||
Ok("0|0|0|内网IP|内网IP")
|
||||
```
|
||||
|
||||
# `binding/rust`路径下面的结构说明
|
||||
|
||||
`ip2region2`
|
||||
|
||||
- 包含了`ip`到`region`的函数调用库
|
||||
- 里面包含了单元测试和`benchmark`测试
|
||||
|
||||
`example`
|
||||
|
||||
- 包含了命令行可执行文件生成的源码程序
|
||||
- 作为一个用于`rust`的开发集成例子
|
||||
|
||||
开始编译之后会生成如下
|
||||
|
||||
`target`
|
||||
|
||||
- 文件夹存放编译之后的文件以及编译产生的临时文件与缓存
|
||||
|
||||
`Cargo.lock`
|
||||
|
||||
- 固定`rust`第三方库的版本
|
||||
|
||||
这个些编译生成的文件全部在`.gitignore`中有标识,不会被提交
|
||||
|
||||
# 编译程序
|
||||
|
||||
通过如下方式编译得到 `ip2region` 可执行程序
|
||||
|
||||
切换到 `rust binding` 根目录,执行如下命令
|
||||
切换到 `binding/rust` 路径,执行如下命令
|
||||
|
||||
```bash
|
||||
➜ cargo build -r
|
||||
```
|
||||
|
||||
生成的二进制文件会在`./target/release/ip2region`位置
|
||||
生成的二进制文件会在`./target/release/rust-example`位置
|
||||
|
||||
# 查询测试
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "example"
|
||||
default-run = "example"
|
||||
name = "rust-example"
|
||||
default-run = "rust-example"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
rust-version = "1.66.0"
|
||||
|
|
@ -13,4 +13,4 @@ license = "Apache-2.0"
|
|||
ip2region2 = { path = "../ip2region2" }
|
||||
clap = { version = "4.0" }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = "0.2.0"
|
||||
tracing-subscriber = "0.3.14"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
extern crate core;
|
||||
|
||||
use clap::ArgMatches;
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::io::Write;
|
||||
|
|
@ -8,6 +7,8 @@ use std::net::Ipv4Addr;
|
|||
use std::str::FromStr;
|
||||
use std::time::Instant;
|
||||
|
||||
use clap::ArgMatches;
|
||||
|
||||
use ip2region2::{search_by_ip, searcher_init};
|
||||
|
||||
mod cmd;
|
||||
|
|
@ -28,11 +29,15 @@ fn bench_test(src_filepath: &str) {
|
|||
let mut file = File::open(src_filepath).unwrap();
|
||||
let mut contents = String::new();
|
||||
file.read_to_string(&mut contents).unwrap();
|
||||
|
||||
for line in contents.split('\n') {
|
||||
if !line.contains('|') {
|
||||
continue;
|
||||
}
|
||||
let ip_test_line = line.splitn(3, '|').collect::<Vec<&str>>();
|
||||
if ip_test_line.len() != 3 {
|
||||
panic!("this line {line} don`t have enough `|` for spilt");
|
||||
}
|
||||
let start_ip = Ipv4Addr::from_str(ip_test_line[0]).unwrap();
|
||||
let end_ip = Ipv4Addr::from_str(ip_test_line[1]).unwrap();
|
||||
if end_ip < start_ip {
|
||||
|
|
@ -48,7 +53,8 @@ fn bench_test(src_filepath: &str) {
|
|||
((mid_ip as u64 + end_ip as u64) >> 1) as u32,
|
||||
end_ip,
|
||||
] {
|
||||
search_by_ip(ip).unwrap();
|
||||
let result = search_by_ip(ip).unwrap();
|
||||
assert_eq!(result.as_str(), ip_test_line[2]);
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -75,7 +81,7 @@ fn query_test() {
|
|||
let now = Instant::now();
|
||||
let result = search_by_ip(line);
|
||||
let cost = now.elapsed();
|
||||
println!("region: {result:?}, took: {cost:?}", );
|
||||
println!("region: {result:?}, took: {cost:?}",);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ license = "Apache-2.0"
|
|||
[dependencies]
|
||||
once_cell = "1.16"
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = "0.2.0"
|
||||
tracing-subscriber = "0.3.14"
|
||||
|
||||
[dev-dependencies]
|
||||
criterion = "0.4"
|
||||
|
|
|
|||
Loading…
Reference in New Issue