<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Hello Stephane,<br>
<br>
You can speed up by a factor larger than 100 just by calling v
once (or 3 times) instead of ~1000, as shown by this test:<br>
<pre style="font-family:Monospaced;font-style:normal;font-size:12.0;"><span style="color:rgb(176,24,19);">function</span> <span style="color:rgb(0,0,0);text-decoration:underline;">test2</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(74,85,219);">)</span>
// part 1 : only 1 call to v
<span style="color:rgb(0,0,0);">v</span> <span style="color:rgb(92,92,92);">=</span> <span style="color:rgb(50,185,185);">rand</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(188,143,143);">172</span><span style="color:rgb(0,0,0);">,</span><span style="color:rgb(188,143,143);">1</span><span style="color:rgb(74,85,219);">)</span><span style="color:rgb(0,0,0);">;</span>
<span style="color:rgb(0,0,0);">p</span> <span style="color:rgb(92,92,92);">=</span> <span style="color:rgb(50,185,185);">grand</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(188,143,143);">1</span><span style="color:rgb(0,0,0);">,</span><span style="color:rgb(188,143,143);">839</span><span style="color:rgb(0,0,0);">,</span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(188,143,143);">unf</span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(0,0,0);">,</span><span style="color:rgb(188,143,143);">1</span><span style="color:rgb(0,0,0);">,</span><span style="color:rgb(188,143,143);">173</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(174,92,176);text-decoration:underline;">tic</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(160,32,240);">for</span> <span style="color:rgb(0,0,0);">i</span><span style="color:rgb(92,92,92);">=</span><span style="color:rgb(188,143,143);">1</span><span style="color:rgb(255,170,0);">:</span><span style="color:rgb(188,143,143);">1000</span>
<span style="color:rgb(0,0,0);">m1_v</span> <span style="color:rgb(92,92,92);">=</span> <span style="color:rgb(0,0,0);">v</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(0,0,0);">p</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(160,32,240);">end</span>
<span style="color:rgb(50,185,185);">disp</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(174,92,176);text-decoration:underline;">toc</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(74,85,219);">)</span><span style="color:rgb(74,85,219);">)
</span> // part 2 : 839 calls to v
<span style="color:rgb(0,0,0);">e</span> <span style="color:rgb(92,92,92);">=</span> <span style="color:rgb(188,143,143);">"</span><span style="color:rgb(188,143,143);">M1_v = [ </span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(92,92,92);">+</span><span style="color:rgb(50,185,185);">strcat</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(188,143,143);">v(</span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(92,92,92);">+</span><span style="color:rgb(50,185,185);">string</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(0,0,0);">p</span><span style="color:rgb(74,85,219);">)</span><span style="color:rgb(92,92,92);">+</span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(188,143,143);">) </span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(74,85,219);">)</span><span style="color:rgb(92,92,92);">
+</span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(188,143,143);">]</span><span style="color:rgb(188,143,143);">"</span>
<span style="color:rgb(174,92,176);text-decoration:underline;">tic</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(160,32,240);">for</span> <span style="color:rgb(0,0,0);">i</span><span style="color:rgb(92,92,92);">=</span><span style="color:rgb(188,143,143);">1</span><span style="color:rgb(255,170,0);">:</span><span style="color:rgb(188,143,143);">1000</span>
<span style="color:rgb(50,185,185);">execstr</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(0,0,0);">e</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(160,32,240);">end</span>
<span style="color:rgb(50,185,185);">disp</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(174,92,176);text-decoration:underline;">toc</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(74,85,219);">)</span><span style="color:rgb(74,85,219);">)
// part 3 : calls to "empty" execstr(), to be substrated from the previous result
</span> <span style="color:rgb(0,0,0);">e</span> <span style="color:rgb(92,92,92);">=</span> <span style="color:rgb(188,143,143);">"</span><span style="color:rgb(188,143,143);">M1_v = 0</span><span style="color:rgb(188,143,143);">"</span><span style="color:rgb(0,0,0);">;</span>
<span style="color:rgb(174,92,176);text-decoration:underline;">tic</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(160,32,240);">for</span> <span style="color:rgb(0,0,0);">i</span><span style="color:rgb(92,92,92);">=</span><span style="color:rgb(188,143,143);">1</span><span style="color:rgb(255,170,0);">:</span><span style="color:rgb(188,143,143);">1000</span>
<span style="color:rgb(50,185,185);">execstr</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(0,0,0);">e</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(160,32,240);">end</span>
<span style="color:rgb(50,185,185);">disp</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(174,92,176);text-decoration:underline;">toc</span><span style="color:rgb(74,85,219);">(</span><span style="color:rgb(74,85,219);">)</span><span style="color:rgb(74,85,219);">)</span>
<span style="color:rgb(176,24,19);">endfunction</span></pre>
On my PC, i get: <br>
-->test2 <br>
<br>
0.015 <br>
<br>
1.888 <br>
<br>
0.015 <br>
<br>
So, you do not really need to go to compiled solutions, just to
rewrite 839 lines into ~10 lines.<br>
<br>
Regards<br>
Samuel<br>
<br>
Le 23/04/2015 23:51, Stéphane Mottelet a écrit :<br>
</div>
<blockquote cite="mid:55396964.7030103@utc.fr" type="cite">Hello,
<br>
<br>
I am currently working on a project where Scilab code is
automatically generated, and after many code optimization, the
remaining bottleneck is the time that Scilab spends to execute
simple code like this (full script (where the vector has 839
lines) with timings is attached) :
<br>
<br>
M1_v=[v(17)
<br>
v(104)
<br>
v(149)
<br>
-(v(18)+v(63)+v(103))
<br>
-(v(18)+v(63)+v(103))
<br>
v(17)
<br>
...
<br>
v(104)
<br>
v(149)
<br>
]
<br>
<br>
This kind of large vectors are the used to build a sparse matrix
each time the vector v changes, but with a constant sparsity
pattern. Actually, the time spent by Scilab in the statement
<br>
<br>
M1=sparse(M1_ij,M1_v,[n1,n2])
<br>
<br>
is negligible compared to the time spent to build f M1_v...
<br>
<br>
I have also noticed that if you need to define such a matrix with
more that one column, the time elapsed is not linear with respect
to the number of columns: typically 4 times slower for 2 columns.
In fact the statement
<br>
<br>
v=[1 1
<br>
...
<br>
1000 1000]
<br>
<br>
is even two times slower than
<br>
<br>
v1=[1
<br>
...
<br>
1000];
<br>
v2=[1
<br>
....
<br>
1000];
<br>
v=[v1 v2];
<br>
<br>
So my question to users who have the experience of dynamic link of
user code : do you think that using dynamic link of compiled
generated C code could improve the timings ?
<br>
<br>
In advance, thanks for your help !
<br>
<br>
S.
<br>
<br>
<br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:users@lists.scilab.org">users@lists.scilab.org</a>
<a class="moz-txt-link-freetext" href="http://lists.scilab.org/mailman/listinfo/users">http://lists.scilab.org/mailman/listinfo/users</a>
</pre>
</blockquote>
<br>
</body>
</html>