热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计选择的原因导致JVM/CLR语言长期启动?

如何解决《设计选择的原因导致JVM/CLR语言长期启动?》经验,为你挑选了1个好方法。

我正在考虑设计一种编程语言,我希望它以与CPython或Perl大致相同的速度启动.为了在我的语言中做出正确的设计选择以达到这个要求,我正在研究现有的动态语言,看看他们的设计选择如何影响他们的启动时间.许多基于JVM或CLR的语言实现比CPython或Perl具有更长的启动时间.这表明在JVM和/或CLR的设计中做出了设计选择,这导致了这种情况.那是什么选择,为什么这样做?

这是一个由三部分组成的问题:

    动态JVM/CLR语言实现的缓慢启动是一个基本的设计问题,还是只是一个可以通过改进语言实现来纠正的小问题?

    如果这是一个设计问题,那么JVM的哪些设计选择以及这些语言的设计选择会导致这些语言的启动延迟比CPython和Perl更长?

    为了缓慢开始,获得了什么?也就是说,由于(2)所描述的设计选择,JVM/CLR动态语言对CPython和Perl缺乏什么好处?

请注意,其他SO问题已经处理" 为什么JVM启动缓慢? "以及各种JVM语言启动速度慢的原因.这个问题与那个问题截然不同,因为这个问题与设计权衡有关; 是为了换取那么长的启动时间而获得的收益?

其他SO问题询问用户如何加速各种JVM语言(答案往往是有一些预加载JVM的守护进程),但这不是我在这里要求的; 我问你如何设计一种允许快速启动(没有预加载)的语言(和/或虚拟机),以及为了换取这种情况你会失去什么.

背景研究

各种语言实现的速度

我在我的GNU/Linux机器上的非正式Hello World测试中对CPython和Perl进行了基准测试,发现它们的启动时间不到0.05秒.在这篇文章的其余部分,我会说"快速"意味着"启动时间不会比CPython或Perl更长",而"慢"意味着其他情况.

这是很容易找到的意见的是JVM本身和/或Java是慢启动(3,4,5,6),以及混凝土1秒或更长的数量级上的数字(7,27)和基准(8).但是2个Hello世界JVM基准开始仅为0.04秒(在GNU/Linux)(9,10).

Clojure的有大约0.6-1秒的启动时间(1,2); 这比我0.05秒的目标慢约20倍.ClojureCLR甚至更慢(1).Clojure启动时基准和讨论可以在博客文章Clojure bootstrapping(Kariniemi)中找到,为什么Clojure缓慢(Trojer).

一个创业时间的基准测试人员说,Clojure和JRuby "明显慢于其他所有人"(25); 这些也是仅有的两种基于JVM的动态语言.另一个(非常古老的)基准测试表明,Jython的启动速度也很慢(26).我们在这个问题上专注于动态语言,但是Scala的速度也不是很快(1).有一个名为Kawa的JVM Scheme (23).据报道,Kawa的启动时间约为0.4(24),比Clojure快,但仍比我的目标高出一个数量级.

启动期间有哪些实现?

两个(1,2)得出结论,Clojure是花费其启动时间加载类和初始化clojure.core命名空间.一个答案,以SO问题"的Clojure应用启动性能",似乎是说,Java的启动时间和Clojure的启动时间之间的区别是因为Java地装载它的标准库,而Clojure中加载其急切地问道.对SO问题的回答" 任何Clojure实现能否快速启动? "包括"它只是一个可以纠正的实现问题,而不是一个基本的设计选择"(转述),以及"JVM的一个限制是必须在初始化时复制对象,"不能在字节代码中嵌入任何复合常量.甚至不是数组."").

一篇博客文章指出,ClojureCLR的启动时间主要用于JITing,而JITing之前的时间大幅度下降(尽管与CPython和Perl相比,它仍然可能很慢).

一个解释提供了为什么一些JVM或Java程序启动缓慢的原因是从标准库中加载许多类文件I/O(11).这个假设得到了基准测试的支持,这些基准测试表明JVM启动时间大大改善了"热启动",可能是标准库类文件的内容已经加载到操作系统的缓存中.有人说,太多的启动时间是由于在类文件I/O读取,但由于数据量巨大,而在磁盘上的数据的不理想的组织(因为,不是15,16).

JVM的字节码验证器可能不是启动时间的重要贡献者,因为验证器的40%加速仅转化为大程序启动时间的5%加速(14).

哪些设计选择(不)导致启动缓慢?

在(22)中,Kariniemi得出的结论是,由于包含动态特征的设计选择,Clojure启动本身就很慢.但是,我质疑这个结论,因为CPython和Perl实现了更快的启动,同时仍然提供了动力.

使用字节码不是原因,因为CPython也使用字节码.

因为加载类文件的I/O似乎有问题,所以可能会怀疑底层设计选择是提供大型标准库.但是,这不是原因,因为CPython还提供了一个大型标准库并且启动速度不慢.此外,尽管Java的缓慢存在争议,但值得注意的是Java必须在启动时加载rt.jar,但Hello World根据一些基准测试在Java中运行速度很快.



1> 小智..:

启动时间取决于运行时实际开始执行任何"用户代码"之前所需的工作量.让我比较一些选择究竟发生了什么.

原生二进制(C++左右)

操作系统将主可执行文件映射到内存中.即使这个文件非常大(几GB),映射仍然非常快.它的速度非常快,典型文件大小为10-50MB.然后读取一些可执行标头,它提供列表动态模块.这些模块由OS搜索并以相同的方式映射.然后,可能会发生一些重新定位.在此之后,您的代码已准备好执行(尽管此时的控制可能是您的语言运行时,而不是代码本身).

脚本语言

在上一节中描述的所有内容都发生在解释器可执行文件之后,它开始读取并执行提供的脚本.让我们假设没有解析/编译到字节码(我们已经拥有.pyc或类似的字节码格式).每个模块解释器都需要加载,它只需分配足够长的内存块并将模块内容复制到其中.然后它将控制转移到这个字节码块.在这个阶段确实必须完成一些工作,但通常不是很多.例如,那就是将要执行的python 模块的字节码.disimport dis

去JVM

对于JVM来说,它并不那么容易.首先,运行时不能只将.class文件"映射" 到内存中,也不能将其内容读入内存并告诉解释器:"嘿!这是你的字节码".需要进行验证解决.

验证的目的是确保解释器可以在没有任何进一步的运行时检查的情况下执行(函数外的分支,堆栈溢出或下溢,类型检查).即使我们假设O(指令的数量)时间限制进行​​验证,它仍然是相当的,因为必须检查模块中的每条指令.请记住,对于脚本语言,我们在加载方面有一些工作,通常只是用新函数和类来填充"导出"字典.

Resolve是一种优化(和语言设计选择).考虑java代码:

System.out.println("Hello, world!");

对于此代码,java编译器将.class文件信息放入println:println是一个静态方法,带有签名(ILJAVA/LANG/STRING;)V,来自类java.lang.System.当加载包含上述行的类时,JVM必须查找java.lang.System(可能在进程中加载​​它),println使用此签名查找方法,并将指针放在某处,以便以后可以在执行此行时找到它.

必须对每个已加载类中的每个唯一方法调用执行此过程.每个引用的类,字段,接口等都相同.因此加载大.class文件不是"将内容复制到内存"和"执行一些环境调整".

有足够大的标准库,这些操作本身已经导致启动时间长.

编译(至少优化编译)很慢.记住编译一个体面的C++项目需要多长时间.因此,用于使此操作更快的各种技巧.在JVM中(至少在某些实现中),解释和JIT编译可以并行执行,因此默认情况下会解释代码,如果确定代码是"热"(经常执行),则JIT编译.但解释也很慢.因此,它不是一个神奇的子弹,只是在"做事慢"或"根本不做它们之间进行权衡,并希望JIT能尽快完成工作".没有jit支持的Python只是"慢慢地".但是标准库(如字典)的一些性能关键部分是用C语言编写的(或Java或C#,而不是Python本身).Java标准库是用Java编写的.那'

摘要

    这些缓慢的启动时间是一个设计问题.这是"几乎和C一样快"并且同时具有高度动态的价格.

    导致这种减速的设计选择是:加载时间而不是执行时间的字节码验证,加载时间链接和JIT编译.

    正如我所说的,这允许JVM使用JIT生成代码,这几乎与本机语言中的代码一样快(甚至在某些测试中更快).

结论

如果您希望启动时间较短,请设计您的语言,使运行时无需为加载模块做大量工作.充其量,没有比复制+环境更新更多的工作.

JIT开销可以使用JIT缓存或Ahead-of-Time编译进行打击.如果您的语言是完全动态的,则情况并非如此(例如,您可以在某些模块中覆盖'array.length'属性,标准库也必须尊重此更改).


推荐阅读
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • SWIG 3.0.12 Windows官方版下载:实现C语言与PHP、Java、Python等多语言代码互调接口
    SWIG 3.0.12 Windows官方版是一款强大的接口生成工具,能够实现C语言与多种高级编程语言(如Java、C#)及脚本语言(如PHP、JavaScript、Python)之间的互操作性。它不仅支持跨语言调用,还提供了丰富的封装选项,确保了代码的高效性和可维护性。 ... [详细]
  • R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的RossIhaka和RobertGentleman开发(也因此称为R),现在由R开 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • Java虚拟机内存管理与优化技术深入解析
    Java虚拟机内存管理与优化技术深入解析 ... [详细]
  • 从 Java 过渡到 Ruby,不仅是一次编程语言的转换,更是一段技术进阶的旅程。本文将深入探讨两种语言在语法、生态系统和开发模式上的差异,帮助开发者顺利实现转型,并在新的环境中高效地编写高质量代码。 ... [详细]
  • 提升Python多环境管理效率:深入探索多Python Pip应用策略
    提升Python多环境管理效率:深入探索多Python Pip应用策略 ... [详细]
  • 本文深入解析了 Python 爬虫技术在 B 站数据挖掘中的应用,通过分析海量用户行为和内容数据,揭示了热门 UP 主成功的背后因素。Python 作为一种强大的编程语言,其面向对象和解释执行的特点使其成为数据抓取和处理的理想选择。文章详细介绍了如何利用 Python 爬虫技术获取 B 站的数据,并通过数据分析方法,探讨了热门 UP 主的创作策略和互动模式,为内容创作者提供了有价值的参考。 ... [详细]
  • JVM上高性能数据格式库包Apache Arrow入门和架构的示例分析
    小编给大家分享一下JVM上高性能数据格式库包ApacheArrow入门和架构的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Apac ... [详细]
author-avatar
小灿灿90_794
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有