16

Perl には、配列に何らかの情報を入力するサブルーチンがよくあります。私は C++ でのハッキングにも慣れているので、参照を使用して Perl で次のようにすることがよくあります。

my @array;
getInfo(\@array);

sub getInfo {
   my ($arrayRef) = @_;
   push @$arrayRef, "obama";
   # ...
}

より簡単なバージョンの代わりに:

my @array = getInfo();

sub getInfo {
   my @array;
   push @array, "obama";
   # ...
   return @array;
}

もちろん、その理由は、配列がサブルーチンでローカルに作成され、戻り時にコピーされることを望まないからです。

そうですか?それとも、とにかく Perl はそれを最適化しますか?

4

8 に答える 8

2

これは、私が通常配列を返す方法です。

sub getInfo {
  my @array;
  push @array, 'foo';
  # ...
  return @array if wantarray;
  return \@array;
}

このようにして、スカラーまたはリストのコンテキストで、希望どおりに機能します。

my $array = getInfo;
my @array = getInfo;

$array->[0] == $array[0];

# same length
@$array == @array;

コードの遅い部分であることがわかっていない限り、最適化しようとはしません。それでも、ベンチマークを使用して、どのサブルーチンが実際に高速であるかを確認します。

于 2009-02-13T17:38:20.720 に答える
0

大きなファイル全体を読み取り、それを配列にスライスする場合、他の 3 つの潜在的に大きなパフォーマンスの向上:

  1. read() の代わりに sysread() を使用して BUFFERING をオフにします (混合に関する手動の警告)
  2. 最後の要素を評価して配列を事前拡張 - メモリ割り当てを節約
  3. Unpack() を使用して、uint16_t グラフィック チャネル データなどのデータをすばやく分割します

配列参照を関数に渡すと、メイン プログラムは単純な配列を処理できますが、一度だけ書き込みを忘れるワーカー関数は、より複雑な "$@" と矢印 ->[$II] アクセス フォームを使用します。かなりC'ishなので、高速になりそうです!

于 2016-03-25T05:57:42.343 に答える