I use reflect2 in our custom more robust deepcopy implementation in two 
places:

1. When I need to grow slice.
Standard reflect package has no way to enlarge slice without call to 
reflect.MakeSlice, which allocates unneeded slice header.
2. When I need to iterate map.
Using standard reflect package there is no way to iterate map[string]int 
without allocation of string header and int for every key-value pair. When
key or values is struct, things become worse.
Also reflect2.UnsafeMap.UnsafeSetIndex is just a wrapper call to mapassign. 
Yes, it is unsafe in the meaning it doesn't check types, but it is ok in
this place because I've checked types a bit earlier.

This two things give a lot for performance (and allocation-less-ness) of 
our deepcopy.

Yura

вторник, 2 марта 2021 г. в 21:18:51 UTC+3, Ian Lance Taylor: 

> On Tue, Mar 2, 2021 at 5:49 AM Yan Titarenko
> <local.tou...@gmail.com> wrote:
> >
> > On Friday, February 26, 2021 at 5:50:44 PM UTC+2 Ian Lance Taylor wrote:
> >>
> >>
> >> OK, but the reflect package generally does not allocate, so what is
> >> the advantage of reflect2? Are there benchmarks showing where
> >> reflect2 is significantly faster?
> >
> >
> > The problem is in the fact that benchmarking of json-iterator is itself 
> a package specific one.
> >
> > This is not like if we could take 10-15 packages, which use reflect 
> package, to benchmark those. And we could each of the end-user Go projects, 
> to make it work with reflect2 - and run the same benchmark. Then we could 
> patch again, to target go-reflect. Then we could do benchmarking again.
>
> I agree that in general its better to use larger scale benchmarks.
> That said, for a case like this, if reflect2 is faster, it must be
> possible to show that in a micro-benchmark, perhaps one that uses
> b.ReportAllocs.
>
> But really I'm just trying to get at a basic fact. Right now I don't
> understand in what way reflect2 is faster, and the package docs don't
> tell me that either. Do you know?
>
>
>
> >> (I'll note that while this may not be a good idea for the overall
> >> ecosystem, I expect that it is possible to port reflect2 to support
> >> gccgo/GoLLVM.)
> >
> >
> > In that case it would be critical to resolve these issues:
> > https://github.com/modern-go/reflect2/issues/16
> > . Should those methods and types be referenced? perhaps something else 
> should be used?
> > Or it should - but we would have to implement the missing ones?
> >
> > btw this is what never being answered, during all the previous 
> discussions.
>
> I'm sorry, I'm not answering the question because it doesn't really
> make sense to me. There is no gccgo/GoLLVM version of a function like
> resolveTypeOff. The fix to make reflect2 work with gccgo/GoLLVM is
> not to add resolveTypeOff to gccgo/GoLLVM. It's to change the
> reflect2 package to work with the gccgo/GoLLVM versions of the reflect
> types.
>
> The gccgo/GoLLVM reflect types are just different from the gc reflect
> types. This doesn't mean that reflect2 can't support gccgo/GoLLVM,
> but it does mean that the package needs to be modified to support
> those types, using appropriate build constraints.
>
>
> > It might make sense to really work on various reflections APIs - to 
> learn why it is typically grow into a situation when alternatives are 
> written.
> > Perhaps it makes sense to react on various issues and demands, of libgo, 
> earlier then the whole Go package (for reflection, in this case) would be 
> formed?
> > At least it would be clear that is not reasonable to spend time on 
> designing/implementing an alternative, compared to patching libgo's package.
> > Also is a "corner edge" case, with json-iterator - it would give some 
> disadvantages, in case of other end-user Go package. And that is what 
> authors of such "alternative" do not want to deal with - so reflect2 is, 
> unsurprisingly, unmaintained even by the original author.
>
> I would certainly be happy to patch libgo if someone can tell me what
> should change. This gets us back to the benchmark discussion.
>
> 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/53f29e5b-385d-4f04-a488-6af1375a91b5n%40googlegroups.com.

Reply via email to