在MATLAB代码中使用eval('expression')的含义和含义?

时间:2012-04-22 22:04:49

标签: matlab eval

在matlab中的其他人的代码中遇到了函数 eval(expression)的使用: 例如:

for n = 1 : 4
sn = int2str( n) ;
eval( [ 'saveas( fig'  sn  ', [ sName' sn ' ], ''fig'' ) ' ] );
end
Matlab帮助中的MathWorks东西指出:

  

eval函数的许多常见用法效率较低,并且比其他MATLAB函数和语言结构更难以阅读和调试。

在此之后,我发现在许多其他程序语言中使用此函数,如Python,JavaScript,PHP。

所以我有几个问题:

  1. 这个功能的使用是否会影响我的代码性能?
  2. 如果它会减慢执行速度,为什么会发生?
  3. 如果每次调用都会减慢执行速度,原则上使用此功能的原因是什么?

4 个答案:

答案 0 :(得分:6)

eval功能危险,您实际需要它的示例很少。例如,如果将图形句柄存储在数组fig(1)fig(2)等中并写入

,则可以轻松地重写您提供的代码
for n = 1:4
  filename = sprintf('sName%d', n);
  saveas(fig(n), filename, 'fig');
end

更清晰,使用更少的字符,可以通过Matlab编辑器的linter进行分析,如果(当)需要扩展代码时更容易修改,并且不易出现奇怪的错误。

根据经验,除非你真的知道自己在做什么(即你正在编写一个复杂的Lisp宏或其他等同于操纵语言的AST的东西),否则不要在任何语言中使用eval。如果您不知道这意味着什么,您可能不需要使用eval)。

几乎总能有更清晰,更有效,更危险的方法来达到同样的效果。通常,对eval的调用可以替换为某种形式的recursionhigher-order function或循环。

答案 1 :(得分:5)

  1. 在这里使用eval肯定比非eval版本慢,但很可能它不会成为你代码的瓶颈。但是,性能只是一个问题,维护(包括调试),以及可读性是其他问题。
  2. 发生减速是因为Matlab使用JIT编译器,并且无法优化eval行。
  3. 在大多数情况下,Eval的使用是由于缺乏适当的Matlab功能知识。在这种特殊情况下,问题是图形句柄存储在名为fig1fig4的变量名称中。如果它们存储在名为fig的数组中,即fig(1)等,那么eval就不必要了。
  4. 编辑以下是Loren Shure关于为什么在Matlab中应该避免eval的两篇优秀文章。 Evading evalMore on eval

答案 2 :(得分:1)

在大多数情况下,发生减速是因为必须将字符串解析为实际代码。如果谨慎使用,这不是一个主要的问题,但是如果你发现自己在循环的代码中使用它(要么是显式循环,要么是JavaScript的setInterval()之类的东西),那么你就会遇到重大的性能下降。

我见过eval可以做得更好的常见用途是:

  • 以忽略[]表示法
  • 来访问属性名称
  • 根据参数名称调用函数,而不是使用switch(更安全,可防止代码注入风险)
  • 当它们应该是数组时,访问名为var1var2var3的变量

说实话,我认为我从未遇到eval是解决问题的唯一方法。我想你可以将它比作goto,因为它可以替代程序结构,或者在花费时间使其最佳运行之前作为测试程序的临时解决方案。

答案 3 :(得分:1)

这是另一个含义:

编译使用eval的程序时,必须放置编译指示,告诉编译器需要某些函数。例如:

此代码将编译并运行良好:

 foo()

但是这个需要添加一个pragma:

 %#function foo
 eval('foo()') 

否则您将遇到运行时问题。