2016-09-28 4 views
0

これらの手法のどちらが高速で実行されるのか、その理由は何ですか?Swift Micro最適化:fall-thoughが発生しない複数のif文対else if

if文を使用すると、numberOnePlusOneを1回だけ計算できます。

func test(numberOne:Int, numberTwo:Int) { 
    if numberOne == numberTwo { 
     return 
    } 
    let numberOnePlusOne = numberOne + 1 
    if numberOnePlusOne == numberTwo && numberOnePlusOne < numberTwo { 
     return 
    } else { 
     return 
    } 
} 

だから、他の場合には有益であるならば、私は利益がブロックが落ち-かかわらすることはできません操作せずにコンパイラに伝えるからだろう引き受ける使用した場合。

func test(numberOne:Int, numberTwo:Int) { 
    if numberOne == numberTwo { 
     return 
    } else if numberOne + 1 == numberTwo && numberOne + 1 < numberTwo { 
     return 
    } else { 
     return 
    } 
} 

答えて

0

実行速度が速く、なぜにおける結果であるこれらの技術の差がある場合は?

LLVMバイトコードが中間言語であると考えられる場合、その翻訳はマシン固有の機械語(例えばx86へのコンパイルまたはARMマシンコード)またはこれに対する動作(解釈)

いくつかのマシンは、他のマシンよりも高速です。ブランチング時の方が高速で、分岐予測回路を余分なキャッシュメモリに費やす可能性があります。

基本的に、あなたの質問の問題は、合成ベンチマークを求めているということです。想定していたほど早い時期に最適化されたコードを書くことができます。代わりに、簡単にメンテナンスできるコードを記述し、プロファイラを使用して最も重要なボトルネックを特定する必要があります。それに基づいて最適化してから、もう一度プロファイルを作成して、正しいことを確認してください。次のボトルネック、すすぎ、繰り返し、泡立ちを見つけてください。このアプローチには複数の利点があります。

  • 最も重要なことは、最適な最適化を実装する時間が短縮されることです。これはあなたの時間を最適化しています。
  • マイクロ最適化の推測では、より重要な最適化を可能性の領域から外してはなりません。いくつかの最適化は他のものを防ぐことができます...
  • あなたのコードははるかに読みやすくなります。

可能な場合は、このようにシステムごとに最適化することをおすすめします。この場合、これは実際のコードでは大きなボトルネックになる可能性が高いと私は疑うが、LLVMに基づいた質の高いコンパイラではの両方を同じマシンコードでに最適化できると確信している。デッドコード分析を実施する前に

0

あなたは絶対に間違った経路にいる。マイクロ最適化を検討しています。マイクロオプティマイゼーションは、ナノ秒を節約することがありますが、ほとんどの場合、ナノ秒を保存しません。実際のプログラマは、マイクロ秒を節約する実際の最適化を見ます:-)あるいは時にはソフトウェアの使用可能性とは異なるかどうかを判断します。

あなたは本当に、スウィフトについての本を読む必要があります。あなたの関数は実際に何をしていますか?一見すると、それは何もせず、ただ最適化されているようだ。より詳しく見ると、numberOne + 1がオーバーフローすると、numberOne == numberTwoが指定されていない限り、言語がどのように定義されているかで、クラッシュする必要があります。だから、まともな最適化スウィフトコンパイラは

if numberOne != numberTwo { 
    check_overflow (numberOne + 1); 
} 

と最適化の最初のルールがあるようなものにこれを有効にします:あなたはそれを測定しなかった場合は、それを最適化しません。測定しないということは、自分が何をしているのか、最適化の有無、そして最適化の必要性がないのかどうかわからないことを意味します。

最適化の第2のルールは次のとおりです。コンパイラエンジニアは、実際の有用なコードを支援する最適化をコンパイラに組み込みます。彼らは、最適化できるコードのパターンを特定します。あなたのようなナイスセンスのコードは、これらのパターンのいずれにも該当しないので、最適化されません。

+0

このコードは実行されることはありませんでした。基本構造は、私が取り組んでいたI/Oバウンドプロジェクトから派生したものです。コンパイラがどのように対処するかについての好奇心のために、マイクロ最適化に対する欲求ではありません。 – oneofone