Functions vs scripts: speed

29 visualizaciones (últimos 30 días)
Alessandro D
Alessandro D el 26 de Jun. de 2018
Comentada: Steven Lord el 27 de Jun. de 2018
Dear all,
The structure of my code is the following:
** VERSION A**************
output = fun1(inputs)
Piece of code written directly
in the function
end
************************** **** VERSION B **********
output = fun1(inputs)
% The same piece of code is written
% in a script, that is called by the function
run('script1')
end
Both versions give exactly the same results, but version A is much faster. I think version B is better in terms of code readability (I prefer to break the code in smaller chunks), so I would like to know if someone has an idea why version B is slower
Thanks!!
  1 comentario
Stephen23
Stephen23 el 27 de Jun. de 2018
Editada: Stephen23 el 27 de Jun. de 2018
"why version B is slower"
Excluding any possible effects from JIT optimization, it is quite reasonable that B would be slower. Compare:
A:
  1. search MATLAB path for function file fun1
  2. run function code
B:
  1. search MATLAB path for function file fun1
  2. run function code
  3. search MATLAB path for script file script1
  4. run script code using magic run...
Note that scripts should be avoided. Scripts are fun for playing around with, but code that needs to be efficient, testable, and repeatable will use functions (or classes).

Iniciar sesión para comentar.

Respuesta aceptada

OCDER
OCDER el 27 de Jun. de 2018
Glad you're thinking about coding practice and optimization.
Version B is worse in terms of time, debugging, and coding practice. Version B "poofs" in variables into your fun1 local workspace, making it difficult to figure out what went wrong. You also have to use the run function, which is in itself a function that uses the evalin function which is in itself a complex and slow function. Instead of "script1", make it a function by itself.
function output = fun1(inputs)
a = script1(inputs);
output = a+1;
end
The issue with version B:
Say you have 2 scripts:
script1.m contains:
a = 2;
script2.m contains:
for a = 1:10
b = a;
end
function output = fun1(inputs)
run('script1')
run('script2')
output = a; %Which a are you referring to? WHERE did a come from? a = 10. Ooops, forgot script2 uses "a".
end
  2 comentarios
Alessandro D
Alessandro D el 27 de Jun. de 2018
Thanks for your answer! The best practice is indeed to make script1 a function itself that is called by fun1. The issue is that now script1, being defined as a function, doesn't see all the variables defined in fun1, so I have to pass them explicitely and if you have many of them it can become tedious.
function output = fun1(inputs)
% Define other objects here
var1 = 2;
var2 = 4.5;
var3 = 1.06;
a = script1(inputs,var1,var2,var3);
output = a+1;
end
Steven Lord
Steven Lord el 27 de Jun. de 2018
If script1 only needs to be called from within fun1, consider making it a nested function inside fun1. If you do that, it can "share" variables with fun1.
If it needs to be callable from within fun1 and from other functions, one approach to avoid the tedium (and potential error of forgetting one or adding an extra one) is to pack the inputs into a struct array (or an object) and pass the struct between the functions.

Iniciar sesión para comentar.

Más respuestas (1)

John D'Errico
John D'Errico el 27 de Jun. de 2018
Option B is a REALLY bad programming style. It is slow, as you found out. It prevents MATLAB from optimizing your code for efficiency.
In general, learn to avoid scripts. Put the heavy lifting work into functions, although sometimes a mainline script to combine everything together is not a bad thing. What you have here in B is the worst of worlds.
As you learn to write functions, making your code modular, you will be able to reuse code for a variety of problems. That gains on programming time, for your NEXT project. It helps you to debug your code, because you work on one small function at a time. Get each part correct, then worry about the next part.
Is option B better for readability? Why would it be so? Sorry, but not true. Learn to write and use functions. Your code will be better for it, especially as you start to write MODULAR code.
  1 comentario
Jan
Jan el 27 de Jun. de 2018
+1. Exactly. Prefer functions. They are nicer, faster, more reliably and easier to debug and to maintain.

Iniciar sesión para comentar.

Categorías

Más información sobre Variables en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by