Golang Go语言中为什么我用go写的sha-1计算没有git的快速sha-1
我计算大概 1 个 g 的文件要 30-40 秒,但是 git 只需要 1-2 秒,有老哥们知道 git 是怎么计算的吗
Golang Go语言中为什么我用go写的sha-1计算没有git的快速sha-1
git 有硬件加速吧
更多关于Golang Go语言中为什么我用go写的sha-1计算没有git的快速sha-1的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我用 sha1sum 算一个 1.4G 的花的时间是 5 秒,其实我理解相当多时间是在等磁盘读取
你这个 30-40 秒估计很有优化空间
显然是你自己不会用
1 个 g 的文件要 30-40 秒, 开什么玩笑
阁下为何不 show code 呢
试了一下 go 也只需要 1-2 秒。你贴一下你的 go 代码。
这种常见的劣化方案就是大量申请的临时空间,临时变量用完就丢,一直在申请和释放内存就慢,
go 不是很擅长并发么,现代多核处理器加 ssd 的组合,不至于这么慢吧,1g 左右的文件大小,1-3s 属于比较正常的范畴,检查下缓冲区跟异步并发这两块?
不会是你自己实现的吧?如果你不懂任何优化,至少照着算法山寨一个,30s 很正常。
不知道怎么修改回复……“至少”=>“只是”。
你写的程序有问题,SHA-1 在现代 CPU 上不用硬件加速也能跑几百兆每秒,git 算 SHA-1 的性能完全就是合理水平。
既然你是 go 用户,那为什么不看看 go 标准库里的实现呢?手写的汇编,广泛验证的质量,详实的注释,连参考文章都列的清清楚楚。完全值得一看。
show your go code
现代 CPU 支持 CPU 指令直接计算 sha ,不过即使软解也没那么慢,你代码问题
https://en.m.wikipedia.org/wiki/Intel_SHA_extensions
代码啊代码
这东西咋并发?
sha 应该不可以,如果是 crc 支持 update ,就可以用并行
“sha 不可以”和我理解的一样,hash 类的计算都有前后依赖
不过 crc 这个我没听懂。主要是我也不懂 crc ,所以缺乏理解你这句话的基础知识
package main
import (
“fmt”
“hash/crc64”
“sync”
)
func main() {
var data = []byte{
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8,
}
iso := crc64.MakeTable(crc64.ISO)
{
r := crc64.Checksum(data, iso)
fmt.Println®
}
{ // concurrent
crc := crc64.New(iso)
wg := &sync.WaitGroup{}
wg.Add(3)
go func() {
crc.Write(data[16:24])
wg.Done()
}()
go func() {
crc.Write(data[0:8])
wg.Done()
}()
go func() {
crc.Write(data[8:16])
wg.Done()
}()
wg.Wait()
fmt.Println(crc.Sum64())
}
}
在Golang中,如果你发现自己用Go语言编写的SHA-1计算没有Git的快速,这通常是由几个关键因素导致的:
-
算法实现与优化:Git作为一个高度优化的版本控制系统,其内部的SHA-1实现经过了大量的性能调优。相比之下,自行编写的SHA-1算法可能缺乏这些优化,比如内存访问模式、指令级并行等。
-
库的选择:Go标准库中的
crypto/sha1
提供了SHA-1的实现,但可能不是最高效的。一些第三方库,如crypto/sha1asm
(如果可用),可能提供了更快的实现。此外,硬件加速(如使用CPU的SHA指令集)也能显著提高性能。 -
输入数据处理:如果你的代码在SHA-1计算之前对输入数据进行了额外的处理(如读取、转换格式等),这些步骤可能成为性能瓶颈。确保输入数据以最高效的方式提供给SHA-1算法。
-
并发与并行:Git可能利用了多核处理器的优势,通过并行处理多个文件或数据块来加速SHA-1计算。如果你的代码是单线程的,考虑使用Go的并发特性(如goroutines)来加速处理。
为了提高你的SHA-1计算速度,你可以尝试使用优化过的库、确保输入数据的高效处理、以及利用Go的并发特性。同时,也要意识到SHA-1因其安全性问题已被广泛弃用,对于新的项目或安全敏感的应用,建议使用更安全的哈希算法,如SHA-256或SHA-3。