* Bug 16397 fixed: display of long (real) column vectors repaired 49/21449/4
mottelet [Tue, 31 Mar 2020 14:15:16 +0000 (16:15 +0200)]
https://bugzilla.scilab.org/show_bug.cgi?id=16397

The worst case (100 times slower for 1e5 length) is for a real column
vector. Complex case is not considered because the improved display of
complex vectors and matrices has an unavoidable overhead (display width
of real and imaginary part has be determined by inspecting all values
before formating output).

Change-Id: Ia893bf0cf52629b583688c533fdaba9a0990769d

scilab/CHANGES.md
scilab/modules/ast/src/cpp/types/double.cpp
scilab/modules/ast/tests/nonreg_tests/bug_16397.tst [new file with mode: 0644]

index 818eb9f..1c24798 100644 (file)
@@ -269,6 +269,7 @@ Bug Fixes
 * [#16342](https://bugzilla.scilab.org/16342): `strcat()` was much slower in Scilab 6.0.2.
 * [#16350](https://bugzilla.scilab.org/16350): in if/while conditions, the empty sparse boolean was considered as TRUE.
 * [#16365](https://bugzilla.scilab.org/16365): `median(m,"r")` and `median(m,"c")` yielded wrong results (6.1.0 regression)
+* [#16397](https://bugzilla.scilab.org/16397): display of long (real) column vectors was slow (regression).
 * [#16399](https://bugzilla.scilab.org/16399): `mtlb_zeros([])` was crashing Scilab.
 * [#16401](https://bugzilla.scilab.org/16401): global `external_object_java` class was crashing Scilab.
 * [#16403](https://bugzilla.scilab.org/16403): 1D extraction of matrix with implicit index had wrong dimensions.
index 761f8c7..501724d 100644 (file)
@@ -392,6 +392,33 @@ bool Double::subMatrixToString(std::wostringstream& ostr, int* _piDims, int /*_i
             ostr << std::endl;
         }
     }
+    else if (getCols() == 1 && isComplex() == false)
+    {
+        // real column vector
+
+        // compute the number of ligne to print in function of max line
+        int iLinesToPrint = getRows() - m_iRows1PrintState;
+        if ((iMaxLines == 0 && iLinesToPrint >= MAX_LINES) || (iMaxLines != 0 && iLinesToPrint >= iMaxLines))
+        {
+            // Number of lines to print exceeds the max lines allowed
+            iLinesToPrint = iMaxLines ? iMaxLines : MAX_LINES;
+        }
+
+        // print lines
+        for (int i = 0; i < iLinesToPrint; i++)
+        {
+            printDoubleValue(ostr, m_pRealData[m_iRows1PrintState + i]);
+            ostr << std::endl;
+        }
+
+        // Record what line we were at
+        m_iRows1PrintState += iLinesToPrint;
+        if(m_iRows1PrintState != getRows())
+        {
+            // ask before continue to print
+            return false;
+        }
+    }
     else // matrix
     {
         std::wostringstream ostemp;
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_16397.tst b/scilab/modules/ast/tests/nonreg_tests/bug_16397.tst
new file mode 100644 (file)
index 0000000..a0507e0
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 13936 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16397
+//
+// <-- Short Description -->
+// display of long real vectors in the console is slow
+
+x=rand(1e4,1);
+tic;
+disp(x)
+t1 = toc();
+tic;
+disp([x,x])
+t2 = toc();
+
+assert_checktrue(t2/t1 > 8);
\ No newline at end of file