.net - 使用 DataContract 反序列化为枚举时如何优化 ServiceStack.Text 性能
问题描述
将枚举值反序列化为设置了DataContract和EnumMember属性的 .Net 枚举时,有没有办法优化 ServiceStack.Text(版本 5.4.0)的性能?我想使用 EnumMember 属性来定义序列化名称,但不幸的是 ServiceStack.Text 似乎需要大约三倍的时间来使用此方法进行反序列化,而不是基于普通枚举成员名称进行反序列化。
例如,考虑这个简单的 C# 测试程序:
using ServiceStack;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.Serialization;
using System.Text;
namespace ServiceStackPerformance
{
public class Program
{
[DataContract]
enum DataContractEnum
{
[EnumMember(Value = "first")]
First = 0,
[EnumMember(Value = "second")]
Second = 1,
}
enum PlainEnum
{
first = 0,
second = 1,
}
[DataContract]
class DataContractEnumList
{
[DataMember(Name = "values")]
public List<DataContractEnum> Values { get; set; }
}
[DataContract]
class PlainEnumList
{
[DataMember(Name = "values")]
public List<PlainEnum> Values { get; set; }
}
static void Main(string[] args)
{
int size = 100000;
string test = GenerateTestString(size);
var stopwatch = new Stopwatch();
stopwatch.Start();
var dataContractEnumList = test.FromJson<DataContractEnumList>();
var dataContractMs = stopwatch.ElapsedMilliseconds;
stopwatch.Restart();
var plainType = test.FromJson<PlainEnumList>();
var plainMs = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"Deserializing input of size {2*size+1} to data contract enum took {dataContractMs} ms.");
Console.WriteLine($"Deserializing input of size {2*size+1} to simple enum took {plainMs} ms.");
}
private static string GenerateTestString(int size)
{
var builder = new StringBuilder(10*size);
builder.Append("{\"values\":[");
for ( int i = 0; i < size; i++)
{
builder.Append("\"first\",\"second\",");
}
builder.Append("\"first\"]}");
return builder.ToString();
}
}
}
输出如下:
Deserializing input of size 200001 to data contract enum took 3520 ms.
Deserializing input of size 200001 to simple enum took 1131 ms.
我可以启用任何缓存或其他性能优化来避免减速吗?
解决方案
使用缓存的枚举信息的这个提交和枚举的反序列化[EnumMember]
应该可以提高枚举的性能。
此更改可从 v5.4.1 开始,现在可在 MyGet 上使用。
推荐阅读
- angular - 如何使用带有 spring 和 Angular 的多模块 gradle 项目创建 Docker 生产映像
- laravel - Laravel/Spatie 角色和权限问题:如何更改默认模型
- css - 禁用组件时应用 CSS 的方法
- r - R:fn(unlist(x),...)中的错误:未使用的参数(unlist(x))
- json - 通过 curl 和 JSON 发送变量获取无效负载
- android-studio - Android Studio - 更新到 4.2 后生成 apk 时出现错误(密码验证失败)
- r - 如何传播与 strsplit 结合的小标题?
- python - 继续获取此 Python 代码的 SyntaxError
- llvm - 获取对结构的每个成员变量的访问次数或频率
- c# - 将 ASP.NET Core 5 Web API 发布到 Azure 应用服务