eval(): remove the for/for-end/end loop (20x faster on a 100x100 matrix) 17/18417/4
Samuel GOUGEON [Sat, 6 Aug 2016 05:25:28 +0000 (07:25 +0200)]
  n = 100; m = rand(n,n+1); s=string(m); tic(); e = eval(s); toc()

Change-Id: I2b2413e8eadcf874aa25565a2be9cc4b969bb1f1

scilab/modules/string/macros/eval.sci
scilab/modules/string/tests/benchmarks/bench_eval.tst [new file with mode: 0644]

index 09fa7e3..66d4be1 100644 (file)
@@ -1,6 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA -
-// Copyright (C) DIGITEO - 2010 - Allan CORENT
+// Copyright (C) DIGITEO - 2010 - Allan CORNET
+// Copyright (C) 2016 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
@@ -16,20 +17,20 @@ function _h = eval(z)
     // Syntax :  H = eval(Z)
     // returns the evaluation of the matrix of character strings Z.
     // Example: a=1; b=2; Z=['a','b'] ; eval(Z) returns the matrix [1,2];
-    //!
 
-    _h = [];
-    [mz, nz] = size(z);
-    if mz * nz > 1 then
-        str = [];
-        for l = 1:mz, for k = 1:nz,
-                str = [str; "%_h(" + string(l) + ", " + string(k) + ")=" + z(l,k)];
-            end
-        end
+    [nL,nC] = size(z);
+    if nL * nC > 1 then
+        L = (1:nL)'*ones(1,nC)
+        C = ones(nL,1)*(1:nC)
+        //str = "_h("+string(L)+","+string(C)+")="+z    // format()-dependent
+        str = msprintf("_h(%d,%d)=%s\n",L(:),C(:),z(:)) // format()-independent
+    elseif z~=[]
+        str = "_h = " + z;
     else
-        str = "%_h = " + z;
+        _h = []
+        return
     end
-    %_h = [];
-    deff("[%_h] = %eval();", str);
-    _h = %eval();
+    deff("_h = %eval();", str)
+    _h = %eval()
+
 endfunction
diff --git a/scilab/modules/string/tests/benchmarks/bench_eval.tst b/scilab/modules/string/tests/benchmarks/bench_eval.tst
new file mode 100644 (file)
index 0000000..6d62d72
--- /dev/null
@@ -0,0 +1,17 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aimé AGNEL
+// Copyright (C) 2016 - Samuel GOUGEON <sgougeon@free.fr>
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// Benchmark test for eval function
+n = 100;
+m = rand(n, n+1);
+s = string(m);
+
+// <-- BENCH NB RUN : 10 -->
+// <-- BENCH START -->
+e = eval(s);
+// <-- BENCH END -->