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

时间:2019-04-23 11:46:24

标签: rust serde

我的程序解析了足够大的json文档(30MB), 在CPU速度较慢的机器上需要70毫秒,我想加快处理速度, 我发现27%的解析发生在我的foo_document_type_deserialize中, 是否有可能改善此功能,是否有办法跳过String的{​​{1}}分配?

我完全确保代表枚举值的字符串不包含特殊的json字符,例如let s = String::deserialize(deserializer)?;,因此使用未转义的字符串应该是安全的。

\b \f \n  \r \t \" \\

1 个答案:

答案 0 :(得分:4)

您编写的自定义隐式格式的形式为serde_derive可以生成:

#[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倍:

serde_json::from_str::<FooDocument>(r#"{"type":"hgga;hghau"}"#).unwrap()