0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何比较两种截然不同的编程语言的性能

Q4MP_gh_c472c21 来源:博客 作者:Nibble Stew 2021-09-02 14:55 次阅读

自从编程语言诞生以来,人们常常就哪种语言速度最快的问题争论不休。无论是严肃的科学研究,还是深夜酒吧的喧嚣,都不乏关于这个话题的争执。文本不打算就这个问题展开讨论,我们不妨从一个更高的层面来看一看这个问题:

如何比较两种截然不同的编程语言的性能。为了进行有意义的比较,我们必须使用两种编程语言实现一系列测试程序,运行基准测试,然后再比较最后的结果。

实际上,这种比较的难度很大,有时甚至非常费时费力。尽管问题本身看起来很简单,但大量可能出现错误的地方会导致一无所知的性能测试员遭遇坎坷,有时即使非常了解也无济于事。

01 等效的实现?

为了公平地比较两种语言的实现,编写出来的程序的质量应该达到同等水平。也就是说,必须由某位对两种编程语言以及领域知识的掌握程度大致相同的人来编写程序。这本身就很难。如果由不同的人来编写实现,那么他们可能会选择不同的算法来解决问题,这样的性能比较就不再是编程语言本身的问题,而是每位程序员选择的编程方法的问题。

即使两个实现都是由同一个人使用相同的算法编写的,仍然存在其他问题。通常,每个人都有自己擅长的语言。因此,他们会选择自己喜欢的语言提供更快的实现。这就会引发偏差,因为这样的性能比较衡量的不是编程语言本身,而更多的是程序员。这类的测试适合寻找易用性与生产力的差异,但对比较性能而言则不合适。

因此,你可能需要评估许多专业程序员已经编写好的程序。这是一个很好的方法,但有时即使是经验丰富的研究也会出错。有一篇论文试图通过这种方法比较不同的编程语言的性能和效率。

他们的测试结果表明,某个程序用C实现比C++实现快30%。这个测试结果影响了整个论文的基调。按照这个论断,假设将所有 C 源代码的文件扩展名 .c 改为.cpp并重新编译,应该能得到大致相同的结果(可能会有几个百分点的误差)。所以我们只能得出以下结论(按照可能性从高到低排列):

C++版本的代码比较差;

测试方法有明显的瑕疵;

与C相比,该编译器对C++的性能有重大的负面影响。换句话说,上述呈现的差异并非来自编程语言本身。

02 测量的难度

还有一个很大的问题是,如何测量某个程序的性能。一种常见的方法是连续运行多次测试,然后执行如下操作:

处理异常值:去掉两个极值(即最慢和最快的测量值);

计算剩余数据点的平均值和/或中位数;

比较不同程序之间的结果,速度最快的程序获胜。上过统计课程的人可能还记得如何计算标准差。这种方法看似合理且严谨,但其实包含多个系统误差。其中最大的问题涉及测量中的噪声。

大多数基本的统计工具都会假设误差呈正态分布,平均值为零。如果测量的是温度或速度之类,则这个假设是合理的。然而,对于编程语言的性能测量来说,这个假设并不合理。程序的运行时间包括实际上花费在解决问题上的时间,以及来自操作系统中断、磁盘访问等方面的开销。如果我们假设噪声为平均值为零的高斯噪声,那么这意味着计算机有一些未知的过程,可以让程序的运行速度超过完全无噪声时的情况。这当然是不可能的。这里的噪声肯定不是高斯噪声,因为它永远不会出现负值。

事实上,最接近柏拉图式理想答案的测量结果就是最快的,因为这种情况下来自系统噪声的干扰最少。这样的测量结果会被上述第一步操作“处理异常值”删除。有时,采用合理的、现成的措施只会让事情变得更糟。

03 统计的难度更大

暂时撇开这一点不谈,我们假设我们获得了两个程序的性能测试结果,且这个结果看似确实“很高斯”。数值分析表明,1号语言的运行花费了10秒,而2号语言花费了9秒。二者的差异为10%,因此我们就可以得出结论:2号语言的速度更快。这个结果正确吗?

很遗憾,不正确。

右边的那个更快,对不对?也许?大概?可能?为了正确回答这个问题,我们需要回顾一下大学学习的统计知识。首先,提出零假设,即假设两个程序没有性能差异。接着,计算这两次测量结果来自同一个概率分布的概率。

如果概率非常小(通常为5%),则可以推翻零假设,从而证明其中一个程序比另一个快。这种方法叫做学生t检验,常用于大量数据的统计。请注意,测试的某些实现会假设数据符合高斯分布,如果你的数据呈现其他形状,则结果可能并不可靠。

这种方式适用于一个程序,但严格的测试需要包含多个程序。这些评估也有一些统计方法,但会非常复杂。具体的做法留给读者自行查阅。

04 所有计算机的对齐都是双刃剑

虽然统计非常难,但幸运的是计算机很简单,因为它们具有确定性、可靠,而且合乎逻辑。例如,如果在一个程序中添加一条NOP指令,则结果可能只是多了一个指令周期,对性能的影响小到无法测量。

但是,如果你非要测量,那么结果可能会让你陷入不解和困惑。这个小小的改动有时会让程序的运行时间增加10%(甚至更长),但也有可能缩短10%。你没看错,这类看似无意义的工作可以加快程序的运行速度。如果是第一次遇到这样的问题,你可能压根不会相信。

那么,问题在于,是否有可能让CPU加倍努力,让程序更快地运行呢?答案为否。实际的指令根本无关紧要。重点在于代码的对齐。代码在内存中的不同位置会影响其性能特征。

如果一段经常被执行的循环跨越了缓存边界,它就会变慢。将其移动到不跨越边界的地方就能加快其速度。NOP指令并不一定要放在循环内,只要它能将整个代码块向上或向下移动,就可能导致这种差异。

假设你以非常严谨的统计方式测量了两个程序。如果二者之间的性能差异低于10%,则我们就无法断言哪个程序更快,除非你使用的测量方式能够消除对齐效应。

05 这是关于机器的性能测量,而不是语言

随着程序的运行速度越来越快,优化经历了一个有趣的阶段转变。一旦性能达到一定水平,系统就不再关心编译器和CPU如何才能加快程序的运行速度。相反,变成了程序员如何尽可能有效地利用CPU,例如将数据排列成方便处理器处理的布局等。

这意味着用基于硬件的原语替换基于语言的原语。某些圈子采用的优化方式非常奇怪,程序员甚至知道他们的循环应该被优化成哪些SIMD指令,然后他们会不停地修改代码,直到实现这种优化。其实,这种优化已经与编程语言本身的功能没有丝毫关系了。

这就是为什么C和Fortran之类的语言仍在许多性能基准测试中名列前茅的主要原因,但这些技巧并不限于这些语言。几年前,我开发了一款规模非常大的Java应用程序,该应用程序经过了非常彻底的优化。

其内部由整数数组组成。最常执行的路径中没有类,甚至没有Integer对象,基本上就形同于在Java语言内部重塑了C语言。其实,几乎任何编程语言都可以有类似的实现。

它们之间的性能差异主要取决于每个编译器的优化器。即便使用相同的编程语言,也会产生截然不同的性能结果,更不用说不同的编程语言了。因此,声称某一种编程语言在性能上有明显的优势都是不合理的,因为说到底都是内联汇编程序。

原文链接:

https://nibblestew.blogspot.com/2021/02/why-most-programming-language.html?m=1

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92424
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72901
  • 源代码
    +关注

    关注

    95

    文章

    2929

    浏览量

    66066
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48627

原文标题:为什么大多数编程语言性能对比都有问题?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    无线电路的超外差式接收和超再生式接收有何区别?

    无线电路中的超外差式接收和超再生式接收是两种截然不同的接收方式,它们在原理、性能、应用等方面均存在显著差异。
    的头像 发表于 04-08 18:13 366次阅读

    fpga用的是什么编程语言 fpga用什么语言开发

    fpga用的是什么编程语言 FPGA(现场可编程逻辑门阵列)主要使用的编程语言是硬件描述语言(H
    的头像 发表于 03-14 17:09 905次阅读

    fpga芯片用什么编程语言

    FPGA芯片主要使用的编程语言包括Verilog HDL和VHDL。这两种语言都是硬件描述语言,用于描述数字系统的结构和行为。
    的头像 发表于 03-14 16:07 576次阅读

    变频器的两种无速度传感器矢量控制模式有什么区别?

    在变频器控制模式中,有无速度矢量传感器模式,该模式又分为两种,无感矢量0和无感矢量1,这两种模式的本质原理是什么?对变频器的控制电机性能和系统稳定性响应什么的有什么影响?具体应用上哪种方式更好一点,或者而言这
    发表于 02-22 21:45

    plc编程语言与c语言的联系 c语言和PLC有什么区别

    PLC编程语言与C语言的联系 PLC(可编程逻辑控制器)是一种针对自动化控制系统的特殊计算机。PLC编程
    的头像 发表于 02-05 14:21 1093次阅读

    vb语言和c++语言的区别

    VB语言和C++语言两种不同的编程语言,虽然它们都属于高级编程
    的头像 发表于 02-01 10:20 605次阅读

    脚本语言编程语言的区别

    脚本语言编程语言是计算机语言的两个主要分类。尽管两者都是用于编写计算机程序的工具,但它们在设计和运行方式上存在一些显著的区别。下面将详细探讨脚本
    的头像 发表于 11-22 14:33 1406次阅读

    常见的ARM架构分为两种是M系列另外一是A系列,这两种有什么区别啊?

    现在市面上常见的ARM架构分为两种是M系列另外一是A系列,这两种有什么区别啊,用的时候他们一般分别用在什么地方啊。
    发表于 10-26 07:00

    对与性能比较低的51单片机,结构化编程性能提升多少?

    对与性能比较低的51单片机,结构化编程性能提升多少
    发表于 10-26 06:21

    五种支持plc编程语言有哪些

    在PLC控制系统设计中,不同型号的PLC编程软件对以上五种编程语言的支持种类是不同的,所以不但对PLC的硬件性能了解外,也要了解PLC对编程
    发表于 08-31 14:54 700次阅读
    五种支持plc<b class='flag-5'>编程</b>的<b class='flag-5'>语言</b>有哪些

    PLC编程语言的特点

    PLC的编程语言与一般计算机语言相比,具有明显的特点,它既不同于高级语言,也不同与一般的汇编语言,它既要满足易于编写,又要满足易于调试的要求
    的头像 发表于 07-04 17:13 597次阅读

    西门子PLC编程语言介绍

    PLC目前有5种标准的编程语言,包括图形化编程语言和文本化编程语言
    发表于 06-29 16:00 951次阅读
    西门子PLC<b class='flag-5'>编程</b><b class='flag-5'>语言</b>介绍

    基于PASCAL的高级编程语言——SCL编程语言

    根据该标准,可对用于可编程逻辑控制器的编程语言进行标准化。SCL 编程语言实现了该标准中定义的 ST
    发表于 06-20 10:20 1074次阅读
    基于PASCAL的高级<b class='flag-5'>编程</b><b class='flag-5'>语言</b>——SCL<b class='flag-5'>编程</b><b class='flag-5'>语言</b>

    嵌入式用什么语言编程?

    、结构化等方面对C进行了卓有成效的改进,但是在程序代码容量、执行速度和程序复杂程度等方面比C语言程序性能差一些。 当然也有很多学员或是已经就业的学员说,嵌入式技术中应用多的语言编程是C
    发表于 05-18 10:08

    上位机编程用什么语言 上位机编程软件哪个好

    上位机编程可以使用多种编程语言来实现,具体取决于应用场景、控制任务以及硬件设备的特性等因素。以下是一些通常用于上位机编程编程
    的头像 发表于 05-08 15:35 1.2w次阅读