【问题标题】:Initialising with "undef" for self-documenting code?使用“undef”初始化自记录代码?
【发布时间】:2012-07-26 02:23:29
【问题描述】:

有时候我想写:

my $var = shift // undef;    # argument is optional
                             # or

my $var = $val{optional_value} // undef;

表示可以省略参数,否则// undef当然没用。

这有多贵,是否被编译器优化掉了?

【问题讨论】:

  • 您可能需要进行基准测试以找出答案。
  • 如果我在生产代码中看到它,我很可能会认为这是一个错误。如果您觉得需要,请坚持使用 cmets

标签: perl undef


【解决方案1】:

我敢肯定它不是很贵,但我不得不说

my $var = shift // undef;

没有那么清晰

my $var = shift;    # argument is optional

my $var = shift;    # optional; undef if omitted

它们在运行时肯定(尽管几乎没有)便宜。如果您仍然需要注释(为了清楚起见),那么除了不必要的操作码之外,// undef 真正添加了什么?

【讨论】:

  • 示例中,我只在此处添加了 cmets。
  • @Sadko,我很怀疑,这就是为什么我的示例没有评论。 // undef 对您来说可能很清楚,但我怀疑其他任何阅读您的代码的人都会这样做。另一方面,任何人都应该清楚这些 cmets。
  • 是的。我正在考虑给自己一个提醒。对于其他读者,评论更清楚。
【解决方案2】:

回答你的问题:不是和不是。

【讨论】:

    【解决方案3】:

    我尝试了一个基准测试:

    use strict;
    use Benchmark qw(:all);
    
    sub shu
    {
        my $x = shift // undef;
        return $x // 0;
    }
    
    sub sh
    {
        my $x = shift;
        return $x // 0;
    }
    
    timethese ( 100_000_000, { shu => \&shu, sh => \&sh } );
    
    # outputs:
    
    # Benchmark: timing 100000000 iterations of sh, shu...
    #    sh:  14 wallclock secs (14.95 usr + -0.06 sys = 14.89 CPU) @ 6715916.72/s (n=100000000)
    #    shu: 16 wallclock secs (16.74 usr + -0.02 sys = 16.72 CPU) @ 5980861.24/s (n=100000000)
    

    所以结果证实了上面所说的。

    【讨论】:

      猜你喜欢
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多