`
fushengxu
  • 浏览: 17203 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SparkSql 字节码生成技术

阅读更多
    以具体的SQL语句 select a+b fromtable 为例进行说明,下面是它的解析过程:
    1.调用虚函数Add.eval(),需确认Add两边数据类型
    2.调用虚函数a.eval(),需要确认a的数据类型
    3.确认a的数据类型是int,装箱
    4.调用虚函数b.eval(),需确认b的数据类型
    5.确认b的数据类型是int,装箱
    6.调用int类型的add
    7.返回装箱后的计算结果

    从上面的步骤可以看出,一条SQL语句的解析需要进行多次虚函数的调用。我们知道,虚函数的调用会极大的降低效率。那么,虚函数的调用为什么会影响效率呢?
    有人答案是:虚函数调用会进行一次间接寻址过程。事实上这一步间接寻址真的会显著降低运行效率?显然不是。
    流水线的打断才是真正降低效率的原因。
    我们知道,虚函数的调用时是运行时多态,意思就是在编译期你是无法知道虚函数的具体调用。设想一下,如果说不是虚函数,那么在编译时期,其相对地址是确定的,编译器可以直接生成jmp/invoke指令; 如果是虚函数,多出来的一次查找vtable所带来的开销,倒是次要的,关键在于,这个函数地址是动态的,譬如 取到的地址在eax里,则在call eax之后的那些已经被预取进入流水线的所有指令都将失效。流水线越长,一次分支预测失败的代价也就越大,如下所示:

   pf->test
    001E146D mov eax,dword ptr[pf]
    011E1470 mov edx,dword,ptr[eax]
    011E1472 mov esi,esp
    011E1474 mov ecx,dword ptr[pf]
    011E1477 mov eax,dword ptr[edx]
    011E1479 eax <-----------------------分支预测失败
    011E147B cmp esi esp
    011E147D @ILT+355(__RTC_CheckEsp)(11E1168h)

    说到流水线,penalty基本上都是因为气泡(分支指令导致预取失败)。虽然引入流水线极大提高了效率,流水线不是越长越好。
    Scala的运行时反射机制很好机制很好解决了这个问题。未完待续,下回分解。



   
分享到:
评论

相关推荐

    cglib,字节码生成库是生成和转换Java字节码的高级API。它被aop、测试、数据访问框架用来生成动态代理对象和拦截字段访问。.zip

    CGlib的主要作用是通过字节码技术动态地生成新的类或对象,这些类通常作为代理来使用,用于实现动态代理、方法拦截、以及为不支持接口的类提供AOP能力。 **字节码生成** 在Java中,每个类在运行时都会被JVM(Java...

    cglibJava字节码生成库

    【标题】:“cglib——Java字节码生成库”是一个强大的工具,用于在运行时动态创建和修改类的字节码。它是一个广泛应用于Java开发中的库,特别是那些需要底层控制对象实例化、方法调用等场景的项目。 【描述】:...

    ASM操作字节码,动态生成Java类class文件

    ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...

    字节码实战包含class,字节码.zip

    综上所述,"字节码实战"涵盖了Java开发中的核心概念和技术,包括字节码的生成、解析、优化以及其在各种高级技术中的应用。通过深入学习和实践,开发者可以更好地理解Java的运行机制,从而编写出更高效、更安全的代码...

    可变字节码

    字节码通常是指计算机程序的一种中间表示形式,它是由编译器生成的,介于高级语言和机器语言之间,以单个字节为单位。然而,可变字节码并不局限于单个字节,它的核心在于根据数值的大小动态地选择字节数来编码,从而...

    字节码生成:为什么Spring技术很强大?.pdf

    字节码生成:为什么Spring技术很强大?

    Java字节码实现Aop

    Java字节码实现AOP(面向切面编程)是一种在程序运行时动态插入代码的技术,它使得我们可以在不修改原有代码的情况下,增加新的功能或监控已有功能。在Java中,AOP通常通过代理模式和字节码操作来实现,如Spring AOP...

    Android字节码插桩

    在Android开发领域,字节码插桩是一种非常重要的技术,它允许开发者在程序运行时动态地插入代码,以此实现如性能监控、日志记录、权限检查等附加功能。ASM是Java字节码操控和分析框架,它在Android字节码插桩中扮演...

    一种Java字节码保护技术的研究和实现.pdf

    一种Java字节码保护技术的研究和实现 本文研究了一种基于JVMTI的Java字节码保护技术,该技术可以使Java字节码的安全级别相當于传统的二进制代码。该技术的实现可以在Windows和Linux平台下进行。 Java字节码保护...

    Android中修改运行时内存Dalvik字节码

    在Android中,修改运行时内存的Dalvik字节码通常涉及到以下技术: 1. **动态代码注入**:这是一种在程序运行时向其添加新功能或改变已有行为的技术。这可以通过反射、代理类或者Java的动态代理来实现。在Android中...

    通过Android字节码插桩插件实现Android端无埋点(或自动埋点),并且支持根据配置文件实现业务数据的自动采集。.zip

    字节码插桩是一种动态或静态修改字节码的技术,用于在运行时或编译时插入额外的代码。在Android中,我们可以使用ASM、Dexmaker或ByteBuddy等库来实现字节码插桩。LazierTracker就是基于这些技术,它能够在运行时动态...

    java字节码加密

    Java字节码加密是保护Java应用程序源代码安全的重要技术手段,主要是为了防止恶意用户逆向工程分析、篡改或盗取程序的核心逻辑。在Java中,字节码(Bytecode)是程序经过编译后的中间表示,可以直接由Java虚拟机...

    JAVA字节码操作库 BCEL

    2. **字节码生成**:BCEL提供了一套接口和类,使得开发者可以动态地生成字节码,这对于创建动态代理、AOP(面向切面编程)等场景非常有用。 3. **代码优化**:通过修改字节码,BCEL可以实现代码的优化,例如去除...

    轻松看懂Java字节码.pdf

    描述中提到Java字节码是实现“一次编写,到处运行”(Write Once, Run Anywhere)这一Java承诺的核心技术之一。而标签“Java 字节码”直接点明了文档的主题。 Java字节码(Bytecode)是Java源代码编译后生成的指令...

    ASM字节码操作简单实例

    ASM字节码库是Java字节码操作的强大工具,它允许程序员在运行时动态生成类或者增强已有类的功能。在本实例中,我们将探讨如何利用ASM实现简单的面向切面编程(AOP)功能,这是一种在不修改源代码的情况下,添加额外...

    java字节码文件查看工具,查看class文件

    Java字节码文件查看工具,如JD-GUI,是开发者们深入理解Java应用程序内部机制的重要辅助工具。这类工具能够帮助我们查看并分析.class文件,这些文件是Java源代码经过编译后的二进制形式,包含了运行时所需的所有指令...

    基于Java字节码增强技术实现的协程Demo.zip

    Java字节码增强技术是Java开发中的一种高级技巧,它允许开发者在程序运行时动态修改类的字节码,从而实现一些特殊的功能,比如AOP(面向切面编程)、性能监控、事务管理等。协程是一种轻量级的线程,它在执行过程中...

    大数据与云计算教程课件 优质大数据课程 34.SparkSQL(共15页).pptx

    SparkSQL不仅依赖内存列存储和字节码生成技术,还引入了成本模型进行动态查询优化,能够根据实际数据分布和硬件资源自动选择最优的执行计划。此外,其灵活的架构允许用户自定义SQL解析器、分析器和优化器,以便更好...

    字节码编程和操作系统等知识文档

    字节码编程是Java技术领域中的一个重要组成部分,它涉及到Java类文件的二进制表示形式,即Java字节码。Java虚拟机(JVM)在运行Java程序时,实际上是在解释和执行这种字节码。字节码编程允许开发者在类加载到JVM之前...

Global site tag (gtag.js) - Google Analytics