V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Rwing
V2EX  ›  Debian

来自 debian 团队的各大语言性能测试数据

  •  2
     
  •   Rwing · 2021-01-26 14:18:09 +08:00 · 12843 次点击
    这是一个创建于 1401 天前的主题,其中的信息可能已经有所发展或是发生改变。

    debian 团队对每一个语言进行了 10 种算法的测试,结果包括了耗时,内存等等数据,并且基本上各语言都是最新版.

    但是原始数据看起来不是很直观,我把它汇总做了个柱状图,结果如下.

    更多子项的柱状图数据在这里

    https://github.com/Rwing/debian-benchmarks-game-visualization

    原始数据来自 debian

    https://benchmarksgame-team.pages.debian.net/benchmarksgame/

    第 1 条附言  ·  2021-01-27 08:51:49 +08:00
    一觉醒来,这么多关注,有几点错误可能要解释下:
    1.这个数据确实不是 debian 团队官方,作者是 Isaac Gouy,关于他的更多资料我没查到
    2.汇总数据采用的算法是所有 10 项测试以第一名为基准的比值相加而不是绝对时间结果相加
    3.go 为什么比 java 还慢?事实上,在 10 项测试中 go 胜出了 7 项,但是在输的其中一项里落后 java 一倍还多,导致整体落后了
    4.内存的原始数据似乎就有些问题,我不信 pascal 只需要 8byte 内存😂
    所有测试代码参见他的原始仓库
    https://salsa.debian.org/benchmarksgame-team/benchmarksgame
    119 条回复    2021-01-27 15:13:31 +08:00
    1  2  
    Huelse
        101
    Huelse  
       2021-01-27 11:37:10 +08:00
    @nutting #26 rust 不是取代 java 的,主要目标应该是 C++和 C
    jswh
        102
    jswh  
       2021-01-27 11:39:38 +08:00
    @MrCard python 简单,数据处理库多,node 没有这些生态
    SWALLOWW
        103
    SWALLOWW  
       2021-01-27 11:40:37 +08:00
    c#天下无敌,来战,生态,不存在的
    Flymachine
        104
    Flymachine  
       2021-01-27 11:46:45 +08:00
    @lewis89 你这因果关系倒了。
    1. QT 的 binder 确实很多,但官方开发套件是 C++的,所以是为了 QT 上 C++。
    2. 很多时候,是因为成员会 C++,所以上 QT 。毕竟时常也会遇到要压榨性能的项目,或者项目的某一部分需要压榨性能。

    话说,pyQT 在很多场景确实足以,我现在内部项目一般就是愉快地用 pyQT 来撸,完全不想用 C++了。不过考虑到未来的饭碗,Rust 和 Go 该研究还得研究啊
    lewis89
        105
    lewis89  
       2021-01-27 11:51:47 +08:00
    @Flymachine #104 不是,需要压榨的 封装好 暴露 C ABI 然后用胶水语言 去黏合就好了.. 没必要为了 C++而 C++ ,因为写 C++ 头疼..
    Jirajine
        106
    Jirajine  
       2021-01-27 11:56:37 +08:00 via Android
    @ryd994 难用就会导致你实际中写出的程序变慢。c 最快应该说是理论上最快,实际中影响因素很多。就像我上面说的那个字符串的例子,确实理论上可以自己实现,但因为没有统一的标准,你和其他库交互时还是得转回来,一来一去还是快不起来。
    superrichman
        107
    superrichman  
       2021-01-27 12:06:57 +08:00 via iPhone
    python 跑起来慢没关系,写起来快就好了🐶
    wms
        108
    wms  
       2021-01-27 12:30:03 +08:00
    @Jirajine 你举的例子本身就是有问题的, 取子串 C 只需要在最后赋值一个 0, 而使用其他语言照样要赋值一个 size
    mmdsun
        109
    mmdsun  
       2021-01-27 12:36:10 +08:00 via Android
    go 比 Java 慢意料之中。编译器现在没有搞好。Java JIT 优化太强了
    Jirajine
        110
    Jirajine  
       2021-01-27 12:45:15 +08:00
    @wms #108 你这样做就把原字符串 mutate 了,其他语言(fat pointer 实现)可以直接取 slice 。
    wangxiaoaer
        111
    wangxiaoaer  
       2021-01-27 13:30:37 +08:00
    哎,说起内存,我大 java 真是当仁不让啊,后面看到第一张内存图我就感觉非 java 莫属,果然哈哈哈哈。

    Rust 是真的厉害。
    darrh00
        112
    darrh00  
       2021-01-27 13:49:30 +08:00
    这种毫无意义的比较,居然还有人关注,Go 版本的 regex-redux 实现竟然用的是 pcre,做人居然可以这么无底线。。。
    wms
        113
    wms  
       2021-01-27 14:04:32 +08:00
    @Jirajine #110 fat pointer 不是只有 rust 有, C 同样可以用
    pmispig
        114
    pmispig  
       2021-01-27 14:13:01 +08:00
    这图左右翻转一下就符合我的预期了,这样子有点扯蛋
    ryd994
        115
    ryd994  
       2021-01-27 14:27:28 +08:00 via Android
    @Jirajine 请不要用你的经历来代替所有的情况
    Linux 内核是用 C 写的
    Windows 内核是用 C++但关键部分都是 C 。C++部分也只是当作有高级数据结构的 C 来用。
    谁写 C 只用标准库啊。标准库里没有的就得自己实现?
    C string 这点小事。内部库早就有现成的实现了。常见的数据结构,比如链表,hash table,都是现成的。

    对某些领域来说,简单,可控,比易用更重要。用标准库来说明语言的效率?
    Jirajine
        116
    Jirajine  
       2021-01-27 14:59:05 +08:00 via Android
    @ryd994 不是所有项目都有一套“内部库”,开发者选择简单、省事、现有的低效实现是很常见的状况。
    不否认你说的的 C 的所有优点,简单、直接、可控。理论上的效能 C 也确实拥有最高的上限。但语言的标准、库、生态实实在在地影响实际上的软件性能。比如 ripgrep 和 fd 的性能明显的好于 GNU 的 grep 和 find 。
    ryd994
        117
    ryd994  
       2021-01-27 15:04:38 +08:00 via Android
    @Jirajine 那照你的说法应该 Python 或者 java 最快啊。只要挑其他语言标准库里没有的功能,或者标准库里实现不好的功能。无敌啊,完爆啊。Python 最快,你满意了吗?
    Flymachine
        118
    Flymachine  
       2021-01-27 15:07:32 +08:00
    @lewis89 #105 这点我当然了解。内部项目也是这么做的(Qt for python)。但对外的项目,是一整个团队的事,所以没法这么做。懂得都懂。

    至于我自己,
    早年间我被中间语言坑过,所以我对 C#和 Java 都比较抵触。还好编程语言学习更多的是个人兴趣的事,毕竟编程语言大都是图灵完备语言,功能上没啥差异。所以我自然会更关注和更想学 Rust 与 Go 这种天生就可以编译成机器码的语言。
    ryd994
        119
    ryd994  
       2021-01-27 15:13:31 +08:00 via Android
    @Jirajine 你这明显就是刚入门没多久只会用库的想法。
    标准库是工具,不是束缚。大项目里,某些函数自己实现一套是很正常的事。标准库只是一个参考实现。但不可能涵盖所有的需求。
    就算你用一个标准库性能逆天的语言,你还是得自己实现一遍。

    知道为什么内核都是用 C 吗?贴近硬件,语言结构单纯是一方面。更重要的标准库绝大部分函数都没法用。因为标准库都是以用户空间为前提的。gc ?我不需要啊,我求你别 gc,触发一个 gc 我中断就要爆了。

    有的程序要快速实现,那有健全生态的语言当然方便。然而也有很多软件是不计人力成本,只为了挤出最后一滴性能的,那 C 才是最佳选择。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:19 · PVG 21:19 · LAX 05:19 · JFK 08:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.