From 6d38469d770a3dcfac52730d7ba328f3b51eef7f Mon Sep 17 00:00:00 2001 From: gongzhengyang Date: Sat, 24 Dec 2022 10:39:39 +0800 Subject: [PATCH] feat: add bench and update tracing version --- binding/rust/ReadMe.md | 42 +++++++++++++++++++++--------- binding/rust/example/Cargo.toml | 6 ++--- binding/rust/example/src/main.rs | 12 ++++++--- binding/rust/ip2region2/Cargo.toml | 2 +- 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/binding/rust/ReadMe.md b/binding/rust/ReadMe.md index 30e4b0c..53b368e 100644 --- a/binding/rust/ReadMe.md +++ b/binding/rust/ReadMe.md @@ -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`位置 # 查询测试 diff --git a/binding/rust/example/Cargo.toml b/binding/rust/example/Cargo.toml index 3d0072f..952f0c2 100644 --- a/binding/rust/example/Cargo.toml +++ b/binding/rust/example/Cargo.toml @@ -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" diff --git a/binding/rust/example/src/main.rs b/binding/rust/example/src/main.rs index bf5c874..cced30c 100644 --- a/binding/rust/example/src/main.rs +++ b/binding/rust/example/src/main.rs @@ -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::>(); + 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:?}",); } } diff --git a/binding/rust/ip2region2/Cargo.toml b/binding/rust/ip2region2/Cargo.toml index a4d51bb..07c7b1b 100644 --- a/binding/rust/ip2region2/Cargo.toml +++ b/binding/rust/ip2region2/Cargo.toml @@ -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"