neure是一个简单小巧的字符串解析库, 我在开发aopt时为了优化编译时间而开发的替代regex的库. 目前代码架构非常简单, 性能上比regex更快, 和nom的速度不相上下. 设计上参考了regex.Readme有一个和regex比较的代码,可以尝试一下.
https://github.com/araraloren/neure
补充一个和nom例子比较的代码,开启lto=fat时性能不相上下
use neure::*; use nom::{ bytes::{tag, take_while_m_n}, combinator::map_res, sequence::tuple, IResult, }; #[derive(Debug, PartialEq)] pub struct Color { pub red: u8, pub green: u8, pub blue: u8, } fn from_hex(input: &str) -> Result{ u8::from_str_radix(input, 16) } fn is_hex_digit(c: char) -> bool { c.is_digit(16) } fn hex_primary(input: &str) -> IResult<&str, u8> { map_res(take_while_m_n(2, 2, is_hex_digit), from_hex)(input) } fn hex_color(input: &str) -> IResult<&str, Color> { let (input, _) = tag("#")(input)?; let (input, (red, green, blue)) = tuple((hex_primary, hex_primary, hex_primary))(input)?; Ok((input, Color { red, green, blue })) } fn main() -> Result<(), Box > { let mut storer = SpanStorer::new(1); let color_str = "#2F14DF"; let parser = |storer: &mut SpanStorer, str: &str| -> Result<(), neure::Error> { let pound = neure!('#'); let hex = neure!(['0' - '9' 'A' - 'F']{2}); let mut ctx = CharsCtx::default().with_str(str); ctx.reset(); ctx.try_mat(£)?; ctx.try_cap(0, storer, &hex)?; ctx.try_cap(0, storer, &hex)?; ctx.try_cap(0, storer, &hex)?; Ok(()) }; measure(100000, 100000, || { if parser(storer.reset(), color_str).is_ok() { let mut strs = storer.substrs(color_str, 0).unwrap(); assert_eq!( Color { red: u8::from_str_radix(strs.next().unwrap(), 16).unwrap(), green: u8::from_str_radix(strs.next().unwrap(), 16).unwrap(), blue: u8::from_str_radix(strs.next().unwrap(), 16).unwrap(), }, Color { red: 47, green: 20, blue: 223, } ); 1 } else { 0 } }); measure(100000, 100000, || { if hex_color("#2F14DF").unwrap() == ( "", Color { red: 47, green: 20, blue: 223, }, ) { 1 } else { 0 } }); Ok(()) } pub fn measure(n: usize, size: usize, mut f: impl FnMut() -> i32) { use std::Instant; let start = Instant::now(); let mut sum = 0; for _ in 0..n { sum += f(); } let time = start.elapsed(); println!( "Size = {size}, Cost time {} with test {} times: {} --> {}", time.as_secs_f64(), n, time.as_secs_f64() / n as f64, sum, ); }
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
字符串
+关注
关注
1文章
552浏览量
20132 -
代码
+关注
关注
30文章
4556浏览量
66784 -
编译
+关注
关注
0文章
615浏览量
32397 -
GitHub
+关注
关注
3文章
457浏览量
15924
原文标题:【大家的项目】nuere - 简单小巧快速的字符串解析库
文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
LABVIEW字符串转换为UTF-8编码字符串
,在这个库中就包含了上述函数。库的具体位置如下图所示:这个库中的许多VI都使用了一个内置函数“"文本至UTF-8转换”。该函数可以把LABVIEW字符串转换为UTF-8编码的
发表于 06-06 15:16
数据转换、SQL存储,十六进制字符串、正常字符串
到了这个方法。方法:将所有乱码的 ,不乱码的数据显示成十六进制,如下图所示,把正常显示的字符串更换为16进制显示,当显示为16进制字符串时,字符串的显示字符组成仅为1-F的
发表于 05-27 10:29
80路串口(230400波特率)同时采集,同时解析,怎么将采集到的字符串解析??
80路串口(230400波特率)同时采集,同时解析,怎么将采集到的字符串解析,目前的思路是一个线程专门读串口采集将读取的用连接字符串连接起来存在全局变量里,另一个线程专门
发表于 04-30 08:58
如何实现字符串函数?
你好 我使用STM8S发现套件和标准固件库。我需要使用字符串函数,如strtok()。如何让这些功能在这种环境中工作。包括string.h不会工作。我需要实现字符串函数还是有更简单的方
发表于 07-09 08:37
labview字符串转换
` 本帖最后由 jingzhaojun1986 于 2020-6-12 13:58 编辑
,这个库多用于协议解析,主要实现了16进制字符串到正常字符串的显示正常
发表于 05-19 11:50
怎样去查找字符串
估计也不高,差不多就行了。作用:其实就是字符串的查找,然后提对应字符串的数据出来。随便创建一组数组,模拟单片机中接收的数据。 1 char j = '1'; 2 str[0] ...
发表于 07-14 07:02
荣小菜补钙记第45期:报文合成与解析之十六进制字符串与常显字符串的互映射转换
看44期内容。2. 字符串映射转换_正常显示转十六进制显示对于报文,我们推荐尽量将字符串报文转换并保持为数值或数值数组来进行数据处理,快速方便简单。但是,总会遇到有“哎呀已经写成这样没
发表于 09-11 21:21
字符串的相关资料分享
赋给固定的变量。经典的应用比如知名的grbl固件的G代码解析固件https://github.com/grbl/grbl以及GPS报文解析库tinygpshttps://github.com/mikalhart/TinyGPSP
发表于 01-14 09:02
聊聊字符串
就是字符格式。有些场景需要使用多个处理器协同工作,比如单片机+openmv,它们之间需要通信,可以采用字符格式的编码方式。操作字符串,无非是两件事儿:生成字符串与
发表于 02-28 06:52
评论