代码优化

剖析netty启动过程

依然范特西╮ 提交于 2020-01-10 05:23:32
1、总体看一下源代码 启动类源码 // Configure the server. EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 100) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); if (sslCtx != null) { p.addLast(sslCtx.newHandler(ch.alloc())); } //p.addLast(new

WebView性能、体验分析与优化

我怕爱的太早我们不能终老 提交于 2020-01-09 01:03:26
在App开发中,内嵌WebView始终占有着一席之地。它能以较低的成本实现Android、iOS和Web的复用,也可以冠冕堂皇的突破苹果对热更新的封锁。 然而便利性的同时,WebView的性能体验却备受质疑,导致很多客户端中需要动态更新等页面时不得不采用其他方案。 以发展的眼光来看,功能的动态加载以及三端的融合将会是大趋势。那么如何克服WebView固有的问题呢?我们将从性能、内存消耗、体验、安全几个维度,来系统的分析客户端默认WebView的问题,以及对应的优化方案。 性能 对于WebView的性能,给人最直观的莫过于:打开速度比native慢。 是的,当我们打开一个WebView页面,页面往往会慢吞吞的loading很久,若干秒后才出现你所需要看到的页面。 这是为什么呢? 对于一个普通用户来讲,打开一个WebView通常会经历以下几个阶段: 交互无反馈 到达新的页面,页面白屏 页面基本框架出现,但是没有数据;页面处于loading状态 出现所需的数据 如果从程序上观察,WebView启动过程大概分为以下几个阶段: 如何缩短这些过程的时间,就成了优化WebView性能的关键。 接下来我们逐一分析各个阶段的耗时情况,以及需要注意的优化点。 WebView初始化 当App首次打开时,默认是并不初始化浏览器内核的;只有当创建WebView实例的时候,才会创建WebView的基础框架。

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进行过操作

JS代码优化小技巧

风格不统一 提交于 2020-01-08 10:03:43
下面介绍一种JS代码优化的一个小技巧,通过动态加载引入js外部文件来提高网页加载速度 【基本优化】 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完成页面渲染而不会造成页面堵塞问题,这个大家都懂的。 【合并JS代码,尽可能少的使用script标签】 最常见的方式就是带代码写入一个js文件中,让页面只使用一次<script></script>标签来引入 【无堵塞加载JS】 通过给script标签增加 defer属性或者是 async 属性来实现 <script src="file.js" defer ></script> 注解: async 和 defer 不同之处是 async 加载完成后会自动执行脚本, defer 加载完成后需要等待页面也加载完成才会执行代码 【动态创建script来加载-推荐】 function loadJS( url, callback ){ var script = document.createElement('script'), fn = callback || function(){}; script.type = 'text/javascript'; //IE if(script.readyState){ script.onreadystatechange = function(){ if( script

编译到底做了什么(***.c -> ***.o的过程)

风格不统一 提交于 2020-01-08 04:32:42
(第一次写博客,好激动的说.......) 我们知道,一个程序由源代码到可执行文件往往由这几步构成: 预处理(Prepressing)-> 编译(Compilation)-> 汇编(Assembly)-> 链接(Linking)。 编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分。那么,这个核心部分究竟做了什么呢。 各位看官容我挽起袖子,且听我娓娓道来。 编译器做了什么? 从最直观的角度来说,编译器就是将高级语言翻译成机器语言的一个工具。 以 C语言为例,解释一下 ***.c -> ***.o 的过程。 假设test.c有下面一段代码 array[index] = (index + 4) * (2 + 6); 下面就来谈谈这个表达式是如何翻译成机器语言的过程。 这个过程主要有如下五步,看起来好长的样子,看官需静下心来慢慢看。。。。 1.词法分析 -- 将源代码字符序列分割成一系列的记号 源代码程序被输入到扫描器(Scanner)。 扫描器的任务就是:运用一种有限状态机(Finite State Machine)的算法,将源代码字符序列分割成一系列的记号(Token)。还有一些其他工作(将标识符放到符号表,将数字、字符串放到文字表中) 如下图(因为表格换页了,所以拍出来是这个样子,望海涵)

干货!SQL性能优化,书写高质量SQL语句

回眸只為那壹抹淺笑 提交于 2020-01-07 20:40:48
写SQL语句的时候我们往往关注的是SQL的执行结果,但是是否真的关注了SQL的执行效率,是否注意了SQL的写法规范? 以下的干货分享是在实际开发过程中总结的,希望对大家有所帮助! 1. limit分页优化 当偏移量特别大时,limit效率会非常低。 SELECT id FROM A LIMIT 1000,10 很快 SELECT id FROM A LIMIT 90000,10 很慢 方案一: select id from A order by id limit 90000,10; 复制代码 如果我们结合order by使用。很快,0.04秒就OK。 因为使用了id主键做索引! 当然,是否能够使用索引还需要根据业务逻辑来定,这里只是为了提醒大家,在分页的时候还需谨慎使用! 方案二 select id from A order by id between 90000 and 90010; 复制代码 2.利用limit 1 、top 1 取得一行 有些业务逻辑进行查询操作时(特别是在根据某一字段DESC,取最大一笔).可以使用limit 1 或者 top 1 来终止[数据库索引]继续扫描整个表或索引。 反例 SELECT id FROM A LIKE 'abc%' 复制代码 正例 SELECT id FROM A LIKE 'abc%' limit 1 复制代码 3. 任何情况都不要用

C中的volatile用法

可紊 提交于 2020-01-05 04:47:36
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如: volatile int i=10; int j = i; ... int k = i; volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 而 优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果 i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。 /********************** 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1) 并行设备的硬件寄存器(如:状态寄存器) 2) 一个中断服务子程序中会访问到的非自动变量(Non

c 语言 volatile 关键字

∥☆過路亽.° 提交于 2020-01-05 04:15:16
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。对常规内存进行优化的时候,这些优化是透明的,而且效率很好。由编译器优化或者硬件重新排序引起的问题的解决办法是在从硬件(或者其他处理器)的角度看必须以特定顺序执行的操作之间设置内存屏障(memory barrier), Linux 提供了一个宏解决编译器的执行顺序问题。 void Barrier(void) 这个函数通知编译器插入一个内存屏障,但对硬件无效,编译后的代码会把当前CPU寄存器中的所有修改过的数值存入内存,需要这些数据的时候再重新从内存中读出。 2.volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码。但有时这些优化不是程序所需要的

Debug与Release版本的区别

房东的猫 提交于 2020-01-05 02:33:35
  Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当然也可以提供其他的模式,例如自己定义一组编译选项,然后命名为MY_ABC等。习惯上,我们仍然更愿意使用VC已经定义好的名称。   Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于 ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而 Release版本需要MFC42.DLL支持。Release不对源代码进行调试,不考虑MFC的诊断宏,使用的是 MFC Release库,编译时对应用程序的速度进行优化,而Debug则正好相反,它允许对源代码进行调试,可以定义和使用MFC的 诊断宏,采用MFC Debug库,对速度没有优化。   既然Debug和 Release仅仅是编译选项的不同,那么为什么要区分Debug和Release版本呢?   Debug和Release,在我看来主要是针对其面 向的目标不同的而进行区分的。Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息

《JavaScript 代码优化指南》

最后都变了- 提交于 2020-01-05 02:31:54
~~教你向老鸟一样敲代码~~。 1. 将脚本放在页面的底部 ... <script src="./jquery.min.js"></script> <script src="./index.js"></script> </body> </html> 2. 变量声明合并   将多条var语句合并为一条语句,我建议将未赋值的变量放在最后面。   并且为了代码的美观,还可以将等号对齐。 //糟糕 var oBtn = document.getElementById('button'); var name = ''; var index; var oLis = document.getElementsByTagName('li'); var result = [1,2,3,4]; var i; //建议 var oLis = document.getElementsByTagName('li'), oBtn = document.getElementById('button'), result = [1,2,3,4], name = '', index, j;    3. 减少全局变量   减少全局变量,并不是说不定义全局变量,而是我们可以定义一个对象,来保存我们定义的全局变量。   我称这个对象为变量空间。 //不推荐 var global = 'This is global