Kye*_*Kye 8 .net json odata asp.net-web-api asp.net-core
我有一个 OData 端点(使用 .NET Core 和 .NET 4.7.1 进行测试),它公开了 2,500 个内置于内存的对象。Get OData 调用需要 30-40 秒。返回原始 JSON 的等效 ASP.NET WEB API 调用需要 1 秒。感觉好像 OData 框架不如 Json.NET 高效。关于如何提高性能的任何建议?
真的很慢。
[EnableQuery(EnsureStableOrdering = false)]
public ActionResult<IEnumerable<Person>> Get()
{
var list = new List<Person>();
for (var i = 0; i < 2500; i++)
{
list.Add(new Person());
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
真快。
public IHttpActionResult Get()
{
var list = new List<Person>();
for (var i = 0; i < 2500; i++)
{
list.Add(new Person());
}
var json = JsonConvert.SerializeObject(list);
return Ok(json);
}
Run Code Online (Sandbox Code Playgroud)
好吧,答案不是序列化器。添加 EnableQuery 时,默认情况下允许 OData 使用 Select、Count、Skip、Top、Expand 等不同方法。但最重要的是 EnableQuery 是一个 ActionFilterAttribute,这意味着:
ASP.NET Core 中的过滤器允许代码在请求处理管道中的特定阶段之前或之后运行。
请在此处查看有关ActionFilters的更多信息
话虽如此,EnableQuery 重写了两个方法(之前/之后):
public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
Run Code Online (Sandbox Code Playgroud)
和
public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
Run Code Online (Sandbox Code Playgroud)
第一个是创建和验证查询选项的地方。这涉及到大量的反思工作。第二个检查结果是否已设置且成功,例如,如果您返回 IQueryable,则这里是执行的位置。查询在此级别具体化。它首先尝试从返回的响应消息中检索 IQueryable。然后,它根据“EnableQueryAttribute”上的验证设置验证来自 uri 的查询。它最终适当地应用查询,并将其重置回响应消息。
正如您所看到的,所有这些额外的逻辑都比最后一步将结果转换为 JSON 输出更复杂。
我以你的例子为例:
public override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
Run Code Online (Sandbox Code Playgroud)
我使用 20 个不同的线程运行性能测试,对每个端点执行相同的请求:get1、get2、get3,结果如下:
每个的平均毫秒数是:433,355,337 ,在我看来这还不错,第一个是 Odata,与最后一个相比,在这次负载测试中只有 96 毫秒的差异。不知道为什么你的示例在这里需要 30-40 秒,因为我使用了相同的代码和 Jmeter 来进行负载测试,并且我得到的最大时间是一个请求 900 毫秒,仅第一个请求,这是有意义的,因为应用程序池是从第一个请求开始,以防它处于睡眠状态
恕我直言,如果您想实现可以使用 odata 执行的所有操作(整形、顺序、分页、过滤器),您还需要大量使用反射,至少对于整形和过滤器而言,而不是全部也可用的二元运算符。创建自己的语法对我来说不是一个选择,您需要创建一个词法分析器和一个解析器来适应您自己的语法。因此,我认为您从中获得的好处是巨大的,除非您的 API 不需要这些复杂的运算符。需要考虑的一件事是如何扩展 api 以免损害性能,但这取决于您用来托管它的基础设施。希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
535 次 |
| 最近记录: |