性能优化

Web业务性能优化技术总结

与世无争的帅哥 提交于 2019-12-13 20:08:09
前言 Web业务的性能优化是一个系统工程,既有深度,又有广度。以下所简称性能均特指Web业务性能。 技术的广度上,主要从大背景下考虑到其各个相关方,基于共同的数据指标发掘和评估方案。 技术的深度上是一个渐进和迭代的过程。可以从性能的本质展到目前各端的主要优化方向。 性能的本质 性能的本质是快速传播, 要素是内容(数据)和流程,效果是:完备、快速。完备不是完整,而是接受的信息要一致,没有歧义。流程是内容处理的过程和方法。 流程从广义上看来源于后台服务器,以网络和客户端为媒介,以页面形式到达用户。落到各端,又可以再次细分为不同的内容和流程,层层拆解。 性能优化就是保障快速传播内容,可以概括为四个流程和三类方法。其中四个流程是指: 衡量: 设定指标,建立监控。 识别: 识别和梳理出整体到局部对各个层级的内容(数据)及流程。 实施: 针对性的进行优化。 评估和监控: 通过数据评估是否达成预期,并做定期监控。 各端实施前先理解全业务视角下的内容和流程,以及各自内部的内容和流程。以下为目前识别出的各端内容(数据)及流程: 各端 内容(数据) 流程 整体 页面资源 后台服务 (图片服务) -> 浏览器(客户端) 后台 页面资源 列表内容 页端接口 1.架构 (接入/Docker/爬虫/CDN) 2.发布上线流程 3.内容请求及响应流程(可继续细分, 涉及部署) …… 图片服务 图片 1

vue性能优化

大城市里の小女人 提交于 2019-12-12 23:58:19
最近用vue-cli3搭建项目,由于项目比较大,业务逻辑比较多,导致了打包后文件比较大,导致首页页面白屏时间过长,用户体验不友好,可以往下面几个方法进行处理。 js,css代码的最小化压缩和分割 核心组件的cdn加载 路由和组件懒加载 gzip的压缩 去除console.log 公共代码抽离 js,css代码的最小化压缩和分割 核心组件的cdn加载 根目录的vue.config.js 配置修改 // 修改原生webpack配置 chainWebpack:(config)=>{} // webpack配置 const isProduction = process . env . NODE_ENV === 'production' ; if ( isProduction ) { // 压缩代码 config . optimization . minimize ( true ) ; // 分割代码 config . optimization . splitChunks ( { chunks : 'all' } ) //核心组件生产环境外部引入cdn var externals = { 'vue' : 'Vue' , 'vuex' : 'Vuex' , 'vue-router' : 'VueRouter' , 'axios' : 'axios' , 'iview' : 'iview' ,

多库取数的性能优化方案

最后都变了- 提交于 2019-12-12 09:40:21
当数据库表数据量较大时,报表性能往往不高,此时仅针对 SQL 或报表端进行优化,效果往往不明显。这种情况下要显著提升性能,可以考虑采用并行多库的方式,即采用一定规则(如时间)将数据分库分段存储,而报表同时访问多个数据库进行数据计算,最后在报表中进行汇总展现。 不过,一般报表工具并不具备这种并行取数汇总的能力,因此访问多个数据库读取分段数据就需要借助 Java 等高级语言完成,而使用 Java 编写这样的并行程序也并不简单,更何况 Java 本身也缺乏对批量数据计算的基础支持,不支持表达式参数和动态数据结构。凡此种种,使得一般报表工具难以直接使用并行多库的方式提升性能。 本文介绍的润乾报表内置了专门用于数据计算的集算引擎,所提供的并行计算能力允许用户从多个数据库中同时读取数据并在报表端进行汇总展现,从而简单快捷地提升报表性能。 (注:并行多库功能需要结合集算器实现。) 下面通过一个例子简单说明并行多库的使用方法(以 mysql 为例),更多实现细节可以参考润乾报表的相关文档资料: 某电信企业为了提高报表性能,计划将用户服务使用信息按照统计地区分库存储在 4 个 mysql 数据库中,信息统计报表根据指定时间段、品牌等条件过滤查询后,汇总数据。使用润乾报表进行并行分库查询的步骤如下: 1 使用集算器编写并行脚本,实现从多个数据库取数后汇总结果。 并行脚本: A B 1 [mysql1

PostgreSQL 参数调整(性能优化)

怎甘沉沦 提交于 2019-12-11 23:26:55
PostgreSQL 参数调整(性能优化) https://www.cnblogs.com/VicLiu/p/11854730.html 知道一个 shared_pool 文章写的挺好的 还没仔细看 昨天分别在外网和无外网环境下安装PostgreSQL,有外网环境下安装的相当顺利。但是在无外网环境下就是两个不同的概念了,可谓十有八折。感兴趣的同学可以搭建一下。 PostgreSQL安装完成后第一件事便是做相关测试,然后调整参数。 /*CPU 查看CPU型号*/ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c /*查看物理CPU个数*/ cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l /*查看逻辑CPU个数*/ cat /proc/cpuinfo | grep "processor" | wc -l /*查看CPU内核数*/ cat /proc/cpuinfo | grep "cpu cores" | uniq /*查看单个物理CPU封装的逻辑CPU数量*/ cat /proc/cpuinfo | grep "siblings" | uniq /*计算是否开启超线程 ##逻辑CPU > 物理CPU x CPU核数 #开启超线程 ##逻辑CPU = 物理CPU

Tomcat 8 性能优化

巧了我就是萌 提交于 2019-12-11 12:08:38
本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。 目的 通过Tomcat性能优化可以提高网站的并发能力。 Tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对Tomcat的优化也变得非常重要了。 对于Tomcat的优化,主要是从2个方面入手,一是Tomcat自身的配置,另一个是Tomcat所运行的jvm虚拟机的调优。 服务器资源 服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。硬件我们不说了,这个方面是钱越多越好是吧。 一、Tomcat配置优化 Linux环境安装运行Tomcat8 具体的安装步骤可以参考Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项 如果需要登录系统,必须配置tomcat用户,在安装完Tomcat后,进行如下操作 在/conf/tomcat-users.xml文件中的标签里面添加如下内容 <role rolename="manager"/> <role rolename="manager-gui"/> <role rolename=

JVM性能优化--Java的垃圾回收机制

心不动则不痛 提交于 2019-12-11 10:49:21
一、Java内存结构 1、Java堆(Java Heap)   java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。   java堆是垃圾收集器管理的主要区域,因此也被成为“GC堆”(Garbage Collected Heap)。从内存回收角度来看java堆可分为:新生代和老生代。从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。无论怎么划分,都与存放内容无关,无论哪个区域,存储的都是对象实例,进一步的划分都是为了更好的回收内存,或者更快的分配内存。   根据Java虚拟机规范的规定,java堆可以处于物理上不连续的内存空间中。当前主流的虚拟机都是可扩展的(通过 -Xmx 和 -Xms 控制)。如果堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。 2、Java虚拟机栈(Java Virtual Machine Stacks)   java虚拟机也是线程私有的,它的生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧

Android性能优化--启动优化

自闭症网瘾萝莉.ら 提交于 2019-12-10 18:01:50
1. 前言 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。本文会通过以下几个方面来介绍应用启动的相关指标和优化,提供应用的启动速度。 整体文章思路如下: 2. 冷启动&热启动 通常来说,启动方式分为两种:冷启动和热启动。 **冷启动:**当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。 **热启动:**当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。 两者之间的特点如下: 冷启动:系统会重新创建一个新的进程分配给该应用,从Application创建到UI绘制等相关流程都会执行一次。 热启动:应用还在后台,因此该启动方式不会重建Application,只会重新绘制UI等相关流程。 冷热启动时间的计算命令: adb shell am start -W [packageName]/[packageName.XxxActivity] 参数说明: 1、ThisTime:一般和TotalTime时间一样

Android应用性能优化之使用SparseArray替代HashMap

萝らか妹 提交于 2019-12-10 16:17:39
HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果。最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performance 警告。 意 思就是说用SparseArray<E>来替代,以获取更好性能。老实说,对SparseArray并不熟悉,第一感觉应该是Android 提供的一个类。按住Ctrl点击进入SparseArray的源码,果不其然,确定是Android提供的一个工具类。 单纯从字面上来理解,SparseArray指的是 稀疏数组(Sparse array) ,所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。 假设有一个9*7的数组,其内容如下: 在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用稀疏数组重新来定义这个数组: 其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。 继续阅读SparseArray的源码

Android应用性能优化之使用SparseArray替代HashMap

泄露秘密 提交于 2019-12-10 16:02:15
HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果。最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performance 警告。 意 思就是说用SparseArray<E>来替代,以获取更好性能。老实说,对SparseArray并不熟悉,第一感觉应该是Android 提供的一个类。按住Ctrl点击进入SparseArray的源码,果不其然,确定是Android提供的一个工具类。 单纯从字面上来理解,SparseArray指的是 稀疏数组(Sparse array) ,所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。 假设有一个9*7的数组,其内容如下: 在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用稀疏数组重新来定义这个数组: 其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。 继续阅读SparseArray的源码

中文分词算法 之 词典机制性能优化与测试

夙愿已清 提交于 2019-12-10 07:03:08
在之前的两篇博文 中文分词算法 之 基于词典的正向最大匹配算法 和 中文分词算法 之 基于词典的逆向最大匹配算法 中,我们对 分词实现 和 词典实现 都做了优化,本文对词典实现做进一步优化,并和之前的多个实现做一个对比,使用的词典 下载地址 ,使用的测试文本 下载地址 。 优化TrieV3的关键在于 把虚拟根节点(/)的子节点(词表首字母)提升为多个相互独立的根节点,并对这些根节点建立索引 。优化的依据是 根节点(词表首字母)的数量庞大,索引查找的速度远远超过二分查找 。 下面看看进一步优化后的TrieV4和之前的TrieV3的对比: /** * 获取字符对应的根节点 * 如果节点不存在 * 则增加根节点后返回新增的节点 * @param character 字符 * @return 字符对应的根节点 */ private TrieNode getRootNodeIfNotExistThenCreate(char character){ TrieNode trieNode = getRootNode(character); if(trieNode == null){ trieNode = new TrieNode(character); addRootNode(trieNode); } return trieNode; } /** * 新增一个根节点 * @param