2016-03-24 9 views
2

私はこの問題に何度も遭遇しました。私はリストを反復処理して、さまざまな方法でそれを "見て"みたいとします(リストのデータは、解析する方法によって異なって解釈されます)。これは1回の反復でのみ実行できますが、コードは面倒で複雑に見えます。もう1つの方法は、リストを複数回反復することです。タスクごとに1回私はこれと一緒に行くだろうが、リストが非常に大きく、各反復がコストパフォーマンスに優れているとしたらどうだろうか?それはに優れている、要約するので
、:複数の反復または複雑なコードですか?

a)の反復処理し、一度
Bですべてを処理)複数の反復を実行し、1つのタスクのみ各反復

を扱う、私は楽しみにしていますあなたの答えを聞く。

+0

Do __a__を実行して、タスクのそれぞれを、構造の改善のためにリストのユニット項目に何かを行うスタンドアロン関数/モジュールにラップし、オブジェクトが予期せず突然変異していないことを確認します。この質問は、サンプルコードなしで、そして言語仕様なしではかなり曖昧です。 – woozyking

答えて

1

良い質問です。答えは「それは依存する」です。

まず、アーキテクチャを指定していないことに気付きます。たとえば、GPUやCPU上で動作させると、大きな違いがあります。同様に、別のCPUも異なる動作をします。今のところ、わかりやすくするためにIntel CPUを想定していますが、これを覚えておいてください。

あなたはタグ "performance"でこの質問に印を付けましたので、この質問をどのように解釈するのですか。パフォーマンスに関しては、唯一のゴールデンスタンダードがあり、それはベンチマークが真実を伝えることです。つまり、覚えておくべきガイドラインがいくつかあります。

  • 順次データアクセスはランダムアクセスより優れています。これには、メモリモデルやベクトル化の仕組みと関係があります。
  • 予測できない分岐は、潜在的にパフォーマンスを低下させる可能性があります。通常、これはすべてを行う単一のモノリシック関数を作成するときに発生します。
  • "反復"でメモリの小さなブロック(たとえば、< = 4K)を処理できる場合は、キャッシュからの作業を続けるため、通常は高速です。多くの処理が必要な場合は、最初にテストケースを作成してベンチマークすることができます。

マイクアクトンのビデオは、適切な高性能コードを書く方法について多くのことを伝えていると思います。 https://www.youtube.com/watch?v=rX0ItVEVjHchttps://www.youtube.com/watch?v=GPpD4BBtA1Yは、最も重要なビデオです(あなたが私に尋ねると、本当に価値があります)。

1

これはコードの品質とパフォーマンスのトレードオフです。一般的な答えはありません。どちらの選択肢も要件に応じて有効です。

関連する問題