库房
Github 👉 go-get-folder-size
特性
- 🦕 二进制 go
- 🦖 原生 node
- 🐊 wasm go
动机
想要快速知道文件夹大小,但 nodejs 完成的 get-folder-size 是慢的,所以用 go 完成了递归获取文件夹大小,能跑在 nodejs 中。
详细可见 issue 👉 get-folder-size/issues/22
例如咱们同样用 cli
核算 184,046
个文件,35,185
个文件夹,共 7 GB
左右的目录
原生 node
,大约 11.5s
👇
用 go
重写后,只需要 1.7s
👇
不过这里 node
的 get-folder-size 累加操作没上 worker-pool
线程池的,没有发挥 node
彻底的功能。
不过就算上了线程池估计也打不过 go
的 goroutine
。即使能打过,文件数量级再上一个层次后也会被 go
赶超。
运用
npm
install
npm install go-get-folder-size
cli
# Binary go, fastest
npx go-get-folder-size
program
import {
getFolderSize,
getFolderSizeBin,
getFolderSizeWasm
} from 'go-get-folder-size'
const base = './' // 你想要获取的目录
await getFolderSizeBin(base) // 二进制 go,最快
await getFolderSize(base) // 原生 node
await getFolderSizeWasm(base) // Wasm go,最慢 🥵
go
install
go install github.com/markthree/go-get-folder-size
cli
go-get-folder-size
program
go get github.com/markthree/go-get-folder-size
package main
import (
getFolderSize "github.com/markthree/go-get-folder-size/src"
)
func main() {
size, err := getFolderSize.Parallel("./") // 并发核算,超级快
}
提示
-
wasm
出奇的比原生node
要慢 🫣 - 现在该包被运用在组织内的本地项目办理器中,初次获取项目大小优化到
1s
内 👉 x-pm
创意来历
go-get-folder-size 的完成创意来自 👇
- esbuild
- Slow for very large folders · Issue #22 · alessioalex/get-folder-size
原理
wasm
如安在 node
中调用 go
呢,咱们第一时间可能就想到 go
编译成 wasm
嘛,然后再用 node
去调用 wasm
👇
的确能够,但是在这个比如中,wasm
反而比 node
原生还要慢许多 😅
很奇特,有知道怎么回事的靓仔靓女能够评论区说下为什么 🫡
二进制
别的一种方法便是将 go
编译成二进制履行文件,node
再起子进程调用二进制履行文件。
不过这种方法依然存在资源糟蹋的问题,因为跑完二进制后咱们的进程就被销毁了,而创建和销毁进程是很糟蹋资源的。
抱负状态下,应该是只起一个子进程,然后进行 ipc
通讯 👇
go-get-folder-size 现在只完成了第一种单纯的调用,未来可能会像 gluon-framework/gluon 相同起常驻进程,提供 websocket
和 stdio
等通讯方法。
尾声
如果对后续其他的开源感兴趣,也欢迎关注 👇
- 我 github/markthree
- 组织 github/dishait
文中说到的我在办理的库房 👇
-
markthree/go-get-folder-size: 递归获取文件夹大小,运用 go,足够快,能够跑在 node 中