Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 识别提高页面加载时间的瓶颈_Asp.net Mvc_Performance_Page Load Time - Fatal编程技术网

Asp.net mvc 识别提高页面加载时间的瓶颈

Asp.net mvc 识别提高页面加载时间的瓶颈,asp.net-mvc,performance,page-load-time,Asp.net Mvc,Performance,Page Load Time,我的应用程序有问题。加载时间从500毫秒到5秒不等,在极端情况下为10秒,这对我来说有点奇怪,因为我是web开发新手。 加载我的页面时如下所示: 用户点击 在进入控制器之前,检查用户是否有这样做的权限 向Active directory请求凭据并向我的数据库请求权限 从控制器加载页调用方法或显示错误 广告服务器会导致这样的延迟吗 即使我关闭了身份验证,页面也会在3秒钟内加载,这可能会让你觉得无聊 “正在等待本地主机”标志:) 以下示例,在没有验证的情况下加载平均需要3秒。 控制器方法: publ

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

  • 用户点击
  • 在进入控制器之前,检查用户是否有这样做的权限
  • 向Active directory请求凭据并向我的数据库请求权限
  • 从控制器加载页调用方法或显示错误
  • 广告服务器会导致这样的延迟吗

    即使我关闭了身份验证,页面也会在3秒钟内加载,这可能会让你觉得无聊 “正在等待本地主机”标志:)

    以下示例,在没有验证的情况下加载平均需要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>
    
    
    @DisplayNameFor(model=>model.DeviceInstance.Device.Name)
    @DisplayNameFor(model=>model.DeviceInstance.Device.Manufacturer)
    @DisplayNameFor(model=>model.Storage.Name)
    @DisplayNameFor(model=>model.User.Name)
    @Html.DisplayNameFor(model=>model.User.name)
    @foreach(模型中的var项目){
    @DisplayFor(modelItem=>item.DeviceInstance.Device.Name)
    @DisplayFor(modelItem=>item.DeviceInstance.Device.Manufacturer)
    @DisplayFor(modelItem=>item.Storage.Name)
    @DisplayFor(modelItem=>item.User.Name)
    @DisplayFor(modelItem=>item.User.name)
    @ActionLink(“详细信息”,“详细信息”,新的{id=item.DeviceInstanceId})
    @如果(item.UserId==1)
    {
    @Html.Raw(“|”)文件
    @ActionLink(“索赔”、“索赔设备”,新{id=item.DeviceInstanceId})
    }           
    }
    

    现在我的问题是,我做错了什么,或者我的加载时间还行,我只是个新手。起初,这只是一个评论,但我想我可以把它变成一个回答。首先,您并没有真的做错任何事情,但我可以指出您的代码速度可以提高的地方

  • 你加入了相当多的表格。这将导致SQL比单个表/几个联接表慢

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

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

  • 最有可能的是,调试器实际上导致了您的速度减慢。我注意到EF 6在附加了调试器的情况下比以前的版本运行得慢得多。如前所述,我们的生产应用程序在本地主机上运行约2秒,在发布模式下在非一流的web服务器硬件上运行约150-200毫秒

  • 与其每次都问广告,不如问一次,然后将广告结果缓存在cookie或类似的东西中。这将减少每个请求在应用程序之外的请求


  • 总之,不,你似乎没有做错什么。在我看来,您确实有改进的余地,但我不会太担心它,直到您真正能够在服务器上和本地主机之外获得它并测试您的应用程序。

    这里涉及的db表有多大?每个单元格中最多8列x 40行x int或varchar(50)。没什么大不了的1)当运行localhost时,会连接调试器,这会根据需要将速度降低5-10倍。2) 这些EF查询将比简单的
    =
    查询慢得多(.contains()相当于SQL中的
    LIKE
    ,相对于实际值匹配而言,它的速度不太快;3)您也将相当多的表连接在一起,这可能会影响速度/性能。总的来说,我认为您的问题只是在附加了调试器的情况下运行。尝试推出到实际的web服务器,然后测量您的性能。不幸的是,用例需要包含:用户不知道设备的全名,并输入他所记得的所有内容。然后给他们下拉列表,因为您只需要一个用户名/设备/等。无论如何,我真的认为这只是因为你的调试器是附加的。在我们维护的一个更大的应用程序中,调试中的页面加载大约为2秒,在web服务器上的生产/发布构建中,它们接近150毫秒