V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Licsber
V2EX  ›  Go 编程语言

意外的发现 Python3.10 标准库 hashlib 的 sha256 比 sha256sum 以及 go1.19 的都要快两倍以上

  •  
  •   Licsber ·
    licsber · 2022-09-25 01:33:31 +08:00 · 3855 次点击
    这是一个创建于 577 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT 将近 3 倍的性能提升( 0.7s vs 2.0s )

    截止发帖已经知道答案了 Py 不讲武德 调用了 openssl 带了 SIMD 加速
    很好奇为啥 go 这么慢 还想着把我的小工具用 go 重写一遍 现在想法没这么迫切了(笑死
    另外请教下 go 里怎么同时算 hash 会快一点(同一个超大文件的 md5 、sha1 、sha256 等)

    测试原始信息

    测试平台 i7 1165G7
    缓冲大小均为 4*1024*1024 即 4MiB
    其中 py 跑在 wsl1 ( Ubuntu22.04 )里
    理论上会比跑在 win 里的 go 更慢(结果快了三倍 笑死
    
    Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
    go version go1.19.1 windows/amd64
    
    openssl 信息
    version: 3.0.2
    built on: Mon Jul  4 11:20:23 2022 UTC
    options: bn(64,64)
    compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -ffile-prefix-map=/build/openssl-Q8dQt3/openssl-3.0.2=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
    CPUINFO: OPENSSL_ia32cap=0xfedaf387ffebffff:0x405fc6f3bfa7ab
    The 'numbers' are in 1000s of bytes per second processed.
    type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
    sha256          131816.90k   378560.56k   953040.44k  1468024.83k  1816342.93k  1818028.71k
    
    10 条回复    2022-09-25 15:28:41 +08:00
    eason1874
        1
    eason1874  
       2022-09-25 02:12:44 +08:00
    Windows 上的 go 好像受安全软件影响,每次运行编译都会被扫描拖慢
    nuk
        2
    nuk  
       2022-09-25 03:50:46 +08:00
    开 cgo ,速度就会快很多
    mikewang
        3
    mikewang  
       2022-09-25 04:06:11 +08:00
    其实现在 coreutils 也可以通过 --with-openssl 编译去使用 OpenSSL 的实现了。
    只能说纯 C 还是比不过汇编优化后的速度,Go 也一样。
    让 Go 去调用 OpenSSL 就能一样快了。
    Jirajine
        4
    Jirajine  
       2022-09-25 05:40:11 +08:00
    同时算 hash 应该没有什么特别的办法,最多并行计算的时候共享一下 buffer 。

    @mikewang go 为了 portability 重新实现很多东西,这些实现不如广泛使用的优化更好很正常。
    另外单以 SIMD 来说也不一定非要汇编,c/rust 都是支持的,只是 go 不支持。
    iwdmb
        5
    iwdmb  
       2022-09-25 06:49:39 +08:00
    LZ 可以试试 Python 3.11 性能有进一步提升
    0o0O0o0O0o
        6
    0o0O0o0O0o  
       2022-09-25 08:28:47 +08:00 via iPhone   ❤️ 3
    ospider
        7
    ospider  
       2022-09-25 09:24:35 +08:00   ❤️ 1
    go 就是这样子啊,啥都要纯 go ,不用 c ,对性能肯定有影响
    lysS
        8
    lysS  
       2022-09-25 11:55:27 +08:00   ❤️ 1
    minio 的用了 SIMD 确实快大约 4 倍:

    https://github.com/minio/sha256-simd/blob/master/sha256_test.go:
    BenchmarkHash/SHA_/1K-8
    1994372 614.2 ns/op 1667.18 MB/s 0 B/op 0 allocs/op

    src/crypto/sha256/sha256_test.go
    BenchmarkHash1K-8 445884 2299 ns/op 445.46 MB/s 0 B/op 0 allocs/op


    考虑到你算大文件的 hash, 大部分性能花在内存拷贝上了,找找有没有系统提供的函数、以零拷贝的方式来算文件 hash 的
    lysS
        9
    lysS  
       2022-09-25 12:01:58 +08:00
    这样做磁盘 IO 压力肯定也是非常高的,查了一下,一般而言,大文件算文件抽样 hash ,遇到冲突时才算全量 hash
    wdvxdr1123
        10
    wdvxdr1123  
       2022-09-25 15:28:41 +08:00   ❤️ 1
    可以关注下: https://go-review.googlesource.com/c/go/+/408795
    等这个被合并了速度应该会一样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5353 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:31 · PVG 15:31 · LAX 00:31 · JFK 03:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.