neure是一個(gè)簡(jiǎn)單小巧的字符串解析庫, 我在開發(fā)aopt時(shí)為了優(yōu)化編譯時(shí)間而開發(fā)的替代regex的庫. 目前代碼架構(gòu)非常簡(jiǎn)單, 性能上比regex更快, 和nom的速度不相上下. 設(shè)計(jì)上參考了regex.Readme有一個(gè)和regex比較的代碼,可以嘗試一下.
https://github.com/araraloren/neure
補(bǔ)充一個(gè)和nom例子比較的代碼,開啟lto=fat時(shí)性能不相上下
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,
);
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
字符串
+關(guān)注
關(guān)注
1文章
596瀏覽量
23168 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73992 -
編譯
+關(guān)注
關(guān)注
0文章
694瀏覽量
35168 -
GitHub
+關(guān)注
關(guān)注
3文章
488瀏覽量
18679
原文標(biāo)題:【大家的項(xiàng)目】nuere - 簡(jiǎn)單小巧快速的字符串解析庫
文章出處:【微信號(hào):Rust語言中文社區(qū),微信公眾號(hào):Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
字符串移位包含的問題解決方案
問題:給定字符串s和t,判斷是否字符串t能通過將s移位后的字符串所包含。 方法一 最簡(jiǎn)單的方法就是將s進(jìn)行循環(huán)移位,再判斷移位后的字符串是否
發(fā)表于 11-29 10:05
?1242次閱讀
什么是復(fù)制字符串?Python如何復(fù)制字符串
連續(xù)幾篇文章都在寫 Python 字符串,這出乎我的意料了。但是,有的問題,不寫不行,特別是那種靈機(jī)一動(dòng)想到的問題,最后你發(fā)現(xiàn),很多人根本不懂卻又誤以為自己懂了。那就繼續(xù)刨根問底,探究個(gè)明白吧
發(fā)表于 11-25 10:32
?3533次閱讀
strtok拆分字符串
就是字符格式。有些場(chǎng)景需要使用多個(gè)處理器協(xié)同工作,比如單片機(jī)+openmv,它們之間需要通信,可以采用字符格式的編碼方式。操作字符串,無非是兩件事兒:生成字符串與
發(fā)表于 01-13 15:46
?8次下載
C語言總結(jié)_字符串全方位練習(xí)
C語言字符串全方位練習(xí),涉及知識(shí)點(diǎn):字符串解析、大小寫判斷、字符串插入、字符串刪除、字符串排序、
關(guān)于STEP7庫功能字符串轉(zhuǎn)換
:庫libraries---Standard Libray---TI-S7 Converting Blocks) FC編號(hào) 功能名稱 描述 FC5 DI_STRING 雙整數(shù)轉(zhuǎn)字符串 FC16
python字符串有哪些特定方法
python字符串序列操作也適用于列表和元組。
python字符串還有獨(dú)有方法,即字符串對(duì)象的函數(shù),其他對(duì)象不可調(diào)用,只有字符串對(duì)象可調(diào)用。
字符串的相關(guān)知識(shí)
TCL 中的數(shù)據(jù)類型只有一種:字符串。這些字符串可以是字母、數(shù)字、布爾值、標(biāo)點(diǎn)符號(hào)等特殊字符的組合。在某些特殊命令的作用下,字符串可以向其他數(shù)據(jù)類型轉(zhuǎn)換。下面將系統(tǒng)的講解或回顧下
mysql字符串包含某個(gè)字符串
MySQL是一種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),被廣泛用于構(gòu)建Web應(yīng)用程序和其他大型數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用。在進(jìn)行MySQL數(shù)據(jù)庫查詢時(shí),經(jīng)常需要使用字符串包含操作,即判斷一個(gè)字符串是否包含另一
MySQL替換字符串函數(shù)REPLACE
MySQL是目前非常流行的開源數(shù)據(jù)庫管理系統(tǒng)之一,它具有強(qiáng)大的功能和性能。其中之一的字符串函數(shù)REPLACE,可以用于替換字符串中的指定字符或字符串
oracle判斷字符串包含某個(gè)字符
字符串操作是任何編程語言中都非常重要的一部分,Oracle數(shù)據(jù)庫作為目前最常用的關(guān)系型數(shù)據(jù)庫之一,也提供了豐富的字符串操作函數(shù)和方法。在本文中,我們將詳細(xì)
oracle字符串split成多個(gè)
Oracle是一種廣泛使用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它提供了許多強(qiáng)大的功能和函數(shù),用于處理和操作數(shù)據(jù)。其中之一就是字符串分割(split)方法,該方法用于將一個(gè)字符串按照指定的分隔符分割成多個(gè)子
字符串與字符數(shù)組的區(qū)別
大多數(shù)編程語言中是一個(gè)高級(jí)數(shù)據(jù)結(jié)構(gòu),通常由語言的運(yùn)行時(shí)環(huán)境直接支持。字符串通常以連續(xù)的字符序列存儲(chǔ),但它們不僅僅是字符的簡(jiǎn)單集合。字符串對(duì)象
字符串在數(shù)據(jù)庫中的存儲(chǔ)方式
數(shù)據(jù)庫是現(xiàn)代信息技術(shù)中存儲(chǔ)和管理數(shù)據(jù)的核心組件。字符串作為最常見的數(shù)據(jù)類型之一,在數(shù)據(jù)庫中的存儲(chǔ)方式對(duì)其性能和可擴(kuò)展性有著重要影響。 數(shù)據(jù)類型 固定長度字符串 :如CHAR類型,它為每
nuere-簡(jiǎn)單小巧快速的字符串解析庫
評(píng)論