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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/79e3f124-037c-4c10-a7b6-42f496bd26b6n%40googlegroups.com.