何は、OpenGLレンダラのループで、より生産的である:オペレータまたはラムダの「if」?

alexrnov:

ゲームのレンダリングは、アルゴリズムの変更(画面上のクリックの取扱い)の一部を開始すると。

2つのオプションがあります。1.「IF」演算子:

public class Leve1 implements GLSurfaceView.Renderer {
  private boolean isLoadGame = false;
  public void onSurfaceChanged(GL10 glUnused, int width, int height) {
    ...
    isLoadGame = true; // game is now loaded
  }
  // this method is called often in the render loop
  public void setPassXY(float x, float y) {
    if (isLoadGame) {
      ... // perform algorithm 
    }
  }
}

2.( "IF" のない)ラムダ:

public class Leve1 implements GLSurfaceView.Renderer {
  // when the game is not loaded yet use the empty method body
  private PressXYInterface<Float, Float> pressXY = (pressX, pressY) -> {};
  public void onSurfaceChanged(GL10 glUnused, int width, int height) {
    ...
    pressXY = (passX, passY) -> { 
      ... // game is now loaded - add algorithm
    };
  }
  // this method is called often in the render loop
  public void setPassXY(float x, float y) {
    pressXY.invoke(x, y); // perform algorithm
  }
}

@FunctionalInterface
public interface PressXYInterface<T, U> {
  void invoke(T x, U y);
}

質問:パフォーマンスの面で使用することをお勧めしアプローチ?

スティーブンC:

私は、単一の正解が存在することができるとは思いません。場合によります。

一方では、ラムダを使用したバージョンが保存されますif声明を。

一方、メソッド呼び出しを使用したバージョンは、潜在的にJITコンパイラによってインライン化することができます。(異なる時点でアプリケーションが/異なるラムダを呼び出すことができるであろうので、ラムダコールがインライン化することができません。)

一方、// perform algorithm十分に複雑であり、インラインにはあまりにも大きいだろう。

一方、algorithmインラインには大きすぎる、おそらくコストifのテストは無視できるほど小さくなります。

一方、ifテストは、あなたが想像するよりも高価になることがあります。例えば:

  • コードJITのみで実行した後にコンパイルした場合isLoadGame == trueの状態は、統計は、テストが成功した場合のコードを付勢伝えることができます。
  • (ハードウェア)分岐予測は、パフォーマンスに影響を与える可能性があります。

一方、それはどちらか私にはクリアしていないか、または両方のバージョンは、単純な呼び出しまたは仮想呼び出しを行う必要があります。そして、JITコンパイラがいるかどうか可能性が仮想呼び出しを最適化します。私は単に知りません。

その後、別のJITコンパイラのバージョン、異なるハードウェアISA、異なるハードウェア実装の問題があります。

要するに、高速になりますどのアプローチを予測するためにあまりにも多くの要因があります。

あなたのベンチマーク実際のアプリケーションは、信頼できる答えを得るための唯一の方法です。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=22092&siteId=1