Dan*_*umb 2 perl performance code-organization
我赞成这样的想法,即在你打算使用它们之前不应该对变量进行初始化.它使得记住变量所代表的内容变得更容易,如果它由消耗它的代码,它会减少变量在初始化和正确使用之间被滥用的可能性.
当变量的使用在一个或两个循环内时,会出现问题.然后,初始化的成本会成倍增加,并可能开始影响性能.
在Perl中(或者通常,在适当的情况下),它们是否有任何简洁的技术允许您将变量的初始化置于循环中,但是它只在第一次传递时被初始化?
我想到了类似的东西:
my $variable = undef;
while ($outer_loop) {
while ($inner_loop) {
$variable = $variable || 'initial_value'
}
}
Run Code Online (Sandbox Code Playgroud)
注意:这意味着$variable不会在循环中重新分配.
现在也许是我,但这似乎有点不雅.
所以,这是我的问题:是否有一种更简洁的方法来做到这一点,或者我只是需要过度自我并在代码组织方面做出妥协,或者在上面采用那种"不优雅"的解决方案?
要解决注释中的问题(变量在函数中计算):
用于优化所需逻辑的标准技术称为memoization(该函数).在其他方法中,Perl有Memoize模块,或者您可以自己完成.
use Memoize;
memoize('slow_function');
while ($outer_loop) {
while ($inner_loop) {
my $variable = slow_function(arguments);
}
}
Run Code Online (Sandbox Code Playgroud)此外,如果函数在整个循环中始终产生100%相同的值(按设计),则只需通过在循环之前的语句中初始化变量来执行穷人的memoization.
如果你有一个3页长的循环(例如,在循环之前进行初始化是与循环内部相比的可读性问题那么长),你有一个比初始化行的位置更大的编码问题,并且需要重新首先考虑您的代码.
顺便说一句,如果你唯一关心的是在循环之前放置变量是因为它破坏了"这个变量只在这个循环中使用"的可读性上下文,你可以通过以下任一方法轻松解决它:
记录良好的代码 - 相应地命名变量,或者向初始化行添加注释,或者两者都有.
或者,通过命名一个类似的变量my $default_value_for_next_loop = long_func();,并在循环内部实际创建一个初始化的本地循环变量:my $loop_var = $default_value_for_next_loop;
另外,就你自己的方法而言($variable = $variable || 'initial_value';); 我个人觉得这绝对优雅可读,但是!我很确定它实际上比直接表现差$variable = $default_value_for_next_loop;,因为它有条件语句而不是直接赋值.但如果没有基准测试,我无法确定.
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |