On Wed, Mar 17, 2021 at 10:06 PM tapi...@gmail.com <tapir....@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+unsubscr...@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+unsubscr...@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.

Reply via email to