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文章
594浏览量
23038 -
代码
+关注
关注
30文章
4941浏览量
73127 -
编译
+关注
关注
0文章
688浏览量
34939 -
GitHub
+关注
关注
3文章
484浏览量
18421
原文标题:【大家的项目】nuere - 简单小巧快速的字符串解析库
文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
字符串移位包含的问题解决方案
问题:给定字符串s和t,判断是否字符串t能通过将s移位后的字符串所包含。 方法一 最简单的方法就是将s进行循环移位,再判断移位后的字符串是否
发表于 11-29 10:05
•1212次阅读
什么是复制字符串?Python如何复制字符串
连续几篇文章都在写 Python 字符串,这出乎我的意料了。但是,有的问题,不写不行,特别是那种灵机一动想到的问题,最后你发现,很多人根本不懂却又误以为自己懂了。那就继续刨根问底,探究个明白吧
发表于 11-25 10:32
•3374次阅读
strtok拆分字符串
就是字符格式。有些场景需要使用多个处理器协同工作,比如单片机+openmv,它们之间需要通信,可以采用字符格式的编码方式。操作字符串,无非是两件事儿:生成字符串与
发表于 01-13 15:46
•8次下载
关于STEP7库功能字符串转换
:库libraries---Standard Libray---TI-S7 Converting Blocks) FC编号 功能名称 描述 FC5 DI_STRING 双整数转字符串 FC16
python字符串有哪些特定方法
python字符串序列操作也适用于列表和元组。
python字符串还有独有方法,即字符串对象的函数,其他对象不可调用,只有字符串对象可调用。
字符串的相关知识
TCL 中的数据类型只有一种:字符串。这些字符串可以是字母、数字、布尔值、标点符号等特殊字符的组合。在某些特殊命令的作用下,字符串可以向其他数据类型转换。下面将系统的讲解或回顾下
mysql字符串包含某个字符串
MySQL是一种开源的关系型数据库管理系统,被广泛用于构建Web应用程序和其他大型数据驱动的应用。在进行MySQL数据库查询时,经常需要使用字符串包含操作,即判断一个字符串是否包含另一
MySQL替换字符串函数REPLACE
MySQL是目前非常流行的开源数据库管理系统之一,它具有强大的功能和性能。其中之一的字符串函数REPLACE,可以用于替换字符串中的指定字符或字符串
oracle判断字符串包含某个字符
字符串操作是任何编程语言中都非常重要的一部分,Oracle数据库作为目前最常用的关系型数据库之一,也提供了丰富的字符串操作函数和方法。在本文中,我们将详细
oracle字符串split成多个
Oracle是一种广泛使用的关系型数据库管理系统,它提供了许多强大的功能和函数,用于处理和操作数据。其中之一就是字符串分割(split)方法,该方法用于将一个字符串按照指定的分隔符分割成多个子
字符串与字符数组的区别
大多数编程语言中是一个高级数据结构,通常由语言的运行时环境直接支持。字符串通常以连续的字符序列存储,但它们不仅仅是字符的简单集合。字符串对象
字符串在数据库中的存储方式
数据库是现代信息技术中存储和管理数据的核心组件。字符串作为最常见的数据类型之一,在数据库中的存储方式对其性能和可扩展性有着重要影响。 数据类型 固定长度字符串 :如CHAR类型,它为每

nuere-简单小巧快速的字符串解析库
评论