bug #14059 : improve suppression of elements on view as vector matrix 17/17217/3
Antoine ELIAS [Thu, 17 Sep 2015 17:00:59 +0000 (19:00 +0200)]
r=rand(1,100000);
tic();r(r<0.5) = [];toc()

alpha 1 : 3.43 s
after path : 0.003 s

Change-Id: Ia389f0ed9bb5a1d6ff5d45cbc5e477aa7abe4d72

scilab/CHANGES_6.0.X
scilab/modules/ast/src/cpp/types/arrayof.cpp
scilab/modules/ast/tests/nonreg_tests/bug_14059.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14059.tst [new file with mode: 0644]

index b7c7b2e..89167a9 100644 (file)
@@ -17,6 +17,8 @@ Scilab Bug Fixes
 
 * Bug #12928 fixed - int functions with %nan and %inf return wrong values.
 
+* Bug #14059 fixed - Lack of performance on deletion of matrix elements.
+
 * Bug #13709 fixed - unique function sometimes returned wrong index values.
 
 * Bug #13750 fixed - Calling ss2ss function with flag = 2 returned an error.
index 26c8956..0b2902b 100644 (file)
@@ -824,6 +824,7 @@ InternalType* ArrayOf<T>::remove(typed_list* _pArgs)
         }
     }
 
+
     if (bTooMuchNotEntire == true)
     {
         //free pArg content
@@ -917,55 +918,91 @@ InternalType* ArrayOf<T>::remove(typed_list* _pArgs)
             int piRealDim[2] = {iNewDimSize, 1};
             pOut = createEmpty(2, piRealDim, m_pImgData != NULL);
         }
+
+        {
+            int iNewPos = 0;
+            int size = getSize();
+
+            //try to sort piNotEntireIndex
+            std::sort(piNotEntireIndex, piNotEntireIndex + iNotEntireSize);
+
+            int last = 0;
+            for (int i = 0; i < iNotEntireSize; ++i)
+            {
+                int ii = piNotEntireIndex[i] - 1;
+                for (int j = last; j < ii; ++j)
+                {
+                    pOut->set(iNewPos, get(j));
+                    if (m_pImgData != NULL)
+                    {
+                        pOut->setImg(iNewPos, getImg(j));
+                    }
+                    iNewPos++;
+                }
+
+                last = ii + 1;
+            }
+
+            for (int i = last; i < size; ++i)
+            {
+                pOut->set(iNewPos, get(i));
+                if (m_pImgData != NULL)
+                {
+                    pOut->setImg(iNewPos, getImg(i));
+                }
+                iNewPos++;
+            }
+        }
     }
     else
     {
         pOut = createEmpty(iDims, piNewDims, m_pImgData != NULL);
-    }
 
-    delete[] piNewDims;
-    //find a way to copy existing data to new variable ...
-    int iNewPos = 0;
-    int* piIndexes = new int[iOrigDims];
-    int* piViewDims = new int[iOrigDims];
-    for (int i = 0; i < iOrigDims; i++)
-    {
-        piViewDims[i] = getVarMaxDim(i, iOrigDims);
-    }
-
-    for (int i = 0; i < getSize(); i++)
-    {
-        bool bByPass = false;
-        getIndexesWithDims(i, piIndexes, piViewDims, iOrigDims);
+        delete[] piNewDims;
+        //find a way to copy existing data to new variable ...
+        int iNewPos = 0;
+        int* piIndexes = new int[iOrigDims];
+        int* piViewDims = new int[iOrigDims];
+        for (int i = 0; i < iOrigDims; i++)
+        {
+            piViewDims[i] = getVarMaxDim(i, iOrigDims);
+        }
 
-        //check if piIndexes use removed indexes
-        for (int j = 0; j < iNotEntireSize; j++)
+        for (int i = 0; i < getSize(); i++)
         {
-            if ((piNotEntireIndex[j] - 1) == piIndexes[iNotEntire])
+            bool bByPass = false;
+            getIndexesWithDims(i, piIndexes, piViewDims, iOrigDims);
+
+            //check if piIndexes use removed indexes
+            for (int j = 0; j < iNotEntireSize; j++)
             {
-                //by pass this value
-                bByPass = true;
-                break;
+                if ((piNotEntireIndex[j] - 1) == piIndexes[iNotEntire])
+                {
+                    //by pass this value
+                    bByPass = true;
+                    break;
+                }
             }
-        }
 
-        if (bByPass == false)
-        {
-            //compute new index
-            pOut->set(iNewPos, get(i));
-            if (m_pImgData != NULL)
+            if (bByPass == false)
             {
-                pOut->setImg(iNewPos, getImg(i));
+                //compute new index
+                pOut->set(iNewPos, get(i));
+                if (m_pImgData != NULL)
+                {
+                    pOut->setImg(iNewPos, getImg(i));
+                }
+                iNewPos++;
             }
-            iNewPos++;
         }
+
+        delete[] piIndexes;
+        delete[] piViewDims;
     }
 
     //free pArg content
     cleanIndexesArguments(_pArgs, &pArg);
 
-    delete[] piIndexes;
-    delete[] piViewDims;
     return pOut;
 }
 
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14059.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14059.dia.ref
new file mode 100644 (file)
index 0000000..9f0cfac
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14059 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14059
+//
+// <-- Short Description -->
+// Lack of performance on vector write operation
+// before patch first test take around 300 seconds
+// with patch it take < 0.1 second on the same machine.
+r=rand(1,1000000);
+tic();r(r<0.5) = [];t = toc();
+assert_checktrue(t < 1);
+r=rand(1,1000000);
+tic();r(r<0.1) = [];t = toc();
+assert_checktrue(t < 1);
+r=rand(1,1000000);
+tic();r(r<0.9) = [];t = toc();
+assert_checktrue(t < 1);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14059.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14059.tst
new file mode 100644 (file)
index 0000000..39b29d0
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14059 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14059
+//
+// <-- Short Description -->
+// Lack of performance on vector write operation
+// before patch first test take around 300 seconds
+// with patch it take < 0.1 second on the same machine.
+
+r=rand(1,1000000);
+tic();r(r<0.5) = [];t = toc();
+assert_checktrue(t < 1);
+
+r=rand(1,1000000);
+tic();r(r<0.1) = [];t = toc();
+assert_checktrue(t < 1);
+
+r=rand(1,1000000);
+tic();r(r<0.9) = [];t = toc();
+assert_checktrue(t < 1);
+
+
+