On Wednesday, March 17, 2021 at 5:23:57 PM UTC-4 matthew...@nytimes.com wrote:
> Isn't this really just another form of issue 3117 > <https://github.com/golang/go/issues/3117>? > Some of, but really different. > > > On Wed, Mar 17, 2021 at 3:19 PM 'Axel Wagner' via golang-nuts < > golan...@googlegroups.com> wrote: > >> On Wed, Mar 17, 2021 at 10:06 PM tapi...@gmail.com <tapi...@gmail.com> >> wrote: >> >>> For simple scenarios, compiler optimizations might be possible. >>> But for some complicate ones, it is hard for compiler to do >>> optimizations. >>> For example, the element is modified by an function between the map >>> element getter and setter and the behavior of the function is hard to >>> determined at compile time, it might modify or not modify the key. >>> >> >> Yes. I would strongly prefer to have these uncommon cases be slower to >> complicating the language. >> >> FWIW, if anything, the signature would have to take a `func(T) T`, not a >> `func(*T)` - values in a map are not addressable for a reason. If we would >> use a pointer, it would allow the programmer to retain that pointer outside >> of the function, which would not be safe. >> >> But this also implies that any case covered by that function can be >> re-written as >> >> _tmp := k // temporary variable, in case k is modified >> v := m[_tmp] >> // do the same as the function would >> m[_tmp] = v >> >> which should easily recognizable by the compiler. That means we would >> only need to optimize this simple case and anyone concerned about speed >> could rewrite their code into this form to get the same result. >> >> So, I don't actually think doing it as an optimization is harder or less >> powerful than adding this function. It should cover the same cases, without >> complicating the language. >> >> >> >>> >>> On Wednesday, March 17, 2021 at 4:51:09 PM UTC-4 >>> axel.wa...@googlemail.com wrote: >>> >>>> Yes, Jan's link also pretty clearly shows that this optimization isn't >>>> currently happening :) Sorry for the noise. >>>> I still believe it should be an optimization in the compiler, not a >>>> language-level feature. >>>> >>>> On Wed, Mar 17, 2021 at 9:44 PM tapi...@gmail.com <tapi...@gmail.com> >>>> wrote: >>>> >>>>> >>>>> I found this performance difference by benchmarking the two: >>>>> >>>>> func IntAdd(words [][]byte) map[string]int { >>>>> var m = make(map[string]int) >>>>> for _, w := range words { >>>>> m[string(w)] = m[string(w)] + 1 >>>>> >>>>> } >>>>> return m >>>>> } >>>>> >>>>> func IntIncrement(words [][]byte) map[string]int { >>>>> var m = make(map[string]int) >>>>> for _, w := range words { >>>>> m[string(w)]++ >>>>> } >>>>> return m >>>>> } >>>>> >>>>> IntAdd is obviously slower than IntIncrement. >>>>> >>>>> On Wednesday, March 17, 2021 at 4:22:53 PM UTC-4 >>>>> axel.wa...@googlemail.com wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> have you verified this using a disassembler or benchmarks? Just >>>>>> asking because this is, as far as I'm concerned, a job for the compiler, >>>>>> to >>>>>> eliminate the overhead automatically - and I could well imagine that >>>>>> it's >>>>>> already doing it. There definitely shouldn't be a new language construct >>>>>> for this. >>>>>> >>>>>> On Wed, Mar 17, 2021 at 9:19 PM tapi...@gmail.com <tapi...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Now, to modify a map element, especially the element type is not a >>>>>>> basic type, two hashes are needed to compute. This is often unnecessary >>>>>>> and >>>>>>> inefficient. For example: >>>>>>> >>>>>>> package main >>>>>>> >>>>>>> type T struct{ >>>>>>> N int >>>>>>> // ... more fields >>>>>>> } >>>>>>> >>>>>>> func main() { >>>>>>> var m = map[string]T{} >>>>>>> m["foo"] = T{N: 0} >>>>>>> >>>>>>> // modify >>>>>>> t := m["foo"] // first hashing >>>>>>> t.N++ >>>>>>> m["foo"] = t // second hashing >>>>>>> } >>>>>>> >>>>>>> Will it be good to add a new builtin function, modify(m >>>>>>> Map[Key]Value, k Key, func(v *Value)), to modify map elements with only >>>>>>> one >>>>>>> hash? A use example: >>>>>>> >>>>>>> package main >>>>>>> >>>>>>> type T struct{ >>>>>>> N int >>>>>>> // ... more fields >>>>>>> } >>>>>>> >>>>>>> func main() { >>>>>>> var m = map[string]T{} >>>>>>> m["foo"] = T{N: 0} >>>>>>> >>>>>>> // modify >>>>>>> modify(m. "foo", func(t *T) { >>>>>>> t.N++ >>>>>>> }) >>>>>>> } >>>>>>> >>>>>>> -- >>>>>>> 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...@googlegroups.com. >>>>>>> To view this discussion on the web visit >>>>>>> https://groups.google.com/d/msgid/golang-nuts/ba7b2c95-829b-4da4-916a-d53a06ec3428n%40googlegroups.com >>>>>>> >>>>>>> <https://groups.google.com/d/msgid/golang-nuts/ba7b2c95-829b-4da4-916a-d53a06ec3428n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>> . >>>>>>> >>>>>> -- >>>>> 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...@googlegroups.com. >>>>> >>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/golang-nuts/d763c1fd-6e57-41f1-90e1-98a369ddf3bcn%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/golang-nuts/d763c1fd-6e57-41f1-90e1-98a369ddf3bcn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>> 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...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/52f00985-3e0b-4562-80d9-705ae8e5e507n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/52f00985-3e0b-4562-80d9-705ae8e5e507n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- >> 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...@googlegroups.com. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEggD%2BnqVJFismVYK%3DqtviFozVft1jdBuT7-VM8cgxXZQ%40mail.gmail.com >> >> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEggD%2BnqVJFismVYK%3DqtviFozVft1jdBuT7-VM8cgxXZQ%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> > > > -- > *Matt Holiday* > Senior Gopher, Marketing Technologies > > 620 Eighth Avenue > > New York, NY 10018 > > matthew...@nytimes.com > -- 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/b02b70be-06eb-49e0-8d5b-a573a024e320n%40googlegroups.com.