8

我有一个返回联系人列表的简单 Web API:

public class ContactsApi : ApiController
{
    public List<Contact> GetContacts()
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        // Doing some business to get contacts;
        watch.Stop();
        // The operation only takes less than 500 milliseconds
        // returning list of contacts
    }
}

正如我曾经Stopwatch测试数据检索性能一样,很明显它只需要不到一秒钟的时间。但是,当我通过 Chrome 浏览器向操作发出请求时GetContacts,需要 4 到 5 秒才能返回数据。

在此处输入图像描述

显然,延迟与我的数据检索代码无关。在我看来,Web API 运行缓慢。但我不知道如何调试和跟踪它。

是否有任何实用程序来记录 ASP.NET HTTP 请求处理管道的时间?我的意思是,像Navigation Timing这样的东西来显示每个事件发生在什么时间?

4

4 回答 4

5

你的反应有多大?也许这是序列化和传输的成本?然而,有很多可能性来分析它,我会从使用市场上的一种工具开始分析,比如ANTS Performance ProfilerdotTrace

于 2013-11-12T06:15:03.257 回答
2

你用调试器运行它吗?在没有调试器的情况下进行一些测试。我目前正在开发的一个 Web API 项目也有类似的问题,对我们来说,关闭调试器使测试需要几毫秒而不是几秒。

第一次调用 API 时似乎也有一些启动成本,后续请求总是更快。

于 2013-11-12T12:51:29.123 回答
0

尝试使用免费的网络调试工具 Fiddler ( http://fiddler2.com/ )。它具有您正在寻找的大部分功能。

于 2013-11-12T05:55:09.477 回答
0

4.5秒是相当大的。如果你使用 EF,你可以使用 MiniProfiler.EF

我因错误地使用 Entity Framework Queryable(将其转换为列表、扩展......)而经历了一些放缓(过去)。

如果您使用的是 EF,请尽可能长时间地将其保持为 IQueryable( .ToList() 执行查询)。

根据您的需要,使用 MiniProfiler、MiniProfiler.Ef 等调试工具和其他建议的工具可能也不错(尽管我过去没有使用过它们)。

序列化的成本可能很重要(如果您使用的是 DTO),AutoMapper(可能还有其他工具)在大型列表上似乎很慢。如果您真的想要在大列表中获得性能,我建议您在扩展方法中手动映射它们。

于 2015-10-19T23:20:58.413 回答