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文章
596瀏覽量
23165 -
代碼
+關注
關注
30文章
4967瀏覽量
73954 -
編譯
+關注
關注
0文章
694瀏覽量
35157 -
GitHub
+關注
關注
3文章
488瀏覽量
18660
原文標題:【大家的項目】nuere - 簡單小巧快速的字符串解析庫
文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
字符串移位包含的問題解決方案
問題:給定字符串s和t,判斷是否字符串t能通過將s移位后的字符串所包含。 方法一 最簡單的方法就是將s進行循環移位,再判斷移位后的字符串是否
發表于 11-29 10:05
?1242次閱讀
什么是復制字符串?Python如何復制字符串
連續幾篇文章都在寫 Python 字符串,這出乎我的意料了。但是,有的問題,不寫不行,特別是那種靈機一動想到的問題,最后你發現,很多人根本不懂卻又誤以為自己懂了。那就繼續刨根問底,探究個明白吧
發表于 11-25 10:32
?3519次閱讀
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-簡單小巧快速的字符串解析庫
評論