Thank you @Ugorji Nwoke <ugo...@google.com> , I appreciate your going the extra mile to include gollvm in your testing.
Cheers, Than On Tue, Mar 30, 2021 at 11:17 AM Ugorji Nwoke <ugo...@gmail.com> wrote: > Ugorji here - author of the github.com/ugorji/go/codec > <https://pkg.go.dev/github.com/ugorji/go/codec> package. > > The notes below are for folks that are interested in why we use unsafe, > and how we mitigate concerns around it. > > As Peter mentioned above, you can pass the build tag "codec.safe" to > bypass using unsafe code where we try to reach deeper into the runtime > implementation to optimize. > > I have been supporting gccgo for a while now, but never tested with > gollvm, as it has not been released at this time. I built a gollvm version > yesterday (from source) and tested it, and made some changes (see here > <https://github.com/ugorji/go/commit/1768cf4d4babceec77d8ab0da478c58c9cb9aa99> > and here > <https://github.com/ugorji/go/commit/12f7e67b2326c6cc05bd3fea410164a18108d6a3>) > so that gollvm will work in the default (high-performance) mode. I plan to > cut a new release v1.2.5 sometime this week with those changes. > > For those who care about why we support unsafe and dig into the runtime > internals, please read below. > > To illustrate the benefit, look at unsafe vs codec.safe benchmark results > below: > ``` > ---- tags: "" (default high-performance mode using unsafe carefully) ---- > Benchmark__Json_______Encode-8 6921 152808 ns/op 24 B/op > 1 allocs/op > Benchmark__Json_______Encode-8 5622 197863 ns/op 10048 B/op > 381 allocs/op > > ---- tags: "codec.safe" ---- > Benchmark__Json_______Decode-8 2587 415595 ns/op 71878 B/op > 592 allocs/op > Benchmark__Json_______Decode-8 2167 478122 ns/op 96812 B/op > 1456 allocs/op > > ---- tags: x generated ---- > Benchmark__Json_______Encode-8 8694 120519 ns/op 1528 B/op > 6 allocs/op > Benchmark__Json_______Decode-8 2960 349320 ns/op 70469 B/op > 589 allocs/op > ``` > > This benchmarks show that using unsafe carefully can cut down allocations > dramatically. Encoding allocation goes from 381 to 1, while decoding goes > from 1456 to 592. Those numbers using unsafe rival the allocation numbers > that we get using code-generation (as seen above), and the run time starts > to trend within 25% of the code-generation numbers, and 25% better than the > non-unsafe run time. > > We limited the surface area that is exposed to unsafe (basically 1 file, > helper_unsafe.go, with some variant for gccgo/gollvm where some linkname > references do not exist or work differently), so we can quickly edit the > code and know where bugs are coming from. Many other packages that try to > optimize json/cbor/msgpack encoding and decoding use some variation of the > same ideas here. > > I test the code for the last 5 go releases on each github checkin, via > travis CI. I also run with the standard compiler and gccgo locally before > cutting a release. I have now added gollvm to my pre-release validation > script, so it is validated before I cut the release. Caveat: I test with > the installed versions of gccgo from ubuntu, and locally built gollvm. > Since gollvm is not released yet, the version I test with may be old > (building gollvm takes roughly 1 hour on my computer). > > If you see any further issues, please file a bug and I will jump on it: > https://github.com/ugorji/go/issues/new > > Thanks. > On Monday, March 29, 2021 at 8:32:53 AM UTC-4 peterGo wrote: > >> You haven't said whether you followed the "safe" instructions for >> github.com/ugorji/go/codec to avoid building code/helper_unsafe.go, >> which uses go:linkname. >> >> Package Documentation for github.com/ugorji/go/codec >> https://github.com/ugorji/go/blob/master/codec/README.md >> >> This package will carefully use 'package unsafe' for performance reasons >> in specific places. You can build without unsafe use by passing the safe or >> appengine tag i.e. 'go install -tags=codec.safe >> >> You can run the tag 'codec.safe' to run tests or build in safe mode. e.g. >> >> go test -tags codec.safe -run Json >> go test -tags "alltests codec.safe" -run Suite >> >> Peter >> >> On Monday, March 29, 2021 at 3:34:44 AM UTC-4 f011...@gmail.com wrote: >> >>> > go:linkname to refer directly to functions that are defined but not >>> exported by the standard library. >>> > This is not supported and is likely to break with any new release. It >>> evidently breaks with GoLLVM. >>> >>> Thanks for your attention, but I tried to write a demo with go:linkname. >>> In fact, it works well with gollvm...So maybe it is not the exact cause >>> for the problem >>> >>> Herei is my code: >>> >>> hello/hello.go >>> ``` >>> package hello >>> >>> import ( >>> "fmt" >>> _ "unsafe" >>> ) >>> //go:linkname hellox hello.hellox >>> func hellox(x string) { >>> fmt.Println(x) >>> } >>> ``` >>> >>> main.go >>> ``` >>> package main >>> >>> import ( >>> _ "mypackage/hello" >>> _ "unsafe" >>> ) >>> >>> //go:linkname hel hello.hellox >>> func hel(x string) >>> >>> func main() { >>> hel("aaa") >>> //println("aaaa") >>> } >>> ``` >>> >>> 在2021年3月29日星期一 UTC+8 上午12:37:49<Ian Lance Taylor> 写道: >>> >>>> On Sun, Mar 28, 2021 at 9:28 AM 张嘉熙 <f011...@gmail.com> wrote: >>>> > >>>> > For s2-geojson, I meet: >>>> > ``` >>>> > # github.com/pantrif/s2-geojson/cmd/s2-geojson >>>> > >>>> /home/jx/.cache/go-build/6b/6bd003c99eb0a9e7c6ea6d372307b292ec615c75c28f9b1f696896ae2fb4272b-d(_go_.o):gomodule:function >>>> github_0com_1ugorji_1go_1codec.intf2impls.intf2impl: error: undefined >>>> reference to 'reflect.unsafe_New' >>>> > >>>> /home/jx/.cache/go-build/6b/6bd003c99eb0a9e7c6ea6d372307b292ec615c75c28f9b1f696896ae2fb4272b-d(_go_.o):gomodule:function >>>> github_0com_1ugorji_1go_1codec.Decoder.interfaceExtConvertAndDecode: error: >>>> undefined reference to 'reflect.unsafe_New' >>>> > decode.go:509: error: undefined reference to 'reflect.unsafe_New' >>>> > decode.go:14935: error: undefined reference to 'reflect.unsafe_New' >>>> >>>> This is a problem with github.com/ugorji/go. The file >>>> code/helper_unsafe.go uses go:linkname to refer directly to functions >>>> that are defined but not exported by the standard library. This is >>>> not supported and is likely to break with any new release. It >>>> evidently breaks with GoLLVM. >>>> >>>> Ian >>>> >>> -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/584aa92a-8528-45a7-870c-9153298e95adn%40googlegroups.com > <https://groups.google.com/d/msgid/golang-nuts/584aa92a-8528-45a7-870c-9153298e95adn%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CA%2BUr55EL3PWdo%3Du1dSYQgx2PmbVZ%3Dqqb0LPrCxO5-ZwG%2BWmFnQ%40mail.gmail.com.