识别包含页面加载时间的瓶颈

时间:2014-02-04 13:32:12

标签: asp.net-mvc performance page-load-time

我的应用有问题。加载时间从500毫秒到5秒不等,在极端情况下10秒,这对我来说有点奇怪,因为我是网络开发的新手。 加载我的页面如下所示:

  1. 用户点击
  2. 在进入控制器之前检查用户是否有权这样做
  3. 向Active Directory询问凭据并询问我的数据库的权利
  4. 从控制器加载页面调用方法或显示错误
  5. AD服务器会导致这样的延迟吗?

    即使我关闭身份验证页面也会在3秒钟内加载,当你看到时可能很无聊 “等待localhost”标志:)

    以下示例,无需身份验证即可平均加载3秒。 控制器方法:

    public ActionResult Index(string name, string surname ,string deviceName, string deviceManufacturer)
        {
            var deviceusages = db.DeviceUsages.Include(d => d.DeviceInstance).Include(d => d.Storage).Include(d => d.User).Where(w=>w.UserId!=6);
            if(name!="" && name!=null)
            {
                deviceusages = deviceusages.Where(w => w.User.Name.Contains(name));
            }
            if (surname != "" && surname != null)
            {
                deviceusages = deviceusages.Where(w => w.User.Surname.Contains(surname));
            }
            if (deviceName != "" && deviceName != null)
            {
                deviceusages = deviceusages.Where(w => w.DeviceInstance.Device.Name.Contains(deviceName));
            }
            if (deviceManufacturer!= "" && deviceManufacturer != null)
            {
                deviceusages = deviceusages.Where(w => w.DeviceInstance.Device.Manufacturer.Contains(deviceManufacturer));
            }
            return View(deviceusages.ToList());
        }
    

    和cshtml页面:

    <table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.DeviceInstance.Device.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.DeviceInstance.Device.Manufacturer)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Storage.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.User.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.User.Surname)
        </th><th></th>
    </tr>
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.DeviceInstance.Device.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DeviceInstance.Device.Manufacturer)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Storage.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.User.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.User.Surname)
            </td>
            <td>
                @Html.ActionLink("Details", "Details", new { id=item.DeviceInstanceId }) 
                @if (item.UserId == 1)
                {
                    @Html.Raw("| ")
                    @Html.ActionLink("Claim", "ClaimDevice", new { id = item.DeviceInstanceId })
                }           
            </td>
        </tr>
    }
    </table>
    

    现在我的问题我做错了什么或我的加载时间还可以,我只是新手

1 个答案:

答案 0 :(得分:1)

最初,这是作为评论开始的,但我想我可以将其形成一个答案。首先,你并没有真正做错任何事情,但我可以指出可以提高代码速度的地方。

  1. 您正在加入相当数量的表格。这将导致SQL比单个表/几个连接表慢。

  2. .Contains()方法对应于SQL语法中的LIKE。这比实际值匹配(=)慢。您可以考虑向用户提供下拉列表以进行搜索,以便他们a)不需要知道名称,并且b)他们可以快速查看可能的值。

  3. “AD会导致减速” - 可能。这取决于您的基础设施的维护和布局情况,以及您的网络人员。如果您的AD / LDAP服务器负载很重(因为它运行的是Exchange,SQL和DNS等),响应速度可能会很慢,但这不是代码问题。

  4. 最有可能的是,您的调试器实际上导致您的速度减慢。我注意到EF 6的运行速度比以前版本的调试器慢得多。如前所述,我们的生产应用程序在本地主机上运行大约2s,在发布模式下运行150-200ms,在非常出色的Web服务器硬件上运行。

  5. 不是每次都询问AD,也许你会问一次,然后将AD结果缓存在cookie或类似的东西中。这样可以减少每个请求的应用外部请求。

  6. 所以,总而言之,不 - 你似乎没有做错任何事。在我看来,你确实有改进的余地,但我不会太担心它,直到你真的可以在服务器上和localhost之外获得它并测试你的应用程序。

相关问题