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.