On Wednesday, April 19, 2017 at 3:56:21 AM UTC-7, T L wrote:
>
>
>
> On Wednesday, April 19, 2017 at 3:37:29 AM UTC+8, Keith Randall wrote:
>>
>> This is a weird corner case in string concatenation optimization.
>>
>> runtime.concatstrings (what the + in this code gets rewritten to) has an 
>> optimization where if all the strings but one that it is concatenating are 
>> 0 length, then it returns the remaining one without doing any allocation.
>> Because of that optimization, runtime.concatstrings might return its 
>> argument.  Thus, we can't do the zero-copy conversion of []byte to string 
>> for arguments to runtime.concatstrings.
>> Except when we know that at least one of the input strings has non-zero 
>> length.  Then we can.  That's what is happening in f2.
>>
>  
> Keith, thanks. But I haven't fully get your explanation.
> Do you mean that compiler can't confirm whether or not the optimization 
> which might return its argument can be used for f1 at compile time,
> but compiler can confirm it can't be used for f2 at compile time?
>
> That's correct.  Or more precisely, if that optimization is used in f2, it 
can only be used for the string " ", it can't be used for any of the 
string(a) arguments.

>  
>
>>
>> On Monday, April 17, 2017 at 11:06:26 PM UTC-7, T L wrote:
>>>
>>>
>>> package main
>>>
>>> import "fmt"
>>> import "testing"
>>>
>>> var s string
>>> var a = make([]byte, 1000)
>>>
>>> func f0() {
>>>     x := string(a)
>>>     s =     x + x + x + 
>>>         x + x + x + 
>>>         x + x + x + 
>>>         x
>>> }
>>>
>>> func f1() {
>>>     s =     string(a) +  string(a) + string(a) +
>>>            string(a) +  string(a) + string(a) +
>>>            string(a) +  string(a) + string(a) +
>>>            string(a)
>>> }
>>>
>>> func f2() {
>>>     s =     (" " +
>>>            string(a) +  string(a) + string(a) +
>>>            string(a) +  string(a) + string(a) +
>>>            string(a) +  string(a) + string(a) +
>>>            string(a) )[1:]
>>> }
>>>
>>> func main() {
>>>     fmt.Println(testing.AllocsPerRun(1, f0)) // 2
>>>     fmt.Println(testing.AllocsPerRun(1, f1)) // 11
>>>     fmt.Println(testing.AllocsPerRun(1, f2)) // 1
>>> }
>>>
>>> why doesn't gc make optimization for f1?
>>>
>>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to