循环识别的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 ,如需转载请自行联系原作者
相关文章
|
1天前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
3月前
|
存储 Java
|
16天前
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
33 6
|
1月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
20 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
26天前
|
Java 测试技术 数据安全/隐私保护
📖Java零基础-while循环语句的深度解析
【10月更文挑战第6天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
26 1
|
27天前
|
传感器 Java 测试技术
📖Java零基础-do-while循环语句的深入剖析
【10月更文挑战第5天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 1
|
2月前
|
Java
java基础(2)循环语句for、while、do...while
本文介绍了Java中的基础循环语句,包括for循环、while循环和do...while循环。文章通过示例代码展示了for循环的基本结构和用法,while循环的先判断后执行逻辑,以及do...while循环的先执行后判断逻辑。这些循环语句在Java编程中非常常用,用于执行重复的任务。
45 4
java基础(2)循环语句for、while、do...while
|
2月前
|
Java
Java循环
Java循环
42 6
|
2月前
|
编译器
Java--for循环语句
Java--for循环语句
|
3月前
|
存储 Java
如何在 Java 中循环 ArrayList
【8月更文挑战第23天】
37 2
下一篇
无影云桌面