这个perl sub如何针对速度进行优化?

时间:2011-08-09 14:15:51

标签: performance perl

以下perl sub用于存储哈希数组。 首先使用给定密钥检查要存储的每个哈希的唯一性,如果数组上存在具有相同键值的哈希,则不存储该哈希。

这个perl sub如何针对速度进行优化?

使用示例:

my @members;
...
$member= {};
$hash->{'name'}='James';
hpush('name', \@members,$member);

子:

sub hpush {
  # push a set of key value pairs onto an array as a hash, if the key doesn't already exist
  if (@_ != 3) {
    print STDERR "hpush requires 3 args, ".@_." given\n";
    return;
  }

  my $uniq = shift;
  my $rarray = shift;
  my $rhash = shift;
  my $hash = ();

  #print "\nHash:\n";
  for my $key ( keys %{$rhash} ) {
    my $valuea = $rhash->{$key};

    #print "key: $key\n";
    #print "key=>value: $key => $valuea\n";
    $hash->{ $key} = $valuea;
  }

  #print "\nCurrent Array:\n";
  for my $node (@{$rarray}) {
    #print "node: $node \n";
    for my $key ( keys %{$node} ) {
      my $valueb = $node->{$key};
      #print "key=>value: $key => $valueb\n";
      if ($key eq $uniq) {
        #print "key=>value: $key => $valueb\n";
        if (($valueb =~ m/^[0-9]+$/) && ($hash->{$key} == $valueb)) {
          #print "Not pushing i $key -> $valueb\n";
          return;
        } elsif ($hash->{$key} eq $valueb) {
          #print "Not pushing s $key -> $valueb\n";
          return;
        }
      }
    }
  }
  push @{$rarray}, $hash;
  #print "Pushed\n";

}

请注意,perl不是我的,我是初学者

1 个答案:

答案 0 :(得分:10)

这段代码相当......效率不高。首先,由于某种原因,它会将$rhash复制到$hash,并带有for循环。然后它循环遍历散列键,而不是简单地使用它正在寻找的散列键。然后它会进行两次等效检查,显然是一些尝试将数字与非数字区分开来并选择适当的检查(==eq)。这都是不必要的。

以下代码应大致相同。我已经把它修剪得很难了。这应该尽可能快地得到它。

use strict;
use warnings;

hpush('name', \@members,$member);

sub hpush { 
    my ($uniq, $rarray, $rhash) = @_;

    for my $node (@{$rarray}) {
        if (exists $node->{$uniq}) {
            return if ($node->{$uniq} eq $rhash->{$uniq});
        }
    }
    push @{$rarray}, $rhash;
}