On Wednesday, March 17, 2021 at 5:19:55 PM UTC-4 axel.wa...@googlemail.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.
>

Yes, "func(*T)" is problematic. But the "func(T) T" is inefficient for 
large types.
There are too many constraints in using the builtin map, though it really 
provides much convenience.
Hope custom maps will help in such situations.
 

>
> 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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/8193fa0b-307f-421e-a2f8-a7e2f23777b5n%40googlegroups.com.

Reply via email to