`
- 浏览:
17315 次
- 性别:
- 来自:
杭州
-
以具体的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的运行时反射机制很好机制很好解决了这个问题。未完待续,下回分解。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
CGlib的主要作用是通过字节码技术动态地生成新的类或对象,这些类通常作为代理来使用,用于实现动态代理、方法拦截、以及为不支持接口的类提供AOP能力。 **字节码生成** 在Java中,每个类在运行时都会被JVM(Java...
【标题】:“cglib——Java字节码生成库”是一个强大的工具,用于在运行时动态创建和修改类的字节码。它是一个广泛应用于Java开发中的库,特别是那些需要底层控制对象实例化、方法调用等场景的项目。 【描述】:...
ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...
综上所述,"字节码实战"涵盖了Java开发中的核心概念和技术,包括字节码的生成、解析、优化以及其在各种高级技术中的应用。通过深入学习和实践,开发者可以更好地理解Java的运行机制,从而编写出更高效、更安全的代码...
字节码通常是指计算机程序的一种中间表示形式,它是由编译器生成的,介于高级语言和机器语言之间,以单个字节为单位。然而,可变字节码并不局限于单个字节,它的核心在于根据数值的大小动态地选择字节数来编码,从而...
字节码生成:为什么Spring技术很强大?
Java字节码实现AOP(面向切面编程)是一种在程序运行时动态插入代码的技术,它使得我们可以在不修改原有代码的情况下,增加新的功能或监控已有功能。在Java中,AOP通常通过代理模式和字节码操作来实现,如Spring AOP...
在Android开发领域,字节码插桩是一种非常重要的技术,它允许开发者在程序运行时动态地插入代码,以此实现如性能监控、日志记录、权限检查等附加功能。ASM是Java字节码操控和分析框架,它在Android字节码插桩中扮演...
一种Java字节码保护技术的研究和实现 本文研究了一种基于JVMTI的Java字节码保护技术,该技术可以使Java字节码的安全级别相當于传统的二进制代码。该技术的实现可以在Windows和Linux平台下进行。 Java字节码保护...
在Android中,修改运行时内存的Dalvik字节码通常涉及到以下技术: 1. **动态代码注入**:这是一种在程序运行时向其添加新功能或改变已有行为的技术。这可以通过反射、代理类或者Java的动态代理来实现。在Android中...
字节码插桩是一种动态或静态修改字节码的技术,用于在运行时或编译时插入额外的代码。在Android中,我们可以使用ASM、Dexmaker或ByteBuddy等库来实现字节码插桩。LazierTracker就是基于这些技术,它能够在运行时动态...
Java字节码加密是保护Java应用程序源代码安全的重要技术手段,主要是为了防止恶意用户逆向工程分析、篡改或盗取程序的核心逻辑。在Java中,字节码(Bytecode)是程序经过编译后的中间表示,可以直接由Java虚拟机...
2. **字节码生成**:BCEL提供了一套接口和类,使得开发者可以动态地生成字节码,这对于创建动态代理、AOP(面向切面编程)等场景非常有用。 3. **代码优化**:通过修改字节码,BCEL可以实现代码的优化,例如去除...
描述中提到Java字节码是实现“一次编写,到处运行”(Write Once, Run Anywhere)这一Java承诺的核心技术之一。而标签“Java 字节码”直接点明了文档的主题。 Java字节码(Bytecode)是Java源代码编译后生成的指令...
ASM字节码库是Java字节码操作的强大工具,它允许程序员在运行时动态生成类或者增强已有类的功能。在本实例中,我们将探讨如何利用ASM实现简单的面向切面编程(AOP)功能,这是一种在不修改源代码的情况下,添加额外...
Java字节码文件查看工具,如JD-GUI,是开发者们深入理解Java应用程序内部机制的重要辅助工具。这类工具能够帮助我们查看并分析.class文件,这些文件是Java源代码经过编译后的二进制形式,包含了运行时所需的所有指令...
传统的破解很麻烦,要在pc上进行,搭建开发环境,反编译dex代码回java,修改后,再编译成dex(困难),打包apk Dalvik字节码编辑器则选择了完全不同的技术路线.既然java编译字节码,而字节码的文档是公开的,那就能够直接解释...
Java字节码增强技术是Java开发中的一种高级技巧,它允许开发者在程序运行时动态修改类的字节码,从而实现一些特殊的功能,比如AOP(面向切面编程)、性能监控、事务管理等。协程是一种轻量级的线程,它在执行过程中...
SparkSQL不仅依赖内存列存储和字节码生成技术,还引入了成本模型进行动态查询优化,能够根据实际数据分布和硬件资源自动选择最优的执行计划。此外,其灵活的架构允许用户自定义SQL解析器、分析器和优化器,以便更好...