优化

性能优化-JVM字节码

风格不统一 提交于 2020-01-16 03:27:26
2、JVM字节码 前面我们通过tomcat本身的参数以及jvm的参数对tomcat做了优化,其实要想将应用程 序跑的更快、效率更高,除了对tomcat容器以及jvm优化外,应用程序代码本身如果写的效率不高的,那么也是不行的,所以,对于程序本身的优化也就很重要了。 对于程序本身的优化,可以借鉴很多前辈们的经验,但是有些时候,在从源码角度方面 分析的话,不好鉴别出哪个效率高,如对字符串拼接的操作,是直接“+”号拼接效率高还是使用StringBuilder效率高? 这个时候,就需要通过查看编译好的class文件中字节码,就可以找到答案。 我们都知道,java编写应用,需要先通过javac命令编译成class文件,再通过jvm执行,jvm执行时是需要将class文件中的字节码载入到jvm进行运行的。 2.1、通过javap命令查看class文件的字节码内容 首先,看一个简单的Test1类的代码: 通过javap命令查看class文件中的字节码内容: 查看Test1.txt文件,内容如下: Classfile /F:/code/itcast‐jvm/itcast‐jvm‐ test/target/classes/cn/itcast/jvm/Test1.class Last modified 2018‐9‐27; size 577 bytes MD5 checksum

【认知篇】Oracle的直方图是个嘛,能干啥?

别来无恙 提交于 2020-01-15 16:34:56
【引言】 在Oracle中直方图是一种对数据分布质量情况进行描述的工具。它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择。在某些情况下,表的列中的数值分布将会影响优化器使用索引还是执行全表扫描的决策。 构造直方图最主要的原因:是帮助优化器在表中数据严重偏斜时做出更好的规划 直方图是一种统计学上的工具,并非Oracle专有,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图。 当where 子句的值具有不成比例数量的数值时,将出现这种情况,使得全表扫描比索引访问的成本更低。这种情况下如果where 子句的过滤谓词列之上有一个合理的正确的直方图,将会对优化器做出正确的选择发挥巨大的作用,使得SQL语句执行成本最低从而提升性能。 在分析表或索引时,直方图用于记录数据的分布。通过获得该信息,基于成本的优化器就可以决定使用将返回少量行的索引,而避免使用基于限制条件返回许多行的索引。直方图的使用不受索引的限制,可以在表的任何列上构建直方图。 构造直方图最主要的原因就是帮助优化器在表中数据严重偏斜时做出更好的规划 。如果一到两个值构成了表中的大部分数据

nginx简单优化及模块介绍

混江龙づ霸主 提交于 2020-01-15 04:25:46
先源码安一下nginx 点击下载源码包 解压 tar xfz nginx-1.16.1.tar.gz 安装依赖 yum -y install gcc gcc-c++ pcre-devel zlib-devel 源码安装 cd nginx-1.16.1/ ./configure && make && make install 启动一下访问一下 /usr/local/nginx/sbin/nginx 进入配置文件 vim /usr/local/nginx/conf/nginx.conf 隐藏版本号 放到httpd模块中 server_tokens off ; 在平滑重启查看 /usr/local/nginx/sbin/nginx -s reload worker_processes 8 ; 优化nginx worker进程数 ( 8是CPU的倍数 ) worker_rlimit_nofile 65535 ; 优化nginx worker进程最大打开文件数 worker_connections 65535 ; 优化nginx worker单个进程允许的最大连接数 sendfile on ; 开启高效文件传输模式 放在http模块 keepalived_timeout 65 ; 优化nginx连接超时时间 gzip on ; nginx图片压缩 nginx配置文件详解 主要模块: main

C++ volatile的作用

不想你离开。 提交于 2020-01-14 01:46:35
volatile的作用 2006-10-23 13:44:21 大 中 小 关键在于两个地方: 1. 编译器的优化 (请高手帮我看看下面的理解) 在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值; 当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致 当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致 当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致 举一个不太准确的例子: 发薪资时,会计每次都把员工叫来登记他们的银行卡号;一次会计为了省事,没有即时登记,用了以前登记的银行卡号;刚好一个员工的银行卡丢了,已挂失该银行卡号;从而造成该员工领不到工资 员工 -- 原始变量地址 银行卡号 -- 原始变量在寄存器的备份 2. 在什么情况下会出现(如1楼所说) 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 补充: volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人; “易变”是因为外在因素引起的

APP流畅度优化做得再好,怎么防止同事在代码里面“下毒”再次劣化呢?

霸气de小男生 提交于 2020-01-13 18:04:59
概述 我们产线的主流程页面中有几个比较复杂的页面在版本迭代中流畅度频繁出现反复,经常由于开发的不注意导致变卡,主要是对流畅度缺少必要的监控和可持续的优化手段,这个系列是对上半年实践App流畅度监控、优化过程中的一点总结,希望可以给需要的同学一点小参考。 整个系列将主要包括以下几部分: 1、卡顿与View的绘制过程解析 这部分内容比较多,主要是从源码层面解析一下整个过程,也是我们后面做流畅度监控与优化的基础 2、Debug阶段如何对实时帧率进行监控和显示 根据上面的原理,设计一个显示实时帧率的工具,可以有效的在开发阶段发现问题 3、如何实现流畅度自动化测试 实现一个流畅度UI自动化测试,在上线前跑一下UI自动化并生成流畅度报表邮件给相关人员 4、线上的用户流畅度的监控方案 实时反映真实用户的流畅度体验,线上庞大的数据可以敏感的反应出版本迭代间流畅度的变化 5、实现一个方便排查高耗时方法的工具 利用自定义gradle plugin+ASM插桩实现快速而准确的找出耗时的方法,进行针对性的优化 6、分享提升app流畅度的一些经验 分享一些成本小收益高的提升流畅度的方案 工欲善其事必先利其器,今天首先分享一下在优化页面流畅度过程中自己实现的一个方便快速排查高耗时方法的工具: MethodTraceMan ,毕竟保持主流程流畅,避免在主流程执行高耗时方法永远是优化卡顿最直接的手段

gcc 不同优化等级

我只是一个虾纸丫 提交于 2020-01-11 22:37:41
默认的编译方法 gcc - S a . c - o a . s 选择不同的优化等级: gcc - o1 - S a . c - o a2 . s //-o表示输出,可自定义输出文件的命名 优化等级越高,所需时间越长,但程序运行起来一般会更高效,下面有对比 默认优化: O2优化: 来源: CSDN 作者: 岚月丶 链接: https://blog.csdn.net/a10201516595/article/details/103939484

mysql优化总结

允我心安 提交于 2020-01-11 03:45:07
1.数据库的对象: 1)优化表的类型: 2) 数据库表设计时候更小的占磁盘空间尽可能使用更小的整数类型.(mediumint就比int更合适) 3) 所有字段都得有默认值 4) 选择合适表类型(InnoDB或者myisam) 2,优化sql语句: 1)通过show status了解各种sql的执行频率 show status like 'Com_%' 了解 Com_select,Com_insert 的执行次数 2) 通过Explain分析低效的sql语句 3) 建立合适的索引 4) 通过show status like 'Handler_%'查看索引的使用情况 handler_read_key表明索引效率的很高 Handler_read_rnd_key的值很高,表明查询运行效率很低 5) 定期分析表和检查表 analyze table test_table和check table test_table 然后查看Msg_text字段的值是否是ok 6)定期优化表 optimize table test_table 如果对表的字段varchar blob,text等进行了很多更改, 则撒花用 7) 优化 order by orgroup by等3,锁的问题 1) MyISAM为表级锁 由于MyISAM写进程优先获得锁,使得读锁请求靠后等待队列

C中的volatile用法

女生的网名这么多〃 提交于 2020-01-09 00:29:50
.volatile的本质: 1> 编译器的优化 在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。 当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。 当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。 2>volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人。 volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如: volatile int i=10; int j = i; ... int k = i; volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 而 优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作

优化SQL查询:如何写出高性能SQL语句

半世苍凉 提交于 2020-01-07 20:48:53
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 2、 统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。 select*from dual select*From dual 3、 不要把SQL语句写得太复杂 我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。 一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,我可以保证数据库也会晕的。 另外,执行计划是可以被重用的,越简单的SQL语句被重用的可能性越高。而复杂的SQL语句只要有一个字符发生变化就必须重新解析,然后再把这一大堆垃圾塞在内存里。可想而知,数据库的效率会何等低下。 4、 使用“临时表”暂存中间结果 简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了

如何提高网页的加载速度

与世无争的帅哥 提交于 2020-01-07 14:09:09
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 加快网页的加载速度,无疑是提高用户体验的一个很好的方法。但是这里我们如何提高网页的加载速度呢?这里我总结了几点。 当然,这也是我第一天上班来的第一个任务。。。 1、使用良好的结构 比如说XHTML具有很大的优势,至少你的页面会更加的符合标准!但是他大量的使用了标记(<start> , <end>等),而这就意味着浏览器需要下载更多的代码,所以尝试在你的页面中使用较少的XHTML,减少页面的大小。 2、尽量减少HTTP的请求次数 终端用户响应的时间中,有80%用于下载各项内容。这部分时间包括下载页面中的图像、样式表、脚本、Flash等。通过减少页面中的元素可以减少HTTP请求的次数。这是提高网页速度的关键步骤。 减少页面组件的方法其实就是简化页面设计。那么有没有一种方法既能保持页面内容的丰富性又能达到加快响应时间的目的呢?这里有几条减少HTTP请求次数同时又可能保持页面内容丰富的技术。 合并文件是通过把所有的脚本放到一个文件中来减少HTTP请求的方法,如可以简单地把所有的CSS文件都放入一个样式表中。当脚本或者样式表在不同页面中使用时需要做不同的修改,这可能会相对麻烦点,但即便如此也要把这个方法作为改善页面性能的重要一步。 3、优化网页图片文件 你的网页一定有图片,加载一个网页往往图片的总尺寸是最大的