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.


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.

Reply via email to