精华内容
下载资源
问答
  • java即时编译器特点

    2016-09-14 09:11:27
    具有很大时间压力,它能提供的优化手段也严重受制于编译成本,如果编译速度不能达到要求,那用户将在启动程序或程序某部分察觉到重大延迟,这点使得即时编译器不敢随便引入大规模的优化技术,而编译时间成本在...
    java的即时编译器
    1)因为即时编译器运行占用的是用户程序的运行时间,具有很大的时间压力,它能提供的优化手段也严重受制于编译成本,如果编译速度不能达到要求,那用户将在启动程序或程序的某部分察觉到重大延迟,这点使得即时编译器不敢随便引入大规模的优化技术,而编译的时间成本在静态编译器中并不需要关注。
    2)Java语言是动态的类型安全语言,这就意味着需要由虚拟机来确保程序不会违反语言语义或访问非结构化的内存。从实现层面上看,这就意味着虚拟机必须频繁地进行动态检查,如实例方法访问时检查空指针、数组元素访问时检查上下界范围等。对于这类程序代码没有明确地写出检查行为,尽管编译器会努力优化,但是总体上仍然消耗不少时间
    3)java语言虽然没有virtual关键字,但是使用虚方法的频率却远远大于C++/C语言,这意味着运行时对方法接收者进行多台选择的频率远远大于C/C++,也意味着即时编译器在进行一些优化时的难度大于C/C++。
    4)java语言是可以动态扩展的语言,运行时加载新的类可能改变程序类型的继承关系,这使得很多全局优化都难以进行,因为编译器无法看见程序的全貌,许多全局的优化措施都只能以基激进的方式来完成,编译器不得不时刻注意并随着类型的变化而在运行时撤销或重新进行一些优化。

    5)java语言中对象的内存分配是在堆上分配的,只有方法中的局部变量才在栈上分配,而C++/C的对象有多种内存分配方式,既可以在堆上也可以在栈上分配,如果可以在栈上分配线程私有对象,将减轻内存回收的压力。

    展开全文
  • 浅谈编译器优化

    2013-08-06 13:22:43
    关于优化,可以说途径千千万万,没有一定的法则,但大抵有那么几个比较基本的法则,比如:充分了解计算机的体系结构,了解自己所处理的数据的特点,熟悉编译器的工作原理等等。今天我想谈谈关于编译器方面的一些见解...
    关于优化,可以说途径千千万万,没有一定的法则,但大抵有那么几个比较基本的法则,比如:充分了解计算机的体系结构,了解自己所处理的数据的特点,熟悉编译器的工作原理等等。今天我想谈谈关于编译器方面的一些见解,编译器分为预处理,编译,链接等大概的几个部分,如果能够清楚这几个阶段编译器各做了什么事情,编译器在哪方面比较聪明,能够替你做一些优化,又在哪方面比较弱智,无法替你做优化,你就能很清醒地知道,你做的哪些优化是有效的,下面举例说明:


    今天有人提出在汇编指令中,去掉一些地址偏移乘法计算,这种善于动脑筋的方法值得赞赏,但可能对编译过程理解不是很透彻,会造成认识上的一些偏差。

    比如如下指令:
    movq 8*4(%%rsi),%%rax
    这是一个移动数据的指令,操作的对象是一个128位的数,其中源操作数的选址方式是寄存器间接寻址,地址偏移量是8*4,目的操作数是一个128位的普通寄存器。很显然,源操作数有一个地址偏移计算的过程,其过程常规理解应该是,首先计算8*4,得到32,然后将32加到地址寄存器%%rsi中去,然后再去执行寻址内存的操作,那么按照这个理解,我们想当然可以提出如下优化:
    movq 32(%%rsi),%%rax
    很显然这个过程少了一个计算8*4=32的过程,应该能起到优化作用,但果真如此吗??答案是否定的,这种替换没有任何优化作用,反倒代码可读性可能降低,这是为什么呢?原因是我们混淆了操作符的执行时期,我们一直在说,new/delete 是操作符,sizeof是操作符+ - * / %是操作符,但我们是否真正理解了什么是操作符吗,那些操作符操作是在编译期执行的,根本没有转化成指令,那些操作符操作最终是要转化为执行期的指令呢,我们不妨举个例子:
    假设有如下C语言函数
    int main()
    {
        int a;
        int b;
        a = 3 * 5 - 2 + 1;
        b = a + 9 * 6 + 1;
        return 0;
    }

    执行

    gcc -S compile.c 

    得到如下compile.s汇编代码:

    movl $14,-8(%%ebp)
    movl -8(%%ebp),%%eax
    addl $55,%%eax
    movl %%eax,-4(%%ebp)

    其中

    -8(%%ebp),-4(%%ebp)

    分别代表a,b变量在内存中的地址,很显然,经过一次编译已经完成了如下操作:

    3 * 5 - 2 + 1 = 14
    9 * 6 + 1 = 55
    换句话说这些操作根本没有转化为执行期的代码,当然也就无所谓效率提高不提高了
    其实主函数内赋值操作的代码完全等同于:
    a = 14;
    b = a + 55;

    那到底那些代码能够最终转化为执行期间的代码呢,一个原则,就是操作符其中的一个操作对象是内存中的值,比如,a = 14 是一个赋内存变量值操作,最终转化为了

    movl $14,-8(%%ebp)

    指令.

    而在b = a + 55 中,加法操作转化为
    movl -8(%%ebp),%%eax
    addl $55,%%eax
    即:首先去取内存变量a的值,然后完成加法操作
    而赋值操作转化为:
    movl %%eax,-4(%%ebp)
    将最终的和值送给内存变量b所在的地址。

    由上可知,懂得编译器的工作原理,对优化工作来说还是比较重要的



    展开全文
  • 关于优化,可以说途径千千万万,没有一定的法则,但大抵有那么几个比较基本的法则比如,充分了解计算机的体系结构,了解自己所处理的数据的特点,熟悉编译器的工作原理等等。今天我想讲一讲关于编译器方面的一些知识...

    关于优化,可以说途径千千万万,没有一定的法则,但大抵有那么几个比较基本的法则比如,充分了解计算机的体系结构,了解自己所处理的数据的特点,熟悉编译器的工作原理等等。今天我想讲一讲关于编译器方面的一些知识,编译器分为预处理,编译,链接等大概的几个部分,如果能够清楚这几个阶段编译器各做了什么事情,编译器在哪方面比较聪明,能够替你做一些优化,又在哪方面比较弱智,无法替你做优化,明白这个事情,你就能很清醒地知道,你做的哪些优化是有效的,下面举例说明:
    今天有人提出在汇编指令中,去掉一些地址偏移乘法计算,这种善于动脑筋的方法值得赞赏,但可能对编译过程理解不是很透彻,会造成认识上的一些偏差。
    比如如下指令
    movq 8*4(%%rsi),%%rax
    这是一个移动数据的指令,操作的对象是一个128位的数,其中源操作数的选址方式是寄存器间接寻址,地址偏移量是8*4,目的操作数是一个128位的普通寄存器。很显然,源操作数有一个地址偏移计算的过程,其过程常规理解应该是,首先计算8*4,得到32,然后将32加到地址寄存器%%rsi中去,然后再去执行寻址内存的操作,那么按照这个理解,我们想当然可以提出如下优化
    movq 32(%%rsi),%%rax
    很显然这个过程少了一个计算8*4=32的过程,应该能起到优化作用,但果真如此吗??答案是否定的,这种替换没有任何优化作用,反倒代码可读性可能降低,这是为什么呢?原因是我们混淆了操作符的执行时期,我们一直在说,new/delete 是操作符,sizeof是操作符+ - * / %是操作符,但我们是否真正理解了什么是操作符吗,那些操作符操作是在编译期执行的,根本没有转化成指令,那些操作符操作最终是要转化为执行期的指令呢,我们不妨举个例子
    假设有如下C语言函数
    int main()
    {
        int a;
        int b;
        a = 3 * 5 - 2 + 1;
        b = a + 9 * 6 + 1;
        return 0;
    }
    执行gcc -S compile.c 得到如下compile.s汇编代码
    movl $14,-8(%%ebp)
    movl -8(%%ebp),%%eax
    addl $55,%%eax
    movl %%eax,-4(%%ebp)
    其中-8(%%ebp),-4(%%ebp)分别代表a,b变量在内存中的地址,很显然
    经过一次编译已经完成了如下操作
    3 * 5 - 2 + 1 = 14
    9 * 6 + 1 = 55
    换句话说这些操作根本没有转化为执行期的代码,当然也就无所谓效率提高不提高了
    其实主函数内赋值操作的代码完全等同于
    a = 14;
    b = a + 55;
    那到底那些代码能够最终转化为执行期间的代码呢,一个原则,就是操作符其中的一个
    操作对象是内存中的值,比如,a = 14 是一个赋内存变量值操作
    最终转化为了movl $14,-8(%%ebp)指令.
    而在b = a + 55 中,加法操作转化为
    movl -8(%%ebp),%%eax
    addl $55,%%eax
    即首先去取内存变量a的值,然后完成加法操作
    而赋值操作转化为
    movl %%eax,-4(%%ebp)
    将最终的和值送给内存变量b所在的地址。
    由上可知,懂得编译器的工作原理,对优化工作来说还是比较重要的

    展开全文
  • 递归算法具有程序容易编写的特点;然而,由于编译器预分配堆栈空间的限制,递归深度并不是无限制的。 在递归过程中,系统将对当前程序运行状态保存(压入堆栈),并将参数压栈,然后递归。 在递归完成后,则做出栈...

    递归算法具有程序容易编写的特点;然而,由于编译器预分配堆栈空间的限制,递归深度并不是无限制的。

    在递归过程中,系统将对当前程序运行状态保存(压入堆栈),并将参数压栈,然后递归。

    在递归完成后,则做出栈操作。

    当递归深度很深时,由于堆栈满,递归无法继续。

    那么,递归深度到底是多少呢?如果我们创建无参数传递的递归,是否会更节省内存,从而,加大递归深度呢?

     

    程序:测试C++编译器的递归深度

    /*
    测试C++语言的递归深度
    G++结果:
    F: 43273
    F1: 43273
    F2: 43266
    VC2012结果:
    F:85588
    F1:44998
    F2: 42773
    */
    #include <iostream>
    
    using namespace std;
    
    int n;
    int times = 0;
    
    void F()
    {
    	if (n == 1)
    		return;
    	else
    	{
    		cout << times++ << endl;
    		n = n - 1;
    		F();
    	}
    }
    
    void F1(int n)
    {
    	if (n == 1)
    		return;
    	else
    	{
    		cout << times++ << endl;
    		n = n - 1;
    		F1(n);
    	}
    }
    
    typedef struct data {
    	int a, b;
    } Data;
    
    void F2(int n, Data data)
    {
    	if (n == 1)
    		return;
    	else
    	{
    		cout << times++ << endl;
    		n = n - 1;
    		F2(n, data);
    	}
    }
    
    
    int main()
    {
    	n = 1e6;
    	//F();
    	//F1(n);
    	Data data;
    	F2(n, data);
    	cout << "end";
    	return 0;
    }


    从上述程序似乎可以看出,在确定的编译器及编译参数下,不同参数传递方式似乎对递归深度没有太大影响。

    问题:到底是编译器对递归深度有限制?还是内存不够用了?

     

    结果:递归算法应慎用!

    展开全文
  • java和C++的编译器对比

    2020-08-06 00:50:37
    3、运行时多态性的特点使得编译器的优化难度大于C++的静态优化编译器。 4、动态可扩展的语言特性使得程序可以在运行时加载新的类,从而可能会改变继承关系,影响全局优化,比如方法内联。 5、java的对象在堆上分配,...
  • 在泛型没有出现之前,只能通过Object是所有类型父类和类型强制转换两个特点的配合来实现类型泛化,由于java语言所有类型都继承自Object,因此Object转型成任何对象都是有可能,但是也因为有无限可能性...
  • GCC编译器的常用操作

    2016-09-26 22:05:15
    gcc命令使用GNU推出基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化特点。现在很多程序员都应用GCC,怎样才能更好应用GCC。目前,GCC可以用来编译C/C++、FORTRAN...
  • 特点:代码不需要进行特殊处理,自动完成。 原则:只能从数据范围小类型,转换为数据范围大类型。(从小到大) 强制类型转换(显式) 特点:代码需要进行特殊格式处理,不能自动完成。 格式:小范围类型 变量...
  • TMS320X28xx编译器的接口有以下特点。  1.编译器shell程序  编译器包含一个shell程序(cl2000—v28),可以用来单步完成程序的编译、汇编和链接。shell程序通过下列工具实现一个或多个代码模块的操作,如图1所...
  • Linux中gcc编译器

    2018-09-26 21:18:29
    Gcc命令使用GNU推出基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化特点。 语法: gcc(选项)(参数) 选项: -o:指定生成输出文件; -E:仅执行编译预处理; -S:...
  • 编译器是干什么

    千次阅读 2018-05-20 17:35:29
    编译器完整工作过程由以下阶段: 中间语言有很多种表示方式,包括语法树,后缀表示法和三地址码等,它们需要具备共同特点是易于生成和易于译成目标代码。代码优化阶段主要是为了提高中间代码质量...
  • gcc命令使用GNU推出基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化特点。现在很多程序员都应用GCC,怎样才能更好应用GCC。目前,GCC可以用来编译C/C++、FORTRAN...
  • 二、主要特点加速Python功能Numba使用行业标准LLVM编译器库在运行时将Python函数转换为优化的机器代码。 Python中Numba编译数值算法可以接近C或FORTRAN速度。您不需要替换Python解释器,运行单独编译步骤,...
  • 这个程序编译器的最大特点可以自我学习,在编译代码时可以对程序进行分析,并找到最适合的优化方法编译程序。试验表明,用这个编译器编译程序的运行效率可以提高18%. 开源之后的项目还会继续...
  • 在java还没有出现泛型之前,只能通过Object是所有类型父类、类型强制转换两个特点的配合来实现类型泛化。 java中泛型,只在程序源码中存在,在编译后字节码文件中,就已经替换为原来原生类型,并在相应地方...
  • 针对C ++ / V8Javascript编译器 建造 需要节点。 $ yarn 例 $ yarn tsc $ node build/jsc.js tests/tco.js $ node bin/index.js 12586269025 产品特点 函数和函数调用基本尾叫优化 var,const,let声明 对于,做...
  • gcc命令 GUN C/C++编译器

    2021-01-09 18:56:01
    gcc命令使用GNU推出基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化特点。 现在很多程序员都应用gcc,目前gcc可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言...
  • c编译器ucc 编译原理

    2011-03-30 20:33:54
    一个由清华大学学生完成C语言编译器实现 -- UCC。 以下为其作者对项目简介: “上了一学期编译原理,但是对于如何去实现一个真正的编译器仍然觉得困惑; 学习了一些好的优化算法或者自己有些好想法,想在...
  • Numba使用行业标准LLVM编译器库在运行时将Python函数转换为优化的机器代码。 Python中Numba编译数值算法可以接近C或FORTRAN速度。您不需要替换Python解释器,运行单独编译步骤,甚至安装C / C ++编译器。...
  • 特点是有非常好移植性,你可以在非常广泛平台上使用它,同时也是编写跨平台,嵌入式程序很好选择。另外在符合标准这个方面一直都非常好,GCC3.3大概能够达到96.15%。但是由于其跨平台特性,在代码尺寸速度等...
  • xcode 编译器选择

    2013-03-30 20:35:44
    clong是一个生成IR前端编译工具,其特点是速度比较快 gcc也可用来生成IR语言 转自:http://www.cnblogs.com/ydhliphonedev/archive/2012/08/29/2661726.html  在XCode中,我们经
  • 传统的c/c++编译器为GNU的gcc/g++,当然我们也通常使用gcc/...本文希望使用icc编译得到MySQL,然后通过测试得到icc编译出的MySQL在性能等方面的特点。1测试环境1.1使用icc编译器编译MySQL5.0在configure前需要通过...
  • gcc命令使用GNU推出基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化特点。现在很多程序员都应用GCC,怎样才能更好应用GCC。目前,GCC可以用来编译C/C++、FORTRAN...
  • c++对c的优化

    2017-06-13 12:46:48
    c++诞生,肩挑兼容c语言所有特性担子,所以c++继承了c语言的的所有特性,但是在c...1. register关键字c语言中,register关键字请求(只是请求,编译器完全可以拒绝)编译器将局部变量存储于寄存器中,在c++中依然支持
  • 执行引擎结构图 解释器特点 1、逐行解释字节码,...3、因为先编译,编译过程做了优化,执行效率比较高; 两者互补 1、对于一般代码,用解释器,这样响应快,给人感觉就是速度快; 2、对于热点代码,用JI...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 274
精华内容 109
关键字:

优化编译器的特点