循环识别的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 ,如需转载请自行联系原作者
相关文章
|
jenkins Shell 测试技术
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
662 5
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
981 1
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
599 1
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
747 24
|
jenkins Java 测试技术
|
Java
Java编程:理解while循环的使用
总结而言, 使用 while 迴圈可以有效解决需要多次重复操作直至特定條件被触发才停止執行任务场景下问题; 它简单、灵活、易于实现各种逻辑控制需求但同时也要注意防止因邏各错误导致無限迁璇発生及及時處理可能発生异常以确保程序稳定运作。
709 0
|
消息中间件 人工智能 缓存
Go与Java Go和Java微观对比
本文对比了Go语言与Java在线程实现上的差异。Go通过Goroutines实现并发,使用`go`关键字启动;而Java则通过`Thread`类开启线程。两者在通信机制上也有所不同:Java依赖共享内存和同步机制,如`synchronized`、`Lock`及并发工具类,而Go采用CSP模型,通过Channel进行线程间通信。此外,文章还介绍了Go中使用Channel和互斥锁解决并发安全问题的示例。
671 0
|
JavaScript Java Go
Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
970 0