我计算大概 1 个 g 的文件要 30-40 秒,但是 git 只需要 1-2 秒,有老哥们知道 git 是怎么计算的吗
1
liuidetmks 2023-09-08 18:01:04 +08:00
git 有硬件加速吧
|
2
danbai 2023-09-08 18:04:28 +08:00
|
3
clino 2023-09-08 18:12:17 +08:00
我用 sha1sum 算一个 1.4G 的花的时间是 5 秒,其实我理解相当多时间是在等磁盘读取
你这个 30-40 秒估计很有优化空间 |
4
shimanooo 2023-09-08 18:16:17 +08:00
路过问一下现代文件系统有没有文件 hash 的接口? 只使用少量 IO 就能获得文件 hash.
|
5
1423 2023-09-08 18:18:01 +08:00
显然是你自己不会用
1 个 g 的文件要 30-40 秒, 开什么玩笑 |
6
sardina 2023-09-08 18:26:03 +08:00 via iPhone
阁下为何不 show code 呢
|
7
zhy0216 2023-09-08 18:37:51 +08:00 via Android
|
8
Trim21 2023-09-08 18:46:31 +08:00
试了一下 go 也只需要 1-2 秒。你贴一下你的 go 代码。
|
9
AoEiuV020JP 2023-09-08 19:40:25 +08:00 via Android 1
这种常见的劣化方案就是大量申请的临时空间,临时变量用完就丢,一直在申请和释放内存就慢,
|
10
ShuWei 2023-09-08 22:10:43 +08:00
go 不是很擅长并发么,现代多核处理器加 ssd 的组合,不至于这么慢吧,1g 左右的文件大小,1-3s 属于比较正常的范畴,检查下缓冲区跟异步并发这两块?
|
11
kneo 2023-09-08 22:48:09 +08:00 via Android
不会是你自己实现的吧?如果你不懂任何优化,至少照着算法山寨一个,30s 很正常。
|
13
nlzy 2023-09-09 00:07:32 +08:00 via Android
你写的程序有问题,SHA-1 在现代 CPU 上不用硬件加速也能跑几百兆每秒,git 算 SHA-1 的性能完全就是合理水平。
既然你是 go 用户,那为什么不看看 go 标准库里的实现呢?手写的汇编,广泛验证的质量,详实的注释,连参考文章都列的清清楚楚。完全值得一看。 |
14
flyqie 2023-09-09 08:22:03 +08:00 via Android
show your go code
|
15
qwerthhusn 2023-09-09 09:33:05 +08:00 via iPhone
现代 CPU 支持 CPU 指令直接计算 sha ,不过即使软解也没那么慢,你代码问题
https://en.m.wikipedia.org/wiki/Intel_SHA_extensions |
16
sadfQED2 2023-09-09 10:23:33 +08:00 via Android
代码发出来看看
|
17
lasuar 2023-09-09 10:33:34 +08:00
代码啊代码
|
20
julyclyde 2023-09-10 12:05:29 +08:00
|
21
lysS 2023-09-10 17:07:45 +08:00
@julyclyde
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(r) } { // 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()) } } |