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文章
589瀏覽量
21081 -
代碼
+關注
關注
30文章
4886瀏覽量
70216 -
編譯
+關注
關注
0文章
676瀏覽量
33720 -
GitHub
+關注
關注
3文章
481瀏覽量
17428
原文標題:【大家的項目】nuere - 簡單小巧快速的字符串解析庫
文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
實例解析Java字符串內存管理方法
Java[1]語言為字符串操作提供了豐富的支持,它將字符串封裝在三個類中并提供多種字符串操作接口。在Java應用程序中,由于對字符串的使用量比較高,從而使得其需要消耗較大的堆空間。例如
發表于 10-27 10:20
?1次下載

字符串移位包含的問題解決方案
問題:給定字符串s和t,判斷是否字符串t能通過將s移位后的字符串所包含。 方法一 最簡單的方法就是將s進行循環移位,再判斷移位后的字符串是否
發表于 11-29 10:05
?1134次閱讀
什么是復制字符串?Python如何復制字符串
連續幾篇文章都在寫 Python 字符串,這出乎我的意料了。但是,有的問題,不寫不行,特別是那種靈機一動想到的問題,最后你發現,很多人根本不懂卻又誤以為自己懂了。那就繼續刨根問底,探究個明白吧
發表于 11-25 10:32
?3154次閱讀
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類型,它為每
評論