性能优化

性能优化处理CPU快慢问题

℡╲_俬逩灬. 提交于 2019-12-06 06:53:14
经常听到有人说磁盘很慢、网络很卡,这都是站在人类的感知维度去表述的,比如拷贝一个文件到硬盘需要几分钟到几十分钟,够我去吃个饭啦;而从网络下载一部电影,有时候需要几个小时,我都可以睡一觉了。 最为我们熟知的关于计算机不同组件速度差异的图表,是下面这种金字塔形式:越往上速度越快,容量越小,而价格越高。这张图只是给了我们一个直观地感觉,并没有对各个速度和性能做出量化的说明和解释。而实际上,不同层级之间的差异要比这张图大的多。这篇文章就让你站在 CPU 的角度看这个世界,说说到底它们有多慢。 数据 先来看看 CPU 的速度,就拿我的电脑来说,主频是 2.6G,也就是说每秒可以执行 2.6*10^9 个指令,每个指令只需要 0.38ns(现在很多个人计算机的主频要比这个高,配置比较高的能达到 3.0G+)。我们把这个时间当做基本单位 1s,因为 1s 大概是人类能感知的最小时间单位。 一级缓存读取时间为 0.5ns,换算成人类时间大约是 1.3s,大约一次或者两次心跳的时间。这里能看出缓存的重要性,因为它的速度可以赶上 CPU,程序本身的 locality 特性加上指令层级上的优化,cache 访问的命中率很高,这最终能极大提高效率。 分支预测错误需要耗时 5ns,换算成人类时间大约是 13s,这个就有点久了,所以你会看到很多文章分析如何优化代码来降低分支预测的几率,比如下面这个得分非常高的

PHP性能优化利器:生成器 yield理解

耗尽温柔 提交于 2019-12-06 06:29:56
优点 直接讲概念估计你听完还是一头雾水,所以我们先来说说优点,也许能勾起你的兴趣。那么生成器有哪些优点,如下: 生成器会对PHP应用的性能有非常大的影响 PHP代码运行时节省大量的内存 比较适合计算大量的数据 那么,这些神奇的功能究竟是如何做到的?我们先来举个例子。 概念引入 首先,放下生成器概念的包袱,来看一个简单的PHP函数: 1 <?php 2 3 function createRange($number){ 4 $data = []; 5 for($i=0;$i<$number;$i++){ 6 $data[] = time(); 7 } 8 return $data; 9 } 10 echo "起始时间:".date('H:i:s')."<br>"; 11 $result = createRange(12345678); // 这里调用上面我们创建的函数 12 foreach($result as $value){ 14 echo $value.'<br />'; 15 } 16 echo "结束时间:".date('H:i:s')."<br>"; 如上代码我们得到的是一个什么样的结果呢! 相信程序员们一看都明白,让我们上图看结果 我们可以看到,内存超了,因为我们在调用 函数 createRange 的时候,计算机已经是将数据全部存储至内存中,然后进行遍历;下面我们再看

【前端性能优化】高性能JavaScript整理总结

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 05:27:41
高性能JavaScript整理总结 关于前端性能优化:首先想到的是 雅虎军规34条 然后最近看了《高性能JavaScript》 大概的把书中提到大部分知识梳理了下并加上部分个人理解 这本书有参考雅虎特别性能小组的研究成果,所以跟34 军规有很多相似之处 有不当之处请在评论区指正,感谢~ 约定 :很多单词语法都是简写比如doc指document,点点点代表不重要代码省略,码字不易(/双手合十) 1. 加载和执行 JavaScript是单线程,所以JavaScript的加载和执行是从上至下加载执行完一个再继续加载执行下一个文件,会阻塞页面资源的加载,所以一般情况下JavaScript文件放在body标签 内 底部,很多后端开发人员放在body标签外下面,这样做不好的地方有两处:1、不规范 2、 可能 会造成js获取不到页面元素而导致报错。而放在body标签内底部可以确保js执行前页面渲染完成  <body> js... //正确 </body> <!-----------------------分界线----------------------------> <body> </body> js... //错误 合并脚本,每个<script>标签初始化下载都会阻塞页面渲染,所以减少页面的<script>标签数量可以起到优化作用,内嵌脚本外链脚本通用,另外HTTP会带来的额外的性能消耗

Spark性能优化

[亡魂溺海] 提交于 2019-12-06 03:09:44
Spark性能优化 1)避免创建重复RDD 2)尽可能复用同一个RDD 3)对多次使用的RDD进行持久化 4)尽量避免使用shuffle类算子 5)使用map-side预聚合的shuffle操作 6)使用高性能的算子 7)广播大变量 8)使用Kryo优化序列化性能 9)优化数据结构 10)资源参数调优 1)避免创建重复RDD ​ 对于同一份数据,只应该创建一个RDD,不能创建多个RDD来代表同一份数据。 2)尽可能复用同一个RDD ​ 除了要避免在开发过程中对一份完全相同的数据创建多个RDD之外,在对不同的数据执行算子 操作时还要尽可能地复用一个RDD。比如说,有一个RDD的数据格式是key-value类型的,另 一个是单value类型的,这两个RDD的value数据是完全一样的。那么此时我们可以只使用key-value类型的那个RDD,因为其中已经包含了另一个的数据。对于类似这种多个RDD的数据有重叠或者包含的情况,我们应该尽量复用一个RDD,这样可以尽可能地减少RDD的数量,从而尽可能减少算子执行的次数。 3)对多次使用的RDD进行持久化 Spark中对于一个RDD执行多次算子的默认原理是这样的:每次你对一个RDD执行一个算子操作时,都会重新从源头处计算一遍,计算出那个RDD来,然后再对这个RDD执行你的算子操作。因此对于这种情况,建议是:对多次使用的RDD进行持久化

程序性能优化之APK大小优化(六)下篇

馋奶兔 提交于 2019-12-06 02:49:06
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将继续从微信资源混淆AndResGuard原理来介绍APK大小优化: 微信的AndResGuard工具是用于Android资源的混淆,作用有两点:一是通过混淆资源ID长度同时利用7z深度压缩,减小了apk包大小;二是混淆后在安全性方面有一点提升,提高了逆向破解难度。本文从源码角度,来探寻AndResGuard实现原理。 阅读本文需要前提知识:掌握Android应用程序打包编译过程,尤其是对资源的编译和打包过程;熟悉resource.arsc文件格式。 推荐罗升阳文章: http://blog.csdn.net/luoshengyang/article/details/8744683 微信资源混淆工具源码地址: https://github.com/shwenzhang/AndResGuard 附上来自网络神图: ​ 0、程序入口CliMain.main() 该函数处理命令行参数、并解析自定义配置文件,混淆工具可以根据配置项进行特定处理,具体参考config.xml内容,针对其中特定内容,我们会在后面提到。然后进入真正混淆的入口函数resourceProgurad() 特别说明一下解析Configuration中关键点

程序性能优化之网络传输与数据存储优化(五)上

霸气de小男生 提交于 2019-12-06 02:48:21
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将先从google protobuf来介绍网络传输与数据存储优化: 简介 protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。 protobuf在各种rpc的实现上都占据重要角色。 优点  性能好/效率高  代码生成机制  支持“向后兼容”和“向前兼容”  支持多种编程语言 缺点  应用不够广(相比xml和json)  二进制格式导致可读性差  缺乏自描述 安装  github源代码下载地址: https://github.com/google/protobuf 源码包中的src/README.md, 有详细的安装说明,安装过程如下: 1、解压压缩包:unzip protobuf-master.zip

程序性能优化之内存优化(三)上篇

☆樱花仙子☆ 提交于 2019-12-06 02:45:42
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将继续从以下两个内容来介绍内存优化: [内存抖动] [内存泄漏] <meta charset="utf-8"> 其实大多数App或多或少都存在一定的内存泄漏情况,这些内存泄漏可能存在于特定的运行环境时才会发生。而内存泄漏堆积会引发严重后果OOM。内存抖动是指内存频繁地分配和回收,而频繁的gc会导致卡顿,严重时和内存泄漏一样会导致OOM。 接下来我们一起讨论该如何查看以及解决这部分问题思路。 一、内存泄漏 内存泄露是指程序中间动态分配了内存,但在程序结束时没有释放这部分内存,从而造成那部分内存不可用的情况,重启计算机可以解决,但也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。 简单点说:应该被释放的资源没有被释放。 1、内存泄漏的种类 1)常发性内存泄漏 。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2)偶发性内存泄漏 。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 3) 一次性内存泄漏 。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷

程序性能优化之启动速度与执行效率优化(一)下篇

早过忘川 提交于 2019-12-06 02:45:09
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将继续以下两个内容来介绍启动速度与执行效率优化: [StrictMode 详解] [Systrace和TraceView] 一 StrictMode 详解 1.1 如何启用 StrictMode 我们通常在 Activity 或者自定义的Application类中启动 StrictMode,代码如下: public void onCreate() { if (DEVELOPER_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog()

程序性能优化之启动速度与执行效率优化(一)上篇

我的未来我决定 提交于 2019-12-06 02:44:00
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将先从以下三个内容来介绍启动速度与执行效率优化: [冷启动和热启动解析] [APP启动黑白屏解决办法] [APP 卡顿问题分析及解决方案] 一、冷启动和热启动解析 1.1 启动方式 通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动。 1、冷启动:当启动应用时。后台没有该应用的进程,这时系统会又一次创建一个新的进程分配给该应用,这个启动方式就是冷启动。 2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用尽管会退出,可是该应用的进程是依旧会保留在后台,可进入任务列表查看)。所以在已有进程的情况下。这样的启动会从已有的进程中来启动应用。这个方式叫热启动。 1.2 特点 1、冷启动:冷启动由于系统会又一次创建一个新的进程分配给它。所以会先创建和初始化Application类,再创建和初始化MainActivity类(包含一系列的測量、布局、绘制),最后显示在界面上。 2、热启动:热启动由于会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包含一系列的測量、布局、绘制)。所以热启动的过程仅仅须要创建和初始化一个MainActivity即可了

C# 【Http请求返回】性能优化500毫秒到 60 毫秒

北城以北 提交于 2019-12-06 01:53:15
偶然发现 C# 的 HttpRequest 要比 Chrome 请求同一Url 慢好多。C# HttpRequest 要500毫秒 而Chrome 只需要 39ms。 作为有责任感的 码农。这个 必须优化。。 后来 整理 各种方法做了优化 HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; request.KeepAlive = false; request.ServicePoint.Expect100Continue = false; request.ServicePoint.UseNagleAlgorithm = false; request.ServicePoint.ConnectionLimit = 65500; request.AllowWriteStreamBuffering = false; request.Proxy = null; response.Close(); request.Abort(); 打开 KeepAlive 属性,这个可以打开一个tcp连接并在 一段时内重用tcp连接,从而加快http 请求。(默认是打开的)(我在开启keepalive 时出现 服务器关闭连接的错误,在请求完成后 加response.Close();request.Abort(); 后