前言

  上一篇《.NET-记一次架构优化实战与方案-梳理篇》整理了基本的业务知识,同时也罗列了存在的问题,本篇主要是针对任务列表的页面进行性能优化。

  该篇主要涉及的是代码实现上的优化,实现上的问题是战术债务,也就是我们平常出现的各种BUG,这种问题一出直接影响业务运营与系统运作。

  你永远想象不到同一条SQL相差个3.5秒钟,遍历两次就导致了 3.5秒*2次 = 7秒的耗时。具体请看下文。

二八原则

  有接触过性能问题的朋友应该都了解过,一般性能瓶颈都是在某行代码或者某个方法,而不是整一个代码实现流程。

  例如:遍历计算、没使用到索引的SQL语句、多余重复的接口请求等等。

  以二八原则的思想来考虑,80%性能耗时由20%的代码引起,因此我们处理原则就是具体定位,具体问题,针对解决。

现象描述

  任务列表页面问题主要体现于加载任务列表过慢的性能低效问题,就如上一篇所说的加载事件需要11秒!这种对于用户来说是不能忍受的,特别是以现状JOB触发的方式时效如此低,用户多看两次,估计就会有放弃该产品的冲动。

  因此我们需要遵守3秒钟原则。

3秒钟原则

  现代人的生活节奏都很快,网页间的切换速度也越来越快。所谓“3秒钟原则”,就是要在极短的时间内展示重要信息,给用户留下深刻的第一印象。当然,这里的3秒只是一个象征意义上的快速浏览表述,在实际浏览网页的时候,并非真的严格遵守3秒。

  因此,在设计互联网产品的页面时,用户等待时间越少,用户体验越好

优化实施

  任务列表页面为以信息展示的读操作为主,因此对于 I/O 密集型程序,问题主要体现于两点:

  1. 慢查询语句

  2. 多次建立查询

多次建立查询

  该问题主要从代码实现方式上解决,场景又分为两种情况:

信息重复查询

  描述:函数 A 查询了一次 Users 信息,其函数 A 的子函数 B 又进行了一次查询了一次Users 信息。

  解决方案:去除子函数 B 的重复查询,并提供参数由函数 A 传入

遍历查询

  描述:item.foreach(item=> _userIdRespository.Get(a=>userId == item.userId) )

  解决方案:先批量查询,然后在内存过滤。
  var userIds = item.Select(a=>a.UserId);
  var users = _userIdRespository.ToList(a=>userIds .Contains(a.userId));
  Item.foreach(item=>{
  Var user = users .where(a=>a.userId == item.userId)
  })

以上并不是什么特别牛逼的技术,但是往往是某些地方性能瓶颈点,而导致这样的原因也只有一点,贪方便。上遍历查询的例子看出,两种写法的代码量的确差了几行,但是在实际使用场景中性能会差几倍,而且随着业务的增长其差距越发的明显。

慢查询语句

  对可能出现慢查询的语句的进行日志埋点记录耗时(特别是手写 SQL 与复杂视图),定位后可与专业人士沟通优化,我们有DBA,因此我只要把问题定位到就好了。

  下面展示一个我在优化时候遇到一个的情况:

  优化前是查询一个复杂视图,因为查询没用到索引,单次查询了3.5秒,在生产环境还有遍历2次的情况,一个7秒。

  优化后将视图改成存储过程,并通过业务了解到一个用户只会查询出一条记录,重复查的情况,耗时直接降到120+毫秒

优化经历

  我刚完成这个需求二期上线,就收到加载慢的消息,整个优化过程并非一步到位的,主要分了三步:

  第一步,能立刻可预见的,比较低级的优化了,并将列表加载改成异步,因为需求已经上线了,要先唬住用户。

  第二步,把多次建立查询和部分已经在测试环境很慢的语句。优化完了之后发到了生产,快了2秒多,但是仍然不理想

  第三步,给所有有可能查询慢的地方都写上日志,后来定位到了好几个慢查询,其中上面是罪魁祸首。

  发布上线后,从原来的11秒耗时,降到1秒到2秒,细心的朋友会看见,在加载列表有一段UpdateUserTaskStatus的代码,这个是在读页面做更新操作,具体原因与分析放到下一篇进行讲解

结尾

   本篇主要讲解了我在优化页面加载性能过程中一些经历,当然想优化到极致还有更多做法,例如彻底的前后端分离,读缓存等等。

  然而我们需要在投入与产出比之间做出权衡,以有限的成本,使用朴实的技术,达到有效的目标效果。

原文地址: https://www.cnblogs.com/skychen1218/p/10320994.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.NET-记一次架构优化实战与方案-前端优化相关推荐

  1. .NET-记一次架构优化实战与方案-梳理篇

    前言 程序员输出是他敲写的代码,那么输入就是他思考好的设计.因此不做设计是不存在,设计只分优秀的设计和糟糕的设计.为了避免过度设计浪费成本,需要针对现有业务与问题进行展开.业务梳理是不可避免的. 优化 ...

  2. Linux性能优化实战: 套路篇-优化性能问题的一般方法(56)

    一.上节回顾 上一节,我带你一起梳理了,性能问题分析的一般步骤.先带你简单回顾一下. 我们可以从系统资源瓶颈和应用程序瓶颈,这两个角度来分析性能问题的根源. 从系统资源瓶颈的角度来说,USE 法是最为 ...

  3. 【优化】1276- 不错的前端优化手段

    前言 性能优化是一个项目发展到一定时期之后绕不开的话题,也是每个工程师心中永远在撩拨的刺. 总结一下常用的前端性能优化的方法,希望对大家有些帮助~. 性能可能带来的影响(贩卖焦虑警告❗️) 试想当你做 ...

  4. 【前端优化 Vue项目优化】 如何避免浏览器卡顿,实现性能优化cdn?

    提示:前端查漏补缺,仅代表个人观点. 文章目录 一.前言 二.前端优化方法 1. 减少请求,压缩文件 2. CSS和JavaScript管理 3. 设置内容缓存 4. 减少页面重定向 5. CDN网络 ...

  5. 浅析渲染引擎与前端优化

    本文以 Chrome 浏览器的内核 WebKit(更确切是 WebKit 分支 Blink,以下统称为 WebKit )为例,对渲染引擎如何展示页面做个简单.全面的了解. 本文主要是两方面内容: 浅析 ...

  6. 网站前端优化一些小经验

    /**  *作者:张荣华  *日期:2008-12-01  **/      乘着第3届d2论坛的顺利结束的秋风,我也来分享一下自己在前端优化方面的一些些小经验,其实这些经验本身都是来自yahoo的优 ...

  7. Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战

    Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战 一.写在前面 在Java生鲜电商平台平台中相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这 ...

  8. mysql参数优化步骤_MySQL架构优化实战系列4:SQL优化步骤与常用管理命令2(转)

    MySQL架构优化实战系列4:SQL优化步骤与常用管理命令 原文:http://dbaplus.cn/news-11-649-1.html 一.SQL语句优化步骤 1.查看MySQL状态及配置 sho ...

  9. 记webpack3.x版本远古老项目编译优化实战

    记webpack3.x版本远古老项目编译优化实战 本文内容只针对开发环境优化 生产环境可作参考 为何要优化? 每次执行npm run dev 需要等待24~28s,每次ctrl + s触发热更新需要等 ...

最新文章

  1. 从网页模版切图到网页生成全攻略(转)
  2. 洛谷——P3807 【模板】卢卡斯定理
  3. 定义进项税代码缺省值
  4. python大一知识点串讲_python-前20天的着重知识点
  5. 为什么Nginx性能比Apache高
  6. IBM推出云深度学习图形芯片Tesla P100 GPU加速器
  7. 云服务器mqtt协议,云服务器mqtt协议
  8. 各种抠图动态图片_不用手。自动、智能抠图,图片去背景
  9. Integrated Security = True和Integrated Security = SSPI有什么区别?
  10. hopfield tsp matlab,TSP问题—Hopfield神经网络算法
  11. js中Date函数获取今天星期几的方法
  12. 用Python画二元高次方程
  13. 一个nginx小白的vue项目部署的成功!
  14. javaScript中值传递和引用传递
  15. Tomato绕激活工具,支持两网信号/修复通知/游戏机
  16. PT100三线制恒流源接法
  17. 计算机多媒体应用技术ppt课件ppt,多媒体计算机技术原理及应用十二课件.ppt
  18. NEU 1690 (最短路+LCA)
  19. (数据结构)树的双亲表示法
  20. 基于黄金正弦与自适应融合的蜉蝣优化算法

热门文章

  1. mysql两种引擎的适用场景_MySQL两种引擎的区别和应用场景
  2. 16-djongo中间件学习
  3. vue实现todo功能(一):搭建vue-webpack环境
  4. 技术贴:触摸屏(TP)技术交流
  5. HelloSilverlight
  6. UILabel自适应高度和自动换行
  7. 修炼九阴真经Windows Phone开发 (7):本地化应用程序栏Localizing an Application Bar 下...
  8. MYSQL 表的修复(不断更新)
  9. 接口返回json对象出现套娃递归问题 | System.Text.Json 版本
  10. 【C#/.NET】.NET6中全局异常处理