循环识别的C++/Java/Go/Scala实现比较

简介:

 摘要 - 在这个经验报告中,我们用四种编程语言C++/Java/Go/Scala,编写了满足规范的、紧凑的性能测试基准程序。实现中,我们都是使用的实现语言的惯用的容器类,循环结构,以及内存/对象分配方案。它并不试图利用特定的语言和运行时功能,以实现最大性能。这种方法,可以使得语言特性、代码复杂度、编译器和编译时间、二进制文件大小、运行时间、和内存消耗的比较近乎公平。


而基准本身很简单,紧凑,它使用了很多语言特性,特别是高层次的数据结构(列表,地图,集合和列表的列表和数组),少量的算法(联合/查找,DFS /深递归,和基于Tarjan的循环识别),集合类型上的迭代,一些面向对象的特性,和有趣的内存分配模式。我们不使用多线程,或更高级别的类型机制,在这些方面不同语言之间的差别很大。
这个基准测试针对了实现语言的所有待测规模的许多大的差别。这个基准测试在Google内部发布之后,几个工程师又写了一些高度优化的版本。我们描述了许多执行优化,其中大多数是针对运行性能和代码的复杂性。尽管这一努力只是一个有趣的比较,但是基准测试,以及随后的调整工作,表现了各自语言的典型性能痛点。
一、概述
对编程语言效用的分歧,跟编程本身一样古老。今天,这些“语言战争”越来越激烈,但是意义不大,因为越来越多的人正在更多种类设置的平台上的更多语言上工作,例如从手机,到数据中心。
在本论文中,我们讨论了良好定义的算法在四种不同语言上的实现,C++/Java/Go/Scala。在所有的实现中,我们使用的每种语言默认情况下惯用的结构数据,以及默认的类型系统、内存分配方案,和默认的迭代结构。所有四个实现都保持接近算法的正式规范,不尝试任何形式的特定语言优化或适配。
测试基准本身很简单,紧凑。每个实现包含一些支撑代码,用于构建测试算法需要的测试用例,和实现算法本身。
该算法使用了多种语言特性,特别的,高层次的数据结构(列表,地图,集合和列表的列表和数组),少量的算法(联合/查找,DFS /深递归,和基于Tarjan的循环识别),集合类型上的迭代,一些面向对象的特性,和有趣的内存分配模式。
我们不使用多线程,或更高级别的类型机制,在这些方面不同语言之间的差别很大。我们也不会执行大量数值计算,因为省去这个可以放大实现语言的核心特征,特别是内存使用模式。
我们认为,这种做法突出了语言的功能和特征,能在代码复杂度、编译器和默认库、编译时间、二进制大小、运行时间和内存使用等维度进行近乎公平的比较。这些维度的差异大得惊人。
这个基准测试在Google内部发布之后,几个工程师又写了一些高度优化的版本。我们描述了许多执行优化,其中大多数是针对运行性能和代码的复杂性。尽管这一评估只是一个有趣的比较,但是基准测试,以及随后的调整工作,表现了各自语言的典型性能痛点。
论文的其它内容是这样组织的。
第二节,我们简要介绍了四种语言。
第三节,我们介绍了算法,并提供关于如何查找、构建、并运行它的指导。
第四节,我们强调了核心语言特性,因为他们是理解算法实现和性能特性所需要的。
第五节,我们描述了测试基准和方法,包括性能评估。第六节,在做结论前,我们讨论了具体语言的后续调整。
二、竞争者
我们通过提供相关维基百科链接和引用其相关的第一段内容来描述四个竞争者。熟悉这些语言的读者可以直接跳到下一节。
特别说明:其它部分还未翻译完。欢迎感兴趣的朋友留下email加入翻译。














本文转sinojelly51CTO博客,原文链接:http://blog.51cto.com/sinojelly/583048 ,如需转载请自行联系原作者
相关文章
|
12天前
|
jenkins Shell 测试技术
|
12天前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
67 5
|
12天前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
108 1
|
12天前
|
jenkins Java 持续交付
|
12天前
|
jenkins Java 测试技术
|
1月前
|
Java
Java编程:理解while循环的使用
总结而言, 使用 while 迴圈可以有效解决需要多次重复操作直至特定條件被触发才停止執行任务场景下问题; 它简单、灵活、易于实现各种逻辑控制需求但同时也要注意防止因邏各错误导致無限迁璇発生及及時處理可能発生异常以确保程序稳定运作。
196 0
|
3月前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
300 0
|
6月前
|
传感器 安全 Java
《从头开始学java,一天一个知识点》之:循环结构:for与while循环的使用场景
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白
184 22
|
8月前
|
Java
Java快速入门之判断与循环
本文介绍了编程中的流程控制语句,主要包括顺序结构、判断结构(if语句和switch语句)以及循环结构(for、while和do...while)。通过这些语句可以精确控制程序的执行流程。if语句有三种格式,分别用于简单条件判断、二选一判断和多条件判断。switch语句适用于有限个离散值的选择判断,而循环结构则用于重复执行某段代码,其中for循环适合已知次数的情况,while循环适合未知次数但有明确结束条件的情况,do...while则是先执行后判断。文中还提供了多个示例和练习,帮助读者理解并掌握这些重要的编程概念。