Hi there! In my continued efforts to improve the performance of my Go Lua implementation [1], I have reached a bottleneck which causes me a quandary.
Lua has a data structure which is called 'table', which is essentially a hashmap. So far I have implemented it as a Go map, which works OK. However there is significant overhead coming from the fact that Lua has a `next` function that allows getting the "next" key-value pair in a table after a given one: `next(t, key)`. As far as I can tell Go doesn't allow this so if I want to use a Go map, I also have to keep track of the next key for each key, which doubles the memory requirement, necessitates more accounting in the code and makes iteration via `next` slower. So I am looking at not using the builtin Go map and making my own hashtable implementation. However, because the keys are still made of Go values, I would like to benefit from the quick hashing that maps use. After some poking around in the implementation of map (and discovering the //go:linkname compiler directive), I think that I can do this: // This is the Lua Value type. The scalar part contains the payload of int64, float64 or bool for quicker access and minimising allocations. type Value struct { scalar uint64 iface interface{} } //go:linkname goRuntimeInt64Hash runtime.int64Hash //go:noescape func goRuntimeInt64Hash(i uint64, seed uintptr) uintptr //go:linkname goRuntimeEfaceHash runtime.efaceHash //go:noescape func goRuntimeEfaceHash(i interface{}, seed uintptr) uintptr // Hash returns a hash for the value. func (v Value) Hash() uintptr { if v.scalar != 0 { return goRuntimeInt64Hash(v.scalar, 0) } return goRuntimeEfaceHash(v.iface, 0) } Does that sound like a sensible approach? I.e. is it safe enough to use the go:linkname directive, and do those seem like the right functions to call to obtain a good hash? TIA -- Arnaud -- 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/79e3f124-037c-4c10-a7b6-42f496bd26b6n%40googlegroups.com.