* Bug #13908 fixed - part(text, n:$) was very slow. 93/17293/2
Clément DAVID [Wed, 7 Oct 2015 19:25:54 +0000 (21:25 +0200)]
Change-Id: I873009170ee38f6cc28357ce929238cfe999aa3a

scilab/CHANGES_6.0.X
scilab/modules/string/macros/%ip_part.sci

index 08b50f5..217b06d 100644 (file)
@@ -47,6 +47,8 @@ Scilab Bug Fixes
 
 * Bug #13907 fixed - Avoids the gray background on the right panel of the palette Browser.
 
+* Bug #13908 fixed - part(text, n:$) was very slow.
+
 * Bug #13919 fixed - Scilab parsed "hidden" as a reserved keyword but it is not used.
 
 * Bug #13944 fixed - The menu "Toolboxes" was missing.
index f8c2d97..57fb01d 100644 (file)
@@ -1,5 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) - 2013 - Samuel GOUGEON
+// Copyright (C) - 2013, 2015 - Samuel GOUGEON
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -12,29 +12,25 @@ function r = %ip_part(txt, s)
     // Calls with unranging $ are not supported => define %p_part()
     // txt may be a matrix of texts with different lengths
     //  => $ might not have the same value for all of them
-    function b = checkip(p)
-        b = checkvar(p(1)) & checkvar(p(2)) & checkvar(p(3));
-    endfunction
 
-    function b = checkvar(p)
-        b = %t;
-        if typeof(p) == "polynomial" & varn(p) ~= "$" then
-            b = %f;
-        end
-    endfunction
-
-    //check s
-    if ~checkip(s) then
-        msg = _("%s: Wrong value for input argument #%d: $ expected.\n");
-        error(msprintf(msg,"part",2))
-    end
+    //checking s is useless: a) it is necessarily an IP since %ip_... is called.
+    //  b) it can be of any variable name, not necessarilly "$":
+    //  part("abcde", %z:-1:1) works as well
 
     L = length(txt)
-    U = unique(L)
     r = emptystr(txt)
-    for u = U(:)'
-        j = 1:u
-        k = find(L==u)
-        r(k) = part(txt(k), j(s))
+    if length(L)>100 then
+        U = unique(L)   // lengthy... So we factorize through unique() only for
+        // big arrays of strings
+        for u = U'
+            j = 1:u
+            k = find(L==u)
+            r(k) = part(txt(k), j(s))
+        end
+    else                // Otherwise, a direct element-wise processing is faster.
+        for i = 1:size(L, "*")
+            j = 1:L(i)
+            r(i) = part(txt(i), j(s))
+        end
     end
 endfunction