[ 
https://issues.apache.org/jira/browse/BEAM-14347?focusedWorklogId=769265&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-769265
 ]

ASF GitHub Bot logged work on BEAM-14347:
-----------------------------------------

                Author: ASF GitHub Bot
            Created on: 11/May/22 19:46
            Start Date: 11/May/22 19:46
    Worklog Time Spent: 10m 
      Work Description: lostluck commented on code in PR #17613:
URL: https://github.com/apache/beam/pull/17613#discussion_r870688021


##########
sdks/go/pkg/beam/register/register_test.go:
##########
@@ -672,3 +675,133 @@ func (fn *PartialCombiner2) AddInput(i int, c CustomType) 
int {
 func (fn *PartialCombiner2) MergeAccumulators(i1 int, i2 int) int {
        return i1 + i2
 }
+
+// Foo is a struct with a method for measuring method invocation
+// overhead for StructuralDoFns.
+type Foo struct {
+       A int
+}
+
+// ProcessElement is a method for measuring a baseline of structural dofn 
overhead.
+func (f *Foo) ProcessElement(b CustomType) int {
+       return f.A + b.val
+}
+
+func MakeMultiEdge(f *graph.DoFn) graph.MultiEdge {
+       return graph.MultiEdge{
+               DoFn: f,
+       }
+}
+
+type callerCustomTypeГint struct {
+       fn func(CustomType) int
+}
+
+func funcMakerCustomTypeГint(fn interface{}) reflectx.Func {
+       f := fn.(func(CustomType) int)
+       return &callerCustomTypeГint{fn: f}
+}
+
+func (c *callerCustomTypeГint) Name() string {
+       return reflectx.FunctionName(c.fn)
+}
+
+func (c *callerCustomTypeГint) Type() reflect.Type {
+       return reflect.TypeOf(c.fn)
+}
+
+func (c *callerCustomTypeГint) Call(args []interface{}) []interface{} {
+       out0 := c.fn(args[0].(CustomType))
+       return []interface{}{out0}
+}
+
+func (c *callerCustomTypeГint) Call1x1(arg0 interface{}) interface{} {
+       return c.fn(arg0.(CustomType))
+}
+
+func wrapMakerFoo(fn interface{}) map[string]reflectx.Func {
+       dfn := fn.(*Foo)
+       return map[string]reflectx.Func{
+               "ProcessElement": reflectx.MakeFunc(func(a0 CustomType) int { 
return dfn.ProcessElement(a0) }),
+       }
+}
+
+func GeneratedOptimizationCalls() {
+       runtime.RegisterType(reflect.TypeOf((*Foo)(nil)).Elem())
+       schema.RegisterType(reflect.TypeOf((*Foo)(nil)).Elem())
+       runtime.RegisterType(reflect.TypeOf((*CustomType)(nil)).Elem())
+       schema.RegisterType(reflect.TypeOf((*CustomType)(nil)).Elem())
+       reflectx.RegisterFunc(reflect.TypeOf((*func(CustomType) 
int)(nil)).Elem(), funcMakerCustomTypeГint)
+       reflectx.RegisterStructWrapper(reflect.TypeOf((*Foo)(nil)).Elem(), 
wrapMakerFoo)
+}
+
+// BenchmarkMethodCalls measures the overhead of invoking several different 
methods after performing
+// different types of registration. The unoptimized calls don't perform any 
optimization. The
+// GenericRegistration calls first register the DoFn being used with this 
package's generic registration
+// functions. This is the preferred path for users. The GeneratedShims calls 
call various registration
+// functions, mirroring the behavior of the shims generated by the code 
generator. This is not the
+// recommended path for most users - if these are materially better than the 
generic benchmarks,
+// this package requires further optimization.
+//
+// BenchmarkMethodCalls/MakeFunc_Unoptimized-16                      11480814  
        88.35 ns/op
+// BenchmarkMethodCalls/NewFn_Unoptimized-16                         875199    
                1385 ns/op
+// BenchmarkMethodCalls/EncodeMultiEdge_Unoptimized-16               1000000   
        1063 ns/op
+//
+// BenchmarkMethodCalls/MakeFunc_GenericRegistration-16             16266259   
        72.07 ns/op
+// BenchmarkMethodCalls/NewFn_GenericRegistration-16                 1000000   
        1108 ns/op
+// BenchmarkMethodCalls/EncodeMultiEdge_GenericRegistration-16       1000000   
        1052 ns/op
+//
+// BenchmarkMethodCalls/MakeFunc_GeneratedShims#01-16               16400914   
        69.17 ns/op
+// BenchmarkMethodCalls/NewFn_GeneratedShims#01-16                   1000000   
        1099 ns/op
+// BenchmarkMethodCalls/EncodeMultiEdge_GeneratedShims#01-16         1000000   
        1071 ns/op
+func BenchmarkMethodCalls(b *testing.B) {

Review Comment:
   And thus, revealing why I felt so strongly about this sort of thing :P. 
Thanks!





Issue Time Tracking
-------------------

    Worklog Id:     (was: 769265)
    Time Spent: 15.5h  (was: 15h 20m)

> [Go SDK] Allow users to optimize DoFns with a single generic registration 
> function
> ----------------------------------------------------------------------------------
>
>                 Key: BEAM-14347
>                 URL: https://issues.apache.org/jira/browse/BEAM-14347
>             Project: Beam
>          Issue Type: New Feature
>          Components: sdk-go
>            Reporter: Danny McCormick
>            Assignee: Danny McCormick
>            Priority: P2
>          Time Spent: 15.5h
>  Remaining Estimate: 0h
>
> Right now, to optimize DoFn execution, users have to use the code generator. 
> This updates to allow them to use generics instead.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to