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
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 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
- Loading branch information