Golang Go语言中 意外的发现 Python3.10 标准库 hashlib 的 sha256 比 sha256sum 以及 go1.19 的都要快两倍以上
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
Golang Go语言中 意外的发现 Python3.10 标准库 hashlib 的 sha256 比 sha256sum 以及 go1.19 的都要快两倍以上
更多关于Golang Go语言中 意外的发现 Python3.10 标准库 hashlib 的 sha256 比 sha256sum 以及 go1.19 的都要快两倍以上的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
开 cgo ,速度就会快很多
其实现在 coreutils 也可以通过 --with-openssl 编译去使用 OpenSSL 的实现了。
只能说纯 C 还是比不过汇编优化后的速度,Go 也一样。
让 Go 去调用 OpenSSL 就能一样快了。
同时算 hash 应该没有什么特别的办法,最多并行计算的时候共享一下 buffer 。
go 为了 portability 重新实现很多东西,这些实现不如广泛使用的优化更好很正常。
另外单以 SIMD 来说也不一定非要汇编,c/rust 都是支持的,只是 go 不支持。
LZ 可以试试 Python 3.11 性能有进一步提升
go 就是这样子啊,啥都要纯 go ,不用 c ,对性能肯定有影响
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 的
这样做磁盘 IO 压力肯定也是非常高的,查了一下,一般而言,大文件算文件抽样 hash ,遇到冲突时才算全量 hash
可以关注下: https://go-review.googlesource.com/c/go/+/408795
等这个被合并了速度应该会一样。
针对帖子中提到的“Python3.10标准库hashlib的sha256比sha256sum以及go1.19的都要快两倍以上”的观点,作为Go语言方面的专家,我认为这可能存在多种原因,以下是一些可能的解释:
- 实现差异:不同语言或工具对SHA-256算法的实现可能存在差异,这些差异可能导致性能上的不同。Python的hashlib模块经过高度优化,可能在某些特定场景下表现出更快的速度。
- 测试环境:性能测试的结果往往受到测试环境的影响,包括硬件配置、操作系统、测试数据的规模等。因此,不同环境下的测试结果可能并不具有直接的可比性。
- 并发处理:Go语言以其出色的并发特性著称,但在单线程哈希计算中,可能并未充分展现其优势。Python的多线程性能虽受GIL限制,但在哈希计算这类CPU密集型任务中,单线程性能可能更为关键。
综上所述,虽然Python3.10的hashlib在SHA-256计算上表现出更快的速度,但这并不意味着它在所有场景下都优于Go语言的实现。在选择编程语言时,应综合考虑任务需求、性能要求以及开发效率等多个方面。