Le 24/11/2021 à 19:34, Stéphane Mottelet a écrit :
Hi,
Le 24/11/2021 à 18:07, Samuel Gougeon a écrit :
Le 24/11/2021 à 09:51, Stéphane Mottelet a écrit :
Hi,
Le 24/11/2021 à 01:42, Federico Miyara a écrit :
I'm not completely sure, but I think this is not possible since
what is passed to the function isn't a variable but the value
contained in the variable.
No. Internally, input arguments are passed as references to the true
object. There is no copy /unless an input argument *is modified*/ in
the function (in that case a copy with local scope only).
Are you sure about that? Not when they are only reached in read mode?
I might have misunderstood, but i remember a discussion with Clément
during the last ScilabTech. Clément was categorically stating that
all input arguments are copied, only and always copied.
It depends on the type of Callable. If you are talking about Scilab
macros, inputs are (hopefully) never copied. However, if you are
talking about old-style Scilab 5 C-gateways, yes, there is a wrapper
that triggers a copy :
https://github.com/opencollab/scilab/blob/master/scilab/modules/ast/src/cpp/types/function.cpp#L333
3 years ago, we were talking about macros in Scilab 6.0.(1)
This huge improvement of Scilab 6 with respect to Scilab 5 can be
actually tested (below).
As far as i remember, it was never advertized when Scilab 6.0.0 alpha
or final version were released. Has it?
Yet, it drastically improves performances, as in many situations huge
arrays are passed while only a tiny part is extracted and used in the
function.
So, yes, "hopefully", passed inputs are*/no longer/* copied when only
addressed, since Scilab 6.
Thanks for having clarified it.
*With Scilab 5.5.2:*
-->a = rand(1000, 1000, 5);
-->function test(aa),b = 1, endfunction
-->tic(); for i = 1:100, test(a); end; toc()
ans =
0.002
-->function test(aa),aa, endfunction // aa just addressed, without change
-->tic(); for i = 1:100, test(a); end; toc()
ans =
3.211
*With Scilab 6.0.0:*
--> a = rand(1000, 1000, 5);
--> function test(aa),b = 1;, endfunction
--> tic(); for i = 1:100, test(a); end; toc()
ans =
0.0003982
--> function test(aa), aa, endfunction
--> tic(); for i = 1:100, test(a); end; toc()
ans =
0.0003522 !!!!
--> function test(aa),b = aa(2,2,2), endfunction
--> tic(); for i = 1:100, test(a); end; toc()
ans =
0.0006584
--> function test(aa), aa = 3, endfunction
--> tic(); for i = 1:100, test(a); end; toc()
ans =
0.0003663
--> function test(aa),aa(2,2,2) = 1, endfunction
--> tic(); for i = 1:100, test(a); end; toc()
ans =
1.7976679 as expected
_______________________________________________
users mailing list
[email protected]
http://lists.scilab.org/mailman/listinfo/users