- C binding 提供了对 IPv6 的查询支持,具体使用文档请参考 C Binding,测试方式如下:
➜ c git:(master) ./xdb_searcher search --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, io_count: 2, took: 42 μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, io_count: 21, took: 121 μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
- 使用
xdb_region_buffer_t
来管理 region 信息的存储,即支持旧的基于固定栈内存的存储方式,可以减少运行时的内存碎片,也支持新的按需自动内存分配来适应各种地域信息,使用方式如下:
#include "xdb_api.h"
// 1, 通过指定一块内存来创建 region_buffer
char buffer[512];
xdb_region_buffer_t region;
int err = xdb_region_buffer_init(®ion, buffer, sizeof(buffer));
if (err != 0) {
// 初始化失败
printf("failed to init region buffer width errcode=%d", err);
return;
}
// 2,通过指定 NULL 来创建 region_buffer,让其自动按需分配内存
xdb_region_buffer_t region;
int err = xdb_region_buffer_init(®ion, NULL, 0);
if (err != 0) {
// 初始化失败
printf("failed to init region buffer width errcode=%d", err);
return;
}
// 备注:在每次调用 search 完成 IP 定位信息的查询后,你需要手动调用函数来释放内存 .
// search 函数使用未经清理的 region 信息会报错。
xdb_region_buffer_free(®ion);
- 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜ c git:(fr_c_ipv6) ✗ ./xdb_searcher bench --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt
Bench finished, {cache_policy: vectorIndex, total: 34159862, took: 857.750s, cost: 24 μs/op}
3415.9 万个 IPv6 平均查询耗时为 24
微秒/次。