www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 11420] New: Inefficient AA value setting

http://d.puremagic.com/issues/show_bug.cgi?id=11420

           Summary: Inefficient AA value setting
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: performance
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: k.hara.pg gmail.com


--- Comment #0 from Kenji Hara <k.hara.pg gmail.com> 2013-11-02 05:51:21 PDT ---
This is both dmd and druntime issue.

By fixing issue 6178, AA value setting with opAssign behavior has been properly
fixed in 2.064.

struct S
{
    int val;
    this(int v) { val = 1; }
    void opAssign(S) { val = 2; }
}
void main()
{
    S[int] aa;
    aa[1] = S(1);   // S(1) is moved in the newly allocated AA slot
    aa[1] = S(2);   // opAssign(S1) is called on existing aa[1] value
    assert(aa.length == 1 && aa[1].val == 2);
}

But, the generated code is a little inefficient because it would search the
given key twice.

// aa[1] = S(1); is lowered to:
1 in aa ? aa[1].opAssign(S(1)) : aa[1].__ctor(1);
// --> 1 in aa is the first key search.
// --> aa[1]   is the second key search.

To fix the issue, we need to add a new internal function in druntime, and
compiler should generate code which uses the function.

The new function's spec is:
- it takes at least two arguments, the AA and assigned value.
- it should return two values, one is the allocated/found slot, and the other
is a boolean flag which the returned slot is newly allocated or not.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 02 2013