优化

重塑云上的 Java 语言

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-16 16:16:00
音乐无国界,但是音乐人有国界。 云原生亦如此。虽没有限定的编程语言,但应用所使用的编程语言已经决定了应用部署运行的行为。 Java 诞生于20年前,拥有大量优秀的企业级框架,践行 OOP 理念,更多体现的是严谨以及在长时间运行条件下的稳定性和高性能。反观如今,在要求快速迭代交付的云场景下,语言的简单性似乎成了首要的要求,而传统的 Java 语言显得有一些过于重量了。 本文由阿里巴巴 JVM 团队技术专家郁磊(花名:梁希)分享 JVM 团队是如何面对和处理集团巨大的业务规模和复杂的业务场景的。 ElasticHeap Java 常因为耗资源而受诟病,其中最显著一点就是 Heap 对内存的占用,即便没有请求在处理也没有对象分配,进程仍然会保留完整的堆内存空间,保障 GC 进行分配内存和操作内存的快速敏捷。 AJDK ZenGC/ElasticHeap 双十一全面支持核心链路上百应用和数十万实例。 JDK12 开始支持固定时间的触发 concurrent mark 并在 remark 中收缩 Java 堆归还内存的功能,然而并未解决在 stw 中增加暂停时间的问题,因此无法在每次 young GC 时做内存归还。 ElasticHeap 在并发异步线程中完成内存处理反复 map/unmap 以及 page fault 的开销,因此任意一次 young GC 都可以敏捷的及时归还内存

2

给你一囗甜甜゛ 提交于 2019-12-16 01:12:17
文章目录 2.2 缓存性能的10种高级优化方法 2.2.1 小而简单的第一级缓存,缩命中时间、降功率 2.2 缓存性能的10种高级优化方法 存储器平均访问时间公式提供三种缓存优化度量: 命中时间、缺失率和缺失代价。 据最近的发展趋势,添加缓存带宽和功耗 根据这些度量,将10种高级缓存优化方法分5类 (1)缩短命中时间。小而简单的第一级缓存和路预测。通常还能降低功耗。 (2)增加缓存带宽。流水化缓存、多组缓存和无阻塞缓存。对功耗具有不确定影响。 (3)降低缺失代价。关键字优化,合并写缓冲区。对功率的影响很小。 (4)降低缺失率。编译器优化。缩短编译时间肯定可以降低功耗 (5)并行降低缺失代价或缺失率。硬件预取和编译器预取。通常会增加功耗,因为提前取出了未用到的数据   采用这些技术时,硬件复杂度会增。 这些优化技术中有几种需采用高级编译器技术。 表2-1中总结这10种技术的实现复杂度和性能优势。 比较简单的优化方法仅作简介,而对其他技术将给出更多描述。   2.2.1 小而简单的第一级缓存,缩命中时间、降功率 提高时钟频率和降低功率都推动了对第一级缓存大小的限制。 与此类似,用较低级别的相联度,也可缩短命中时间、降低功率,不过这种权衡要比限制大小涉及的权衡 更复杂   缓存命中过程中的关键计时路径由3步骤: 用地址中的索引确定标记存储器的地址,将读取的标签值与地址比较。 接下来

Java Web 前端高性能优化(二)

自作多情 提交于 2019-12-15 23:01:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ######一.上文回顾 上回我们主要从图片的合并、压缩等方面介绍前端性能优化问题(详见 Java Web 前端高性能优化(一) ) 本次我们主要从图像BASE64 编码、GZIP压缩、懒加载与预加载以及 OneAPM Browser Insight 的定位分析功能四个方面介绍前端优化方法 ######二.图像的 BASE64 编码 不管如何,图片的下载始终都要向服务器发出请求,要是图片的下载不用向服务器发出请求,而可以随着 HTML 的下载同时下载到本地那就太好了。而目前,浏览器已经支持了该特性,我们可以将图片数据编码成 BASE64 的字符串,使用该字符串代替图像地址。 假设用 S代表这个 BASE64 字符串,那么就可以使用 <img src="data:image/png;base64,S"> 来显示这个图像。可以看出,图像的数据包含在了 HTML 代码里,无需再次访问服务器。那么图像要如何编码成 BASE64 字符串呢? 可以使用 在线的工具---“Base64 Online”,这个工具可以上传图片将图片转换为 BASE64 字符串。当然,如果读者有兴趣,完全可以自己实现一个 BASE64 编码工具,比如使用 Java 开发,它的代码就如清单 1 所示。 清单 1. BASE64 的 Java 代码

提高HTML5 canvas性能的几种方法!

我是研究僧i 提交于 2019-12-12 16:00:07
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 简介 HTML5 canvas 最初起源于苹果(Apple)的一项实验,现在已经成为了web中受到广泛支持的2D 快速模式绘图 (2D immediate mode graphic )的标准。许多开发者现在利用它来实现众多的多媒体项目、可视化醒目以及游戏等等。然而,随着我们构建的应用程序的复杂度的增加,我们难免会遇到所谓的性能问题。 已经存在众多优化canvas性能的方法了,但是还没有一篇文章将这些方法系统的整理并加以分析。本文的目的就在于将这些方法整理、巩固以使其曾为开发者们更容易理解、消化、吸收的资源。本文囊括了适用于所有计算机绘图环境(computer graphics environments)的最基本的优化方法,以及特定于canvas的优化方法。其中特定于canvas的优化方法可能会随着canvas实现方式的更新而发生变化。特别的,当浏览器开发商实现了canvas GPU 加速时,我们探讨的某些优化方法可能会显得并不是特别有效,这些情况我们会在特定的地方标注出来。 请注意,本文侧重点不在于讨论HTML5 canvas的用法。如果想了解canvas的具体用法可以参见HTML5 Rocks网站中 canvas相关的文章 。比如 Dive into HTML5 chapter 以及 MDN tutorial

谈谈源码中的SparseArray

橙三吉。 提交于 2019-12-10 17:43:23
谈谈源码中的SparseArray 在Andorid的源码和第三方库中,偶尔能看到该类,我们先来看一下官方文档的说明如下: SparseArray map integers to Objects. Unlike a normal array of Objects,there can be gaps in the indices. It is intended to be more memory efficient than using a HashMap to map Integers to Objects, both because it avoids auto-boxing keys and its data structure doesn't rely on an extra entry object for each mapping. 上面的意思是SparseArray 用来替代HashMap Int到Object的这种关系。 它设计的目的是为了比HashMap更加节省内存,这是因为: 它避免了键值的自动装箱 他的数据结构不需要依赖额外的对象来完成映射。 Note that this container keeps its mappings in an array data structure,using a binary search to find keys. The

编程珠玑

倾然丶 夕夏残阳落幕 提交于 2019-12-10 06:22:23
如果发布内容不存在敏感词第一个字集合情况下,test2做出了很大优化,循环次数为发布内容个数。 但是如果发布内容村子敏感词,还是使用了test1方法,问题还存在。 怎样脱离test1方法?我们可以考虑把敏感词进一步分析,第二个字集合也进行规整、第三个字集合、第四个...。 这个让我想到了树形结构: 办 气 裸 土 证 枪 聊 表 枪 出 演 卖 售 每一层进行规整,但是不同的层可能出现相同的字,怎么区分他们? 我们进行从根到层的一个map拓展,这样可以区分不同的分支。 简单说,就是第二层有两个“枪”,但是第一个属于“气”父亲,第二个属于“土”父亲,我们根据“气枪”找到它下面的集合“出”,根据“土枪”找到集合“卖”。 package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.HashMap; public class Test { static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static HashMap

编程珠玑

六月ゝ 毕业季﹏ 提交于 2019-12-10 06:17:27
在第四步中,我们看到,使用排序好的String[] 要比 ArrayList<String> 查找时候快速的多,因为ArrayList<String>的查找复杂度O(n),而排序好的String[]查找复杂度O(1)。 但是我们还是过量依赖String,这个对象本身效率就不高,于是我们需要换成更底层的原始类型进行优化: package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static char[] charFirst; static

编程珠玑

て烟熏妆下的殇ゞ 提交于 2019-12-10 06:01:27
就像上一步说的那样, 当敏感词超过了一定量时候,效率将会急剧下降 。 假设发布内容“再顶”,敏感词达到了1000个,按照快速实现的方法,循环1000次,显然不是最优方法。 因为“再”,“顶”并没有出现在 "办证、 气枪、 裸聊" 的第一个字集合"办、气、裸"中,所以我们可以考虑当搜集所有敏感词第一个字集合来快速判断发布内容是否含有敏感词。 package test; import static util.PrintUtil.print; import java.util.ArrayList; public class Test { static String[] keys = {"办证", "气枪", "裸聊"}; static String tContent = "再顶"; static ArrayList<String> list = new ArrayList<String>(); static { for (String k : keys) { if (!list.contains(k.substring(0, 1))) { list.add(k.substring(0, 1)); } } } /** * 快速实现的方法 */ public final static String test1(String content) { for (String k : keys) {

使用Google Page Speed优化Web前端性能

馋奶兔 提交于 2019-12-09 23:52:42
安装步骤: http://jingyan.baidu.com/article/597035523c54cd8fc00740ed.html 安装好以后,打开Firebug,可以看到新增的标签页:Page Speed: 使用Page Speed 其中,Page Speed标签页包括两个功能:Analyze Performance与Show Resources,其中Analyze Performance是Page Speed的核心功能。点击以后Page Speed开始工作,几秒钟以后就会得出一份详细的性能分析报告: Page Speed分析报告 其中各项按照重要性进行排序,展开每一部分,可以得到详细的报告。其中,红色图标表示未进行优化,黄色表示可以进行进一步优化,绿色表示已经进行优 化。 其余部分的功能可以在Google Code的 官方主页上 找到,这里就不赘述了,只重点介绍Analyze Performance这一功能。 性能优化技巧 其实上图的每一项都是Page Speed提供的优化标准,Page Speed就是按照这一条条标准进行分析的。需要拿出来讲的包括: 使用gzip压缩 这里放在第一,是性能优化效果最显著的一步。所谓gzip压缩是一种开发的压缩算法,目前的主流浏览器( Firefox , Safari, Chrome, IE4及以上)与主流服务器(Apache,

llvm每日谈之四 Pass初探

╄→гoц情女王★ 提交于 2019-12-09 21:00:21
作者: snsn1984 LLVM 的Pass框架是LLVM系统的一个很重要的部分。每个Pass都是做优化或者转变的工作,LLVM的优化和转换工作就是由很多个Pass来一起完成的。 所 以按照我的理解,Pass就是LLVM系统转化和优化的工作的一个节点,每个节点做一些工作,这些工作加起来就构成了LLVM整个系统的优化和转化。 Pass架构这么做的话,可重用性非常好,你可以选择已有的一些Pass,自己去构建出自己想要的优化和转化效果。并且自己也可以重新写Pass去做自己 想要的优化和转变,因为每个Pass都可以独立存在,所以新建Pass并不用考虑LLVM之前的优化和转化是怎么做的,自己可以只运行自己新建的 Pass,这样可以方便的实现自己想要的效果。 Pass最初的例子就在:llvm源码/lib/Transform/Hello/Hello.cpp。 可以采用命令 $ opt -load ../../../Debug+Asserts/lib/Hello.so -hello < hello.bc > /dev/null 去运行这个Pass,并且查看效果。 ../../../Debug+Asserts/lib/Hello.so 是so的目录,在llvm3.1中,这个例子的名称已经变成了LLVMHello.so. 存放在build目录/Release+Asserts/lib目录之下