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

这个各大语言性能测试结果挺有意思

  •  3
     
  •   wdwwtzy · 2022-06-27 13:06:40 +08:00 · 20283 次点击
    这是一个创建于 662 天前的主题,其中的信息可能已经有所发展或是发生改变。
    182 条回复    2022-10-29 16:50:11 +08:00
    1  2  
    encro
        101
    encro  
       2022-06-27 18:31:24 +08:00
    @Chad0000


    c# runtime 决定了一切。
    icyalala
        102
    icyalala  
       2022-06-27 18:32:43 +08:00
    @Mark24 你这个简单到根本不能用啊。。
    想要作弊的话 C++ 直接编译时就出来了: https://godbolt.org/z/8WWYd6zvd
    Mark24
        103
    Mark24  
       2022-06-27 19:16:38 +08:00
    @icyalala 计算密集型跑。为啥要作弊?作弊还有什么意义。 其他语言也可以直接填结果
    minsheng
        104
    minsheng  
       2022-06-27 19:24:53 +08:00
    这里有具体的子任务 Swift vs Java: https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/swift.html

    Swift 慢的原因很简单,所有涉及堆分配的操作(包括但不限于 class 、indirect enum ),都要使用引用计数,引用计数必须是一个原子操作,在 Intel 处理器上慢很多( M1 、A14 的情况会好不少)。所以你们看上面那个页面,大部分的情况下 Swift 对 Java 就是 native 对 bytecode 的性能,Swift 跟 C 没啥区别,但到最后的二叉树……跪惨了。

    这个问题要解决,要不然就直接用裸指针,不是不能写,写出来也不一定比 C 难维护,不过确实有点耍赖的感觉。要不然就等 Swift 的所有权啥的继续推进,然后尽可能优化掉不必要的引用计数开销。
    Mark24
        105
    Mark24  
       2022-06-27 19:35:30 +08:00
    @icyalala 这个网站里不加 -O 才对吧。编译的应该是函数本身。 我的测试用的无参数。

    https://imgur.com/a/tKR7eaX
    Mark24
        106
    Mark24  
       2022-06-27 19:36:10 +08:00
    @icyalala 这个网站里不加 -O 才对吧。编译的应该是函数本身。 我的测试用的无参数。

    https://imgur.com/s0o4f0c
    Mark24
        107
    Mark24  
       2022-06-27 19:37:06 +08:00
    蛋疼。这个发图真是头大。

    无参数 GCC 编译。

    musi
        108
    musi  
       2022-06-27 20:11:39 +08:00
    node 显然是 v8 优化的好
    icyalala
        109
    icyalala  
       2022-06-27 20:18:58 +08:00 via iPhone
    @musi 对 C/C++ 来说,讨论语言性能不开编译优化是没意义的
    icyalala
        110
    icyalala  
       2022-06-27 20:19:36 +08:00 via iPhone
    icyalala
        111
    icyalala  
       2022-06-27 20:20:20 +08:00 via iPhone
    @Mark24 回错人了… 手机点起来不方便
    icyalala
        112
    icyalala  
       2022-06-27 20:26:01 +08:00 via iPhone
    @Mark24 你评测的这段代码太小了,如果非要对这段 kernel code benchmark ,那最好在内部取时间,而不是测试 binary 的运行时间,不然系统库和运行时初始化时间都被算进来了。然后不能写死输入,要让外部传入,不然就会出现这类编译期直接得到结果的问题。
    Cyshall
        113
    Cyshall  
       2022-06-27 20:31:41 +08:00 via iPhone
    @Protocol c++牛逼还需要喊?这不是大家默认的?如果掉出前三你看看大家不喷出💩
    Trim21
        114
    Trim21  
       2022-06-27 20:35:48 +08:00 via Android
    @fgwmlhdkkkw 图里有带 jit 的 python pypy (
    Buges
        115
    Buges  
       2022-06-27 20:44:14 +08:00
    这测试不能完全体现常用场景,go 不如 haskell ghc ,pypy 不如 php 。
    DOLLOR
        116
    DOLLOR  
       2022-06-27 20:45:11 +08:00   ❤️ 1
    @fgwmlhdkkkw
    感觉你们这些喷 JS 的,都是在反向奶。JS 从诞生到现在都被喷,结果反而越混越好,反观……
    mxT52CRuqR6o5
        117
    mxT52CRuqR6o5  
       2022-06-27 21:15:30 +08:00 via Android
    @qrobot electron 也算吗?
    nichijou
        118
    nichijou  
       2022-06-27 21:20:43 +08:00
    @abersheeran 这里面 WordPress 占多少。。
    timothyye
        119
    timothyye  
       2022-06-27 21:28:11 +08:00 via Android
    Rust 牛逼
    u823tg
        120
    u823tg  
       2022-06-27 22:07:54 +08:00
    @DOLLOR #116 两个设计上都有缺陷,在各自领域都是一霸。 没啥可比较的。 性能方面 js 作为浏览器指定的语言,不优化的没法用。web 端也发展不起。 python 没这方面要求,发挥胶水语言特性就好。
    koebehshian
        121
    koebehshian  
       2022-06-27 22:36:45 +08:00
    Lua 也太慢了
    jeffh
        122
    jeffh  
       2022-06-27 22:38:12 +08:00
    想不到的是 nodejs 竟然比 ruby 和 python 快
    lysS
        123
    lysS  
       2022-06-27 23:25:48 +08:00
    这个制图真的搞,大多数定眼一看肯定是看 time, 真正排名却是乱序的、时间内存权重是 4:1
    ToBeHacker
        124
    ToBeHacker  
       2022-06-28 00:08:47 +08:00
    Python 往往只是调用层,单看这个其实没啥意义
    AX5N
        125
    AX5N  
       2022-06-28 00:14:27 +08:00
    主流语言里,除了 java 以外,其余都跟我的认知差不多,我感觉 java 还要稍微快一些的。
    llsquaer
        126
    llsquaer  
       2022-06-28 00:26:53 +08:00
    这个图影响我写 python 了么?
    silvernoo
        127
    silvernoo  
       2022-06-28 01:39:32 +08:00   ❤️ 1
    难怪各大游戏引擎喜欢 C#
    twl007
        128
    twl007  
       2022-06-28 06:09:50 +08:00 via iPhone
    @qrobot 大部分项目开发效率远比运行效率重要的多 如果 Discord 一开始用 rust 开发 估计东西还没搞定市场都被抢走了

    也就是现在地位稳固了才有精力投入到重构里面去 根本原因是因为业务大了有了性能要求才去用 rust 而不是单纯的因为 rust 表现好就去用 rust

    另外 go 也可以很快 但是取决于你花多大的精力去优化了
    MrKrabs
        129
    MrKrabs  
       2022-06-28 06:33:20 +08:00
    swift 完全兼容 c (除了宏之类的),当然可以接近 c 的效率,纯粹写代码的人的问题
    zhanghua0
        130
    zhanghua0  
       2022-06-28 08:26:35 +08:00 via Android
    Python 的 Rank 不是倒数第一就算成功(
    SJ2050cn
        131
    SJ2050cn  
       2022-06-28 09:17:05 +08:00
    知道 julia 快,没想到这么快。
    newmlp
        132
    newmlp  
       2022-06-28 09:27:06 +08:00
    @tramm 能有 20%就不错了,某些特殊场景能用到指令加速的,差个几百倍都很轻松
    Guesser
        133
    Guesser  
       2022-06-28 09:40:52 +08:00
    计算机语言测试游戏可视化排行,单单一个维度就能决定一个语言性能是否太草率了?
    cmdOptionKana
        134
    cmdOptionKana  
       2022-06-28 10:00:55 +08:00
    这样看 C# 在好用易用(至少有 GC )的语言中效率是最高的,可惜生态还是比不上 Java 。
    yazoox
        135
    yazoox  
       2022-06-28 10:14:14 +08:00
    不是吧,lua 这么慢的么?那为啥 neovim 推荐使用 lua 写插件?是编译后的 lua ,不是解释执行的?和这个表格里面的速度不一样?
    lilith01
        136
    lilith01  
       2022-06-28 10:15:47 +08:00
    kotlin 呢
    netnr
        137
    netnr  
       2022-06-28 10:20:35 +08:00
    @INCerry #51 新建控制台程序( .net6 .net7 ),添加属性 <IlcDisableReflection>true</IlcDisableReflection> 打包裁剪单文件还是 11M ,姿势不对?
    silkriver
        138
    silkriver  
       2022-06-28 10:26:31 +08:00
    应该说是语言的实现,而非语言
    KeyboardManS
        139
    KeyboardManS  
       2022-06-28 10:30:14 +08:00
    为什么 Fortran 这么拉?这玩意儿不是以速度著称的吗?居然还干不过 C#
    fengjianxinghun
        140
    fengjianxinghun  
       2022-06-28 10:33:19 +08:00
    @KeyboardManS 这个测试 c#作弊,nobody 的数学计算测试项就 c#用的 AVX simd ,rust 就是硬算
    ···

    using System;
    using System.Runtime.CompilerServices;
    using System.Runtime.Intrinsics;
    using System.Runtime.Intrinsics.X86;

    using static System.Runtime.CompilerServices.MethodImplOptions;

    using V256d = System.Runtime.Intrinsics.Vector256<double>;

    public static unsafe class Net60_NBody_AVX_9_3b {

    [MethodImpl(AggressiveOptimization | AggressiveInlining)]
    private static V256d Square(V256d x)
    => Avx.Multiply(x, x);

    [MethodImpl(AggressiveOptimization | AggressiveInlining)]
    private static V256d Permute2x128AndBlend(V256d t0, V256d t1)
    => Avx.Add(Avx.Permute2x128(t0, t1, 0b10_0001), Avx.Blend(t0, t1, 0b1100));

    [MethodImpl(AggressiveOptimization | AggressiveInlining)][SkipLocalsInit]
    private static void InitDiffs(V256d* positions, V256d* rsqrts) {
    V256d* r = rsqrts, p = positions;
    for (int i = 1, k = 0; i < 5; ++i) {
    V256d pi = p[i];
    for (int j = 0; j < i; ++j, ++k) {
    V256d pj = p[j];
    r[k] = Avx.Subtract(pi, pj);
    }
    }
    }
    ···
    INCerry
        142
    INCerry  
       2022-06-28 10:37:08 +08:00
    > 使用 avx 的 c#
    > https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-csharpcore-9.html
    > 直接硬算的 Rust
    > https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-rust-6.html

    @fengjianxinghun 这个应该看汇编代码,rust 可能已经优化成 SIMD 了 C# 这边也有 JIT 优化,但是它只在分层编译情况下。
    wangyzj
        143
    wangyzj  
       2022-06-28 10:38:53 +08:00
    你这个要看具体测试方法是啥把
    tairan2006
        144
    tairan2006  
       2022-06-28 10:39:17 +08:00
    python 最近在提速了,未来可期,战一战 nodejs 应该还是没问题的

    另外就是移除 GIL 的提案看什么时候合入主分支。
    leexy
        145
    leexy  
       2022-06-28 10:40:07 +08:00
    @Protocol #71 因为 C++ 牛逼是意料之中的事儿
    fengjianxinghun
        146
    fengjianxinghun  
       2022-06-28 10:42:56 +08:00
    @INCerry c#人是 avx 手工优化。。比你自动 simd 不知道高那里去了。
    INCerry
        147
    INCerry  
       2022-06-28 10:43:44 +08:00   ❤️ 1
    @fengjianxinghun 那有什么问题呢?有些语言还没办法用 avx 手工优化呢
    INCerry
        148
    INCerry  
       2022-06-28 10:44:34 +08:00
    @fengjianxinghun 你也可以给 rust 手工优化试试 看看能不能超过 C++
    INCerry
        149
    INCerry  
       2022-06-28 10:49:19 +08:00
    > @fengjianxinghun 你也可以给 rust 手工优化试试 看看能不能超过 C++

    @fengjianxinghun 看了下 rust 已经用了手工优化的版本了
    https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-rust-9.html
    fengjianxinghun
        150
    fengjianxinghun  
       2022-06-28 10:51:00 +08:00
    @INCerry 这个层面上语言本身影响就很小了,就是一点抽象开销。
    raptor
        151
    raptor  
       2022-06-28 10:52:04 +08:00
    这种事情自己看看开心就好。

    2011 年的时候 Milo 老师就拿一个光线追踪程序用几种语言实现后对比过性能,我也试着写了几个语言版本的实现,数据与这个图出入还挺大的。有兴趣可以去看看他当年的文章,当时就已经证实了.net 的性能好于 java ,接近 C++。

    都已经过去超过十年了……

    那位拿 chrome 举例的真是很可笑,你是开发 chrome 的吗?基于 chrome 开发和开发 chrome 是一回事吗?

    大家不过都是做 CRUD 的,跟数据库和网络的性能相比,语言的那点性能差距在 99%的情况下是可以忽略不计的。

    真追求性能的人根本不会在这边讨论什么的,直接 C/C++上就是了,关键环节还要用汇编,考虑 Rust 的都很少(因为如果最后为了性能用了很多 unsafe ,还不如直接用 C++),至于 C#和 JAVA 这种可能受 GC 影响的语言根本不在考虑范围,即使性能差距不大。
    INCerry
        152
    INCerry  
       2022-06-28 10:53:51 +08:00
    @netnr
    我特意试了一下,你看看是不是漏引用了 nuget 包
    ```xml
    <Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IlcDisableReflection>true</IlcDisableReflection>
    </PropertyGroup>
    <ItemGroup>
    <PackageReference Include="Microsoft.DotNet.ILCompiler" Version="7.0.0-*" />
    </ItemGroup>
    </Project>
    ```
    然后 `dotnet publish -c Release -r win-x64`
    发布出来的大小:
    IlcDisableReflection.exe 1.5MB
    pkoukk
        153
    pkoukk  
       2022-06-28 11:08:55 +08:00
    看来我是时候捡起来 C#玩玩了
    INCerry
        154
    INCerry  
       2022-06-28 11:12:21 +08:00   ❤️ 1
    > 这个层面上语言本身影响就很小了,就是一点抽象开销。
    @fengjianxinghun 所以不存在啥作弊不作弊 我看 C++ Rust C# 都用上了 SIMD
    ecloud
        155
    ecloud  
       2022-06-28 11:35:48 +08:00
    这种测试并不公平,没有体现到每个语言的业务使用场景。比如上面有人说到 lua 就有只少 2 种运行模式; c++这种东西有 boost,qt 和 mfc 等多种不同的风格; java 更是复杂,spring 和各种商业 J2EE 实现都有很大差别。样板程序的复杂度不足的话,不足以说明问题
    ecloud
        156
    ecloud  
       2022-06-28 11:39:19 +08:00
    @KeyboardManS Fortran 要想快得用 intel 编译器,很贵的。不知道它这个测试用的啥编译器
    Leviathann
        157
    Leviathann  
       2022-06-28 11:42:33 +08:00
    @lilith01 几乎和 java 一致
    @twl007 discord 不是跟国内一帮跟风的一样用 go 写业务,业务是用 elixir 写的,go 是写的中间件,由于 gc 的问题换成了 rust
    netnr
        158
    netnr  
       2022-06-28 11:45:52 +08:00
    @INCerry #152 没有成功

    ./dotnet new console -n Netnr.Native -o demo
    cd demo
    ../dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true -p:PublishTrimmed=true

    以上打包出来 11M ,你说的是最终单文件?
    LawlietZ
        159
    LawlietZ  
       2022-06-28 12:19:00 +08:00
    牛逼
    INCerry
        160
    INCerry  
       2022-06-28 12:32:32 +08:00
    @netnr 是啊 你创建一个项目 然后把项目文件按照我那样改一下 最后用我提到的命令 打包出来的二进制可执行文件就 1.5MB
    你需要引用 Microsoft.DotNet.ILCompiler 这个 NuGet 包
    byzf
        161
    byzf  
       2022-06-28 12:53:48 +08:00
    根据使用体验来说我感觉 rust 还是取代不了 cpp 的。写起来没有感觉比 cpp 快。不过 rust 确实只要编译通过了程序就能跑,而 cpp 经常不行。

    go/java/.net 符合预期。唯一出乎意料的 swift 。

    python 、php 、lua 本质上速度已经不重要了,就看接的库多不多,速度取决于库的速度。

    node 。。本质上用 node 的人不会去和其他的语言比,不用 node 的人也不可能去用 node 。
    novolunt
        162
    novolunt  
       2022-06-28 13:01:45 +08:00
    @byzf 速度取决于库的速度 yyds
    timothyye
        163
    timothyye  
       2022-06-28 13:29:48 +08:00 via Android
    @Protocol C++已经是性能基准了,不用喊牛逼了…
    Mexion
        164
    Mexion  
       2022-06-28 14:08:19 +08:00
    @jeffh js 本来就比 python 和 ruby 快啊,python 慢不是众所周知的吗
    fifa899
        165
    fifa899  
       2022-06-28 15:18:08 +08:00
    JAVA ! YYDS!
    xtinput
        166
    xtinput  
       2022-06-28 15:25:29 +08:00
    @MrKrabs swift 的自动引用计数开销还是要算上的
    icyalala
        167
    icyalala  
       2022-06-28 15:43:11 +08:00
    @ecloud Intel 那套编译器已经免费了,改名叫 oneAPI toolkit
    MrKrabs
        168
    MrKrabs  
       2022-06-28 16:07:59 +08:00
    @xtinput 又没禁止用指针
    yejinmo
        169
    yejinmo  
       2022-06-28 16:35:20 +08:00
    应该再结合开发效率做一个排名
    MiketsuSmasher
        170
    MiketsuSmasher  
       2022-06-28 17:09:39 +08:00
    Python 3 比 Ruby 还慢,这个是我没想到的
    daokedao
        171
    daokedao  
       2022-06-28 17:31:19 +08:00
    Rust 太难了,导致 Servo 难产到现在
    YUyu101
        172
    YUyu101  
       2022-06-28 22:17:28 +08:00
    nodejs 性能这个样子已经可以了,开发效率比 goc#java 要快多了,web 全栈桌面 electron ,移动端 webview 凑活,也就数据分析机器学习方面打不过 python 的生态了,假以时日有望一统江湖啊。
    rpish
        173
    rpish  
       2022-06-29 02:21:00 +08:00
    @DOLLOR 发展好才有人喷 /奶,发展不好的就默默消失了
    featureoverload
        174
    featureoverload  
       2022-06-29 09:36:47 +08:00
    有没有搞一个 [各大语言在终端输出一个 "Hello World!"] 的从零文件 coding 速度排名?

    我先来:

    ```shell
    $ python3 -c "print('Hello World!')"
    ```
    featureoverload
        175
    featureoverload  
       2022-06-29 09:37:30 +08:00
    @featureoverload "从零文件开始 coding"
    KeyboardManS
        176
    KeyboardManS  
       2022-06-29 09:43:57 +08:00
    @ecloud 原来如此 涨姿势了
    x1aoYao
        177
    x1aoYao  
       2022-06-29 10:40:52 +08:00
    Swift 的 class 用的 Arc 要原子计数,Array/Map/Set 这些 CoW 类型也是要原子操作,不管你跨不跨线程都是,这能快得起来吗?
    上面有人提到 Apple 的 M1 为原子操作的优化非常大,所以 Swift 跑在 M1 Mac 上面还算好。不过根本还是要让没有 send 到其他线程的就用 Rc 就好。
    hhjj3388
        178
    hhjj3388  
       2022-06-29 11:25:20 +08:00
    @fengjianxinghun ``你一个#9 一个#6 ····rust#9 的一样开了 simd
    hhjj3388
        179
    hhjj3388  
       2022-06-29 11:27:55 +08:00
    @ecloud 扯什么能··代码是比计算··你 java 就是不行,还框架··底层都不行同样质量的代码框架你还不是不行
    ecloud
        180
    ecloud  
       2022-06-29 13:45:27 +08:00
    @hhjj3388 你看一下 9 楼,不同的库还真不一样。再举个例子,python 连 redis ,装不装 hiredis 差别很大。当然你可以理解这为作弊,但是人家在生产中就是这样用的。另外就算 hiredis 本身不同版本速度就有区别,新版的就是比老板的慢一丢丢。再比如 FIX 库,有的库给你穷举所有标签,几千个元素 map 下来比你硬编码慢一个数量级。同样是排序,你用 boost 现成的和自己硬编码一个链表速度当然不一样。
    v1200347
        181
    v1200347  
       2022-10-29 16:15:37 +08:00
    @ragnaroks 天真 dotnet7 只会更进一步 他们源码都有 你自己去看批判呗 debian 团队大佬写的测试
    v1200347
        182
    v1200347  
       2022-10-29 16:41:12 +08:00
    @icyalala 知名个嘚 2.4k 的赞也算知名 而且直觉看这些测试全是些没什么鸭梨的东西 根本测不出多少差距 基本全是很小的误差 除了有些语言哪方面确实不行导致毫秒数多 我随便选个测试 本机比了下 java c# go 几乎就没什么差别 一会 1ms 一会 2ms 3ms 的 有什么意义?
    v1200347
        183
    v1200347  
       2022-10-29 16:50:11 +08:00
    @Mark24 你这测试纯纯搞笑 斐波那契 然后全写递归 到一定程度直接爆掉 不弄尾递归优化
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2697 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 14:59 · PVG 22:59 · LAX 07:59 · JFK 10:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.