循环识别的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 ,如需转载请自行联系原作者
相关文章
|
26天前
|
Java API C++
Java JNI开发时常用数据类型与C++中数据类型转换
Java JNI开发时常用数据类型与C++中数据类型转换
44 0
|
10天前
|
算法 程序员 编译器
C++的四类循环分享
C++的四类循环:Entry or Exit controlled, Ranged-based or For_each
|
16天前
|
C++
C++一分钟之-循环结构:for与while循环
【6月更文挑战第18天】在C++中,`for`循环适合已知迭代次数,如数组遍历;`while`循环适用于条件驱动的未知次数循环。`for`以其初始化、条件和递增三部分结构简洁处理重复任务,而`while`则在需要先检查条件时更为灵活。常见错误包括无限循环和逻辑错误,解决办法是确保条件更新和正确判断。了解两者应用场景及陷阱,能提升代码效率和可读性。
27 6
|
19天前
|
Java Go C#
编程语言C#、C++、Java、Python、go 选择哪个好?
我想说的是,不论选择哪种编程语言,决定选择的都是你最终的目的,做选择之前,先充分调研每一个选择项,再做选择思路就会非常清晰了。
37 3
|
19天前
|
Java C++
java和C++的标志符可以是中文(虽然不提倡)
java和C++的标志符可以是中文(虽然不提倡)
|
20天前
|
C语言 C++ 容器
c++primer plus 6 读书笔记 第五章 循环和关系表达式
c++primer plus 6 读书笔记 第五章 循环和关系表达式
|
22天前
|
Java API Scala
Java一分钟之Scala与Java集成
【6月更文挑战第12天】本文探讨了Scala与Java的集成实践,强调两者在包导入、类型推断和重载方法解析上的差异。为避免问题,建议Scala中明确导入、显式标注类型,并了解重载规则。示例展示了如何在Scala中调用Java静态方法。另一方面,Java调用Scala时需注意Scala特性的不可见性、命名约定和伴生对象。为保持兼容性,应遵循Java友好原则,使用Java兼容命名,并暴露静态方法接口。通过理解这些问题和采取相应措施,可实现高效的跨语言工作。
27 2
|
5天前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
8 0
|
8天前
|
Go
go循环语句
go循环语句
6 0
|
12天前
|
Scala
scala 读取文件(中文)异常 thread "main" java.nio.charset.MalformedInputException: Input length = 1
scala 读取文件(中文)异常 thread "main" java.nio.charset.MalformedInputException: Input length = 1
13 0