Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >serde:加速自定义枚举反序列化

serde:加速自定义枚举反序列化
EN

Stack Overflow用户
提问于 2019-04-23 11:46:24
回答 1查看 634关注 0票数 2

我的程序解析足够大的json文档(30MB),在运行缓慢的机器上它需要70ms,我想加速这个过程,我发现有27%的解析发生在我的foo_document_type_deserialize中,有没有可能改进这个功能,有没有办法跳过这里的String分配:let s = String::deserialize(deserializer)?;

我完全确定表示枚举值的字符串不包含像\b \f \n \r \t \" \\这样的特殊json字符,所以使用未转义的字符串应该是安全的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use serde::{Deserialize, Deserializer};

#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FooDocument {
    // other fields...
    #[serde(rename = "type")]
    #[serde(deserialize_with = "foo_document_type_deserialize")]
    doc_type: FooDocumentType,
}

fn foo_document_type_deserialize<'de, D>(deserializer: D) -> Result<FooDocumentType, D::Error>
where
    D: Deserializer<'de>,
{
    use self::FooDocumentType::*;
    let s = String::deserialize(deserializer)?;
    match s.as_str() {
        "tir lim bom bom" => Ok(Var1),
        "hgga;hghau" => Ok(Var2),
        "hgueoqtyhit4t" => Ok(Var3),
        "Text" | "Type not detected" | "---" => Ok(Unknown),
        _ => Err(serde::de::Error::custom(format!(
            "Unsupported foo document type '{}'",
            s
        ))),
    }
}

#[derive(Debug, Clone, Copy)]
pub enum FooDocumentType {
    Unknown,
    Var1,
    Var2,
    Var3,
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-23 16:56:51

您编写的自定义impl是serde_derive可以生成的形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#[derive(Deserialize, Debug)]
pub enum FooDocumentType {
    #[serde(rename = "Text", alias = "Type not detected", alias = "---")]
    Unknown,
    #[serde(rename = "tir lim bom bom")]
    Var1,
    #[serde(rename = "hgga;hghau")]
    Var2,
    #[serde(rename = "hgueoqtyhit4t")]
    Var3,
}

由此产生的派生代码不会分配内存,并且在快速微基准测试中比您的代码快2倍,当我测量以下内容时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
serde_json::from_str::<FooDocument>(r#"{"type":"hgga;hghau"}"#).unwrap()
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55810518

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文