在开发中为了紧赶项目进度而未去关注性能的问题,在项目逐渐稳定下来后发现性能使人感到有点忧伤,因而开始去关注这方面,本篇为记录在开发中遇到的问题并解决,不喜勿喷。注意:如下问题都是在移动端上出现,没法肯定在网站中是否也一样会出现。javascript
项目属于移动端,在手机上查看某一列表时并进行向下滑动时常常性卡顿问题,滚动的插件采用的是iscroll,固然怀疑是否是这个插件问题,可是很快就排除了这个问题,在其余页面未出现这个问题,后来接着想由于在脚本中进行Ajax请求超时时间设置为30秒,是否是有可能请求接口耗时致使的呢,通过测试并查看日志文件也不是这个问题,因而我开始查看写的脚本文件,吓我一跳,在请求获取数据列表时,请求方式竟然写的POST,这是同事所为,我改成GET后这样的问题获得了大大的改善,我询问同事为何用POST而不用GET,他说了一句进行GET请求有问题出现错误,这时我才明白他指的是什么,在MVC中在进行GET请求获取JSON数据时,须要进行以下设置:html
return Json("",JsonRequestBehavior.AllowGet);
建议:在进行Ajax请求时,是什么请求方式,请采起对应的方式来进行请求,要否则给出其余请求方式干吗,吃饱了撑着吗!java
经过上述请求方式改善后问题获得必定的改善(评论也有指出不是这个致使快慢的问题,赞成评论观点,应该是其余缘由致使,仍是以为对应的请求采起对应的方式才是),可是仍是存在问题,咱们继续查看脚本,咱们可能会常常这样作:咱们将须要用到的一些脚本方法,好比格式日期转换,获取cookie等封装在一个公用脚本中来方便调用。下面咱们进行演示下。jquery
在脚本中进行请求时咱们通常进行以下:web
$(function () { type: 'get', url: "/home/Info", data: {}, success: function () { }, dataType: "application/json" }); });
可是同事倒是这样作的,将请求路径写在公用脚本中以下:ajax
var path = "/"
此时咱们的请求就变成了这样:正则表达式
$(function () { $.ajax({ type: 'get', url: path + "home/Info", data: {}, success: function () { }, dataType: "json" }); });
这样写确定没错,可是事实时当咱们改为了第一种时效率立刻提上来了,而用第二种方式时会请求很长时间,方式不一样,可是貌似没什么区别,至于缘由我也不明白,为何如同事那样写不行。数据库
建议:当进行请求时,请直接写路径而不要上述那样,有时候在你看来,方式同样,却致使了不一样的结果。json
至此也就大体上解决了在手机上滑动时卡顿的问题,固然也不排除脚本写的有问题的状况。缓存
在页面请求时为了那些不会改变的脚本或者数据从而加快页面加载速度,咱们一般使用缓存来解决。
在进行请求时,有些不会改变的脚本咱们须要进行缓存,而不是每请求一次而又从新加载一次,固然此时就有人想到了怎么样去缓存脚本的问题,好比以下:
<script src="~/Scripts/video.js?2016040901"></script>
在脚本文件后加上一段数字就ok了,是的确实是这么简单,当咱们对脚本文件进行了修改再去改变下后面的数字便可,可是你有没有想过,若是项目中脚本文件多的数不胜数并且一旦你修改了大量的脚本文件,你还去页面中进行大量的更改,你不累吗,反正我会累死。而我想到的是将那些一些引入的脚本在后面直接加上数字确定是没问题,由于这样的脚本咱们基本不会去动了,例如引入jquery脚本(有些人可能会钻空子了,去修改也是有可能的),好吧,那咱们统一一点诺:咱们在配置文件中能够将其后面的数字做为咱们去要修改的脚本,当咱们修改了脚本直接改变配置文件中的版本不就得了,这样方便管理,一劳永逸,何乐而不为。咱们下面来看看。
(1)咱们在配置文件中添加修改的脚本版本(固然你能够随便写一串数字,下次修改了脚本直接改变其数字便可)
<add key="version" value="2016040901"/>
(2)接着咱们写一个HtmlHelper的扩展方法,以下:
public static class FileHtmlHelper { private static readonly string s_version = ConfigurationManager.AppSettings["version"].ToString(); private static readonly string s_root = HttpRuntime.AppDomainAppPath.TrimEnd('\\'); public static MvcHtmlString RefFileHtml(this HtmlHelper htmlHelper, string path) { string filePath = s_root + path.Replace("/", "\\"); return new MvcHtmlString(string.Format("<script type=\"text/javascript\" src=\"{0}?{1}\"></script>\r\n", path, s_version)); } }
(3)此时咱们在MVC视图页面进行以下调用脚本:
@Html.RefFileHtml("/Scripts/video.js")
这样咱们就解决了脚本缓存以及方便管理的问题。
建议:在进行脚本缓存为了方便管理能够经过配置文件读取修改的版本进行管理脚本文件的缓存。样式缓存也是如此。
在MVC中咱们能够对Action缓存,以下:
[OutputCache(Duration = 30)] public ActionResult Cache() { return View(); }
那要是当咱们有参数来达到缓存时,又该如何作呢?直接对整个页面全部请求的参数进行缓存,以下:
[OutputCache(Duration = 30,VaryByParam="*")] public ActionResult Cache() { return View(); }
此上对JsonResult也是如此,当咱们经过参数来筛选不变的列表时,此时咱们彻底能够将其进行缓存,此时咱们明确的参数类型也就是自定义缓存。
咱们经过配置文件来进行配置便可,以下:
<caching> <outputCacheSettings> <outputCacheProfiles> <add name="customProfile" duration="900" location="Server" varyByParam="UserId" /> </outputCacheProfiles> </outputCacheSettings> </caching>
在上述还有许多参数供你选择,选择你须要的缓存参数便可。
在控制器中咱们只需添加自定义缓存名称便可:
[OutputCache(CacheProfile="customProfile"] public JsonResult Info() { return Json(new { result = "ok" }, JsonRequestBehavior.AllowGet); }
注意:上述caching节点是位于system.Web节点下,而非system.webServer节点下。
(1)删除不须要的httpModules,以下:
<httpModules> <remove name="Session"/> <remove name="RoleManager"/> <remove name="PassportAuthentication"/> <remove name="Profile"/> <remove name="ServiceModel"/> </httpModules>
(2)因为利用表单验证,也能够删除以下httpModules
<httpModules> <remove name="WindowsAuthentication"/> <remove name="FileAuthorization"/> </httpModules>
(3)在IIS上启用压缩,压缩响应结果减小网络传输时间。
当数据进行数据库存储时发如今安卓上存储成功,而在苹果上存储失败,这个问题纠结了好久,并查看日志文件最终发现苹果上对日期有特殊的格式传递,不然为空,因而利用js中的replace方法来进行替换。
date.replace("-", "/");
此时发现利用replace方法只能替换第一个横线,最终采用正则表达式所有替换并解决
date.replace(/-/g, "/");
注意:在苹果上日期进行传递时必须是如"2016/04/09"而不能为"2016-04-09"。
部分参考来源:不修改代码就能优化ASP.NET网站性能的一些方法。
经过对问题的出现以及解决花费了一点时间,最终使得在手机上请求数据耗时获得大大的改善、页面加载的速度提升了许多以及滑动数据顺畅而由此告一段落。有些细小的问题平时不太注意,感受各类方式都能实现,却不知这样作的结果是不是同样,实现的结果同样,可是呈现出的效果倒是天壤之别,实际开发中发现一些小的细节对整个项目的成败是多么的重要。
反省:对于文中评论观点持认同,第一个对于请求方式这块应该是其余缘由所致使,第二个对于协议这块确实须要更深刻的了解和学习,感谢评论中的精彩回答,涨知识了,在此一并表示感谢。