Hello,

Separate question, why are you passing an unsafe pointer to writer?  You 
are (probably) forcing that int to escape to the heap.  If you want to 
write an uint64, pass in a uint64.

1) I suspect that you are using pointer arithmetic inside writer, don't.  
The code will not be portable.  Instead, you should use shift and mask to 
extract the bytes (e.x, uint8(i>>16).  I expect the resulting code will be 
faster.

2)  Even if you keep the pointer arithmetic, you should defer taking the 
address until necessary.


Good luck.

Robert


On Sunday, 25 November 2018 11:10:09 UTC-5, Arkady M wrote:
>
> The code below consumes ~40% of the total execution time. According to 
> the profiler i := uint64(arg.(uint32)) is a major contributor
>
> // Cast the integer argument to uint64 and call a "writer"
> // The "writer" knows how many bytes to add to the binary stream
> // Type casts from interface{} to integer consume 40% of the overall
> // time. Can I do better? What is interface{} in Golang?
> func (b *Binlog) writeArgumentToOutput(writer writer, arg interface{}, 
> argKind reflect.Kind) error {
>     // unsafe pointer to the data depends on the data type
>     var err error
>     switch argKind {
>     case reflect.Int8:
>         i := uint64(arg.(int8))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Int16:
>         i := uint64(arg.(int16))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Int32:
>         i := uint64(arg.(int32))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Int64:
>         i := uint64(arg.(int64))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Uint8:
>         i := uint64(arg.(uint8))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Uint16:
>         i := uint64(arg.(uint16))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Uint32:
>         i := uint64(arg.(uint32))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Uint64:
>         i := uint64(arg.(uint64))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Int:
>         i := uint64(arg.(int))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     case reflect.Uint:
>         i := uint64(arg.(uint))
>         err = writer.write(b.ioWriter, unsafe.Pointer(&i))
>     default:
>         return fmt.Errorf("Unsupported type: %T\n", reflect.TypeOf(arg))
>     }
>     return err
> }
>
>
>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to