编译器优化

JVM性能优化, Part 2 ―― 编译器

巧了我就是萌 提交于 2019-11-30 07:05:15
ImportNew注:本文是JVM性能优化 – 第2篇 《JVM性能优化, Part 2 ―― 编译器》第一篇 《JVM性能优化, Part 1 ―― JVM简介 》 作为JVM性能优化系列文章的第2篇,本文将着重介绍Java编译器,此外还将对JIT编译器常用的一些优化措施进行讨论(参见“JVM性能优化,Part 1″中对JVM的介绍)。Eva Andreasson将对不同种类的编译器做介绍,并比较客户端、服务器端和层次编译产生的编译结果在性能上的区别,此外将对通用的JVM优化做介绍,包括死代码剔除、内联以及循环优化。 Java编译器存在是Java编程语言能独立于平台的根本原因。软件开发者可以尽全力编写程序,然后由Java编译器将源代码编译为针对于特定平台的高效、可运行的代码。不同类型的编译器适合于不同应用程序的需求,使编译结果可以满足期望的性能要求。对编译器基本原理了解得越多,在优化Java应用程序性能时就越能得心应手。 什么是编译器 简单来说,编译器就是将一种编程语言作为输入,输出另一种可执行语言的工具。大家都熟悉的javac就是一个编译器,所有标准版的JDK中都带有这个工具。javac以Java源代码作为输入,将其翻译为可由JVM执行的字节码。翻译后的字节码存储在.class文件中,在启动Java进程的时候,被载入到Java运行时中。 标准CPU并不能识别字节码

编译原理

戏子无情 提交于 2019-11-30 03:50:13
Table of Contents 1 编译器整体设计与实践 1.1 龙书 – 《Compilers Principles,Techniques, & Tool》 1.2 虎书 – 《Modern Compiler Implementation in C》 1.3 《Engineering a Compiler》 1.4 《编译原理实验教程》 1.5 《Crafting a compiler》 1.6 《编译器设计之路》 2 语言理论、编译器前端设计与实现 2.1 《Introduction to Automata Theory, Languages, and Computation》 2.2 《Programming Language Pragmatics》 2.3 《Practical Foundations for Programming Languages》 2.4 《 Design Concepts in Programming Language 》 2.5 《Principles of Program Analysis》 2.6 《Language Implementation Patterns – Create Your Own Domain-Specific and General Programming Languages》 2.7 《flex & Bison》

【转载】基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程(之一)——介绍、安装准备、安装、config文件以及运行脚本介绍

房东的猫 提交于 2019-11-30 02:32:10
基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程(之一)——介绍、安装准备、安装、config文件以及运行脚本介绍 其他 2018-05-30 13:27:18 阅读次数: 0 https://www.codetd.com/article/1137423 《版权声明:本文为博主原创文章,未经博主允许不得转载》 本次利用SPECCPU2006测试工具来进行Intel CPU Xeon E7-**** v4的测试以及调优,计划在机器I840-G**测试。本次测试主要从硬件调优和操作系统调优两个方面进行。经过最终的测试,SPECint_rate_base和SPECfp_rate_base结果均超过Intel的预期。其中调优过程尤为重要,为后续继续的测试达下基础。下面记录中间的调优过程。 SPECCPU2006简介 SPECCPU2006安装和使用 config文件以及运行脚本介绍 测试准备以及基准值测试 硬件调优过程 OS调优过程 结果提交过程问题 FAQ 自动化测试脚本 Numa、memory interleaving、cgroup等相关内容学习 常用监控工具使用,最好写成自动化脚本时称log文件,可以用来观察。 top、sar、vmstat、oprofile、重拾pcp功能等 一、SPECCPU2006简介

c/c++常见面试题(一)

佐手、 提交于 2019-11-29 21:39:57
0.static、const、volatile的作用和区别 static: https://www.cnblogs.com/Manual-Linux/p/8870038.html 第一 、在修饰变量的时候,static修饰的静态局部变量只执行一次,之后再初始化无效。而且延长了局部变量的生命周期,直到程序运行结束以后才释放。 第二 、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。 第三 、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0 const: 1.修饰的变量只读,不可改变 2.防止意外修改,减少bug 3.可以节省空间,避免不必要的 内存分配 volatile: 告诉编译器这个变量随时可变,不需要优化 1.请问全局变量和局部变量能否重名 能,局部会屏蔽全局。要用全局变量,需要使用"::" 2. 用三目运算符(X)>(Y)?(X):(Y)宏定义实现比较两个数的大小 #define MAX(X, Y) ((X)>(Y)?(X):(Y)) 3.malloc的了解 malloc是动态内存分配,是用户动态申请系统分配指定字节的内存块的函数。返回类型是 void* 类型 对应free,

内联函数分析

大城市里の小女人 提交于 2019-11-29 13:51:18
目录 1. 内联函数的声明 2. 内联函数的特性 3. 内联函数与编译器 4. 内联函数的限制 1. 内联函数的声明 在C++中,const常量可以代替宏常数定义,而宏代码段则推荐使用内联函数来代替。 C++中使用 inline 关键字声明内联函数 inline只是一种请求,编译器不一定允许这种请求 inline关键字必须和函数定义结合在一起 ,否则编译器会直接忽略内联请求 inline int func(int a, int b) { return a < b ? a : b; } 2. 内联函数的特性 C++编译器直接将 内联函数的函数体扩展到函数调用的地方 内联函数调用时 没有压栈、跳转、返回等额外开销 内联函数 具有参数检查、返回类型等普通函数特征 内联函数与宏代码段相比,保留了比普通函数效率更高、开销更小的优点,摒弃了宏代码段不经过编译器可能带来副作用的缺点 #include <stdio.h> #define MAX(a, b) ((a) < (b) ? (a) : (b)) inline int max(int a, int b) { return a < b ? a : b; } int main(int argc, char *argv[]) { int a1 = 1; int b1 = 3; int c1 = MAX(++a1, b1); int a2 = 1;

说说编译器是否会对已知结果的运算式做出优化?(老物)

爷,独闯天下 提交于 2019-11-29 11:58:39
有时候我们想优化一些语句,例如: 你会发现,这个 (8 * sizeof(uint32_t)) 不是会每次循环中浪费一次运算的时间吗? 那么针对这个问题我们可以通过宏定义或者静态常数处理,宏定义不用说大家都直接,直接把运算常数结果定义出来就可以了,但是带来的问题不仅是破坏了原有代码的拓展性和可读性,还带来了调试终止条件困难的结果,如果不是高级的IDE可能要到处查看引用才知道终止常数是多少。 那么利用静态常数做处理,则代码改成如下: 你会发现,这不是浪费了一个4字节的静态空间,而且还不是要每次函数进来时进行一次运算才行吗? 如果这样去想就会发现问题了,同时,本文的正题也就出来了,对于一个已知结果的运算式,编译器是否会做出优化呢?答案自然是肯定的,但是为什么呢? 因为,静态化变量如果要初始化的要求是赋予常量,反过来说,如果 (8 * sizeof(uint32_t)) 不是常量肯定不会通过编译,既然编译器知道它是常量,那是不是就意味着它是一个优化的结果? 毕竟已经帮你提前算出结果并视为常量?所以这是不是意味着我们可以放心的使用一个已知结果的运算式作为一个常量来使用呢? 附上一个图来说明问题: 其实可以不用像我写的代码那样把常量存储到变量中,把常量写入一个变量仅仅是为了说明这个问题和方便我调试时看到终止条件值而不是自己推断终止条件(考虑代码可读性)。同时

重读STL源码剖析:析构

寵の児 提交于 2019-11-29 10:30:19
纯虚析构函数 理论上来说,将一个函数声明为纯虚函数后,这个类即变为抽象类。纯虚函数只提供接口,而不提供实现,但纯虚析构函数一定要提供定义。这是由C++特性决定的,编译器对派生类的析构函数会进行扩展,以静态调用的方式调用其每一个虚基类和上基类的析构函数,尽管是一个抽象类,但仍然要为这个纯虚析构提供实现,即使是awov::~awov() {} 这样没有任何操作的实现,因为如果不提供,将导致链接失败 虚函数与内联 内联函数是一种静态行为,由编译器在调用地点展开,这是在编译期进行的;而虚函数是一种动态行为,是在运行期通过虚函数表跳转来实现的,因此inline与virtual是矛盾的,之所以声明为virtual的内联函数能成功运行,这是因为编译器做了优化。inline是对编译器的一种建议,而编译器是否采纳则不一定。j 来源: https://www.cnblogs.com/lxy-xf/p/11515570.html

gcc编译器windows版 1.0

旧时模样 提交于 2019-11-29 08:10:23
gcc编译器是由Free Software Foundation(自由软件基金会)开发并推出的一款GNU编译器套件,软件具有多个平台的兼容性体验,不仅支持在windows平台下进行主流编程语言的编译,而且在Linux系统下也能达到很好的软件应用编程,使用者在命令窗口中键入gcc的程序名,以及一些命令参数便可以执行一系列的功能化操作,每个语言编译器都是独立程序,此程序可处理输入的原始码,并输出组合语言码,软件大部分都是由c编写而成的,很好的增强了底层应用的兼容性开发。 为了解决大多数用户在软件下载资源上的困扰,本站提供gcc编译器下载,方便用户更好的引用软件提供的功能进行程序应用的编译,引导用户对功能进行快速上手的操作,另外,软件支持常见的C、C++、Objective-C、Fortran、Java等多种语言的编写,极大的简化了不同语言种类的多编译选择难题。有需要的用户可以在本站下载!注:下载包中有gcc编译器windows版安装包以及软件使用说明,请用户不要轻易删除安装包文件以及更改文件类型。 gcc编译器下载 安装教程 1、在本站下载好压缩包,解压缩,双击运行“gccgdb.exe”程序进行软件的解压安装,自定义软件解压目录,点击“Unzip”按钮开始解压安装; 2、解压安装完成后,找到软件安装的“bin”目录,复制路径; 3、右键“计算机”选择“属性”,在窗口中选择

JVM性能优化, Part 1 ―― JVM简介

浪子不回头ぞ 提交于 2019-11-29 05:27:05
众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚拟机的运行机制做简单介绍,内容包括“一次编写,到处运行”的利弊、垃圾回收的基本原理、常用垃圾回收算法的示例和编译器优化等。后续的系列文章将会JVM性能优化的内容进行介绍,包括新一代JVM的设计思路,以及如何支持当今Java应用程序对高性能和高扩展性的要求。 如果你是一名程序员,那么毫无疑问,你肯定有过某种兴奋的感觉,就像是当一束灵感之光照亮了你思考方向,又像是神经元最终建立连接,又像是你解放思想开拓了新的局面。就我个人来说,我喜欢这种学习新知识的感觉。我在工作时就常常会有这种感觉,我的工作会涉及到一些JVM的相关技术,这着实令我兴奋,尤其是工作涉及到垃圾回收和JVM性能优化的时候。在这个系列中,我希望可以与你分享一些这方面的经验,希望你也会像我一样热爱JVM相关技术。 这个系列文章主要面向那些想要裂解JVM底层运行原理的Java程序员。文章立足于较高的层面展开讨论,内容涉及到垃圾回收和在不影响应用程序运行的情况下对安全快速的释放/分配内存。你将对JVM的核心模块有所了解:垃圾回收、GC算法、编译器行为,以及一些常用优化技巧。此外,还会讨论为什么对Java做基准测试(benchmark)是件很困难的事,并提供一些建议来帮助做基准测试。最后

01 编译原理概述

纵然是瞬间 提交于 2019-11-29 04:16:34
1)简述编译程序与翻译程序、汇编程序的联系与区别。 翻译程序是把一种语言(称作源语言)书写的程序翻译成另一种语言的(称作目标语言)的等价程序。将一种高级语言翻译成低级语言时,则这种翻译程序称作编译程序。 编译程序的基本任务是将源语言翻译成等价的目标语言程序。 汇编过程是指吧汇编语言翻译成目标机器指令的过程。 翻译程序是编译程序的一种,翻译程序将高级语言翻译成低级语言,汇编程序将汇编代码转换成目标代码。 2)编译过程包括哪几个主要阶段及每个阶段的主要功能。 编译过程主要包括以下几个阶段: 词法分析:词法分析是编译的第一个阶段,这个阶段的主要任务是对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(逻辑上紧密相连的一组字符,这些字符具有集体含义)。 ↓ 语法分析:语法分析是编译程序的第二个阶段,主要任务是在词法分析的基础上将单词序列分解成各类语法短语。这种语法短语也称为语法单位可表示语法树。语法分析所依据的是语法规则,即描述程序结构的规则,词法分析和语法 分析本质上都是对源程序的结构进行分析。 ↓ 语义分析:语义分析是审查源程序有无语义错误,伪代码生成阶段收集类型信息,审查每个算符是否具有语言规范允许的运算对象。 ↓ 中间代码生成:进行上述语法、语义分析的阶段工作之后,有的编译程序将源程序变成一种内部表示形式,这种形式称为中间语言或中间代码。中间代码是一种结构简单