Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf(gnovm): cache PkgIDFromPkgPath for higher performance (#3424)
This change comes from noticing that PkgIDFromPkgPath is very heavily invoked within the VM yet its results with the same inputs produced deterministic results aka SHA256(path)[:20] Previously just spinning up the VM would take 80 seconds, with this change that's shaved by ~8-10 seconds down and with repeatable and visible results exhibited through ### Benchmark: ```shell $ benchstat before.txt after.txt name old time/op new time/op delta PkgIDFromPkgPath-8 1.96µs ± 2% 0.35µs ± 1% -82.40% (p=0.000 n=20+18) name old alloc/op new alloc/op delta PkgIDFromPkgPath-8 296B ± 0% 168B ± 0% -43.24% (p=0.000 n=20+20) name old allocs/op new allocs/op delta PkgIDFromPkgPath-8 9.00 ± 0% 7.00 ± 0% -22.22% (p=0.000 n=20+20) ``` ### Profiles: * Before ```shell (pprof) list PkgIDFromPkgPath Total: 100.94s ROUTINE ======================== github.com/gnolang/gno/gnovm/pkg/gnolang.PkgIDFromPkgPath in $PATH 220ms 9.26s (flat, cum) 9.17% of Total . . 74:func PkgIDFromPkgPath(path string) PkgID { 220ms 9.26s 75: return PkgID{HashBytes([]byte(path))} . . 76:} . . 77: . . 78:// Returns the ObjectID of the PackageValue associated with path. . . 79:func ObjectIDFromPkgPath(path string) ObjectID { . . 80: pkgID := PkgIDFromPkgPath(path) ``` * After ```shell (pprof) list PkgIDFromPkgPath Total: 93.22s ROUTINE ======================== github.com/gnolang/gno/gnovm/pkg/gnolang.PkgIDFromPkgPath in $PATH 210ms 1.55s (flat, cum) 1.66% of Total 50ms 50ms 78:func PkgIDFromPkgPath(path string) PkgID { . 490ms 79: pkgIDMu.Lock() 10ms 10ms 80: defer pkgIDMu.Unlock() . . 81: 10ms 730ms 82: pkgID, ok := pkgIDFromPkgPathCache[path] . . 83: if !ok { . . 84: pkgID = new(PkgID) . . 85: *pkgID = PkgID{HashBytes([]byte(path))} . . 86: pkgIDFromPkgPathCache[path] = pkgID . . 87: } 140ms 270ms 88: return *pkgID . . 89:} . . 90: . . 91:// Returns the ObjectID of the PackageValue associated with path. . . 92:func ObjectIDFromPkgPath(path string) ObjectID { . . 93: pkgID := PkgIDFromPkgPath(path) ``` Fixes #3423 --------- Co-authored-by: Nathan Toups <[email protected]> Co-authored-by: Morgan Bazalgette <[email protected]>
- Loading branch information