我遇到了在MATLAB别人的代码函数eval(表达)的使用:例如:
for n = 1 : 4
sn = int2str( n) ;
eval( [ 'saveas( fig' sn ', [ sName' sn ' ], ''fig'' ) ' ] );
end
在Matlab帮助MathWorks的东西指出:
eval函数的许多常见的用途是效率较低,比其他MATLAB功能和语言结构更加难以阅读和调试。
在此之后,我发现在很多其他程序语言的这一功能的使用,所以像Python,JavaScript的,PHP。
所以,我有几个问题:
- 请问这个功能的使用可以在我的代码的性能enfluenced?
- 如果将执行慢下来,为什么会出现?
- 如果每一个所谓的,有什么理由使用这个功能在原理上,当时间放慢执行?
- 使用eval这里肯定会比非EVAL版本慢,但它很可能不会在你的代码的瓶颈。 不过,性能上只有一个问题,维护(含调试),以及可读性是其他的。
- 发生减速因为Matlab的使用JIT编译器,和
eval
线不能被优化。 - EVAL使用在大多数情况下,由于缺乏对Matlab的功能,这将是合适的,而不是知识。 在这种特殊情况下,问题是,这个数字句柄存储在一个名为变量名
fig1
通过fig4
。 如果他们被存储在数组中称为fig
,即fig(1)
等, eval
本来不必要的。
编辑在这里是由罗兰舒尔为什么两个优秀的文章eval
应在Matlab避免。 规避EVAL ,以及更多关于EVAL 。
该eval
功能是危险的 ,有些情况下,你真的需要它很少的例子。 例如,你给代码可以容易地如果存储该图在一个阵列处理重写fig(1)
fig(2)
等,并写
for n = 1:4
filename = sprintf('sName%d', n);
saveas(fig(n), filename, 'fig');
end
这是更清晰,使用更少的字符,可以通过Matlab的编辑器的棉短绒进行分析,更容易修改的,如果(当)你需要扩展的代码,是不容易的莫名其妙的错误。
作为一个经验法则,你不应该使用eval
在任何语言,除非你真的知道自己在做什么(即你正在编写一个复杂的Lisp宏或别的东西等同于操纵语言的AST -如果你不知道什么这意味着,你可能不需要使用eval
)。
几乎总有更清晰,更有效和更危险的方式来达到同样的效果。 通常情况下,对呼叫eval
可以用某种形式来代替递归 ,一个高阶函数或循环。
在大多数情况下,将出现放缓,因为字符串必须被解析成实际的代码。 这是不是如果保守地使用这样一个重大的问题,但如果你发现自己在循环代码中使用(无论是外在的循环或东西像JavaScript的setInterval()
那么你在主要的性能下降是。
我见过的一般用途eval
可以做更好的是:
- 访问属性名称中的无知
[]
符号 - 基于一个参数名称,它可以替代地与完成通话功能
switch
(更安全,防止代码注入的风险) - 访问命名变量一样
var1
, var2
, var3
时,他们应该是数组来代替
说实话,我不认为我曾经遇到过一个情况eval
是解决问题的唯一途径。 我想你可以把它比作goto
在于它是程序结构的替代品,或可作为一个临时的解决方案花费的时间使其以最佳状态工作之前测试的程序。
这里是另一个含义:
当您编译使用程序eval
,你必须把编译指示,告诉所需要的一些功能的编译器。 例如:
这段代码可以编译和运行良好:
foo()
但是,这一个需要编译补充说:
%#function foo
eval('foo()')
否则,你会遇到一个运行时的问题。