目次

前のトピック

< 静的な解析

次のトピック

コンパイラの警告 >

このページ

最適化

Zephirでのコードは時にとても高レベルなため、Cコンパイラはこのコードを十分に最適化する能力が無いかも知れません。

AOTコンパイラのおかげで、Zephir はコンパイル時に潜在的に実行時間の改善あるいはプログラムに必要なメモリの削減をする最適化を行うことができます。

-f を前につけた名前を渡すことで最適化を有効にすることができます:

zephir -fstatic-type-inference -flocal-context-pass

-fno-を前につけた名前を渡すことで警告を無効にすることができます:

zephir -fno-static-type-inference -fno-call-gatherer-pass

以下の最適化がサポートされます:

static-type-inference

基礎となるコンパイラによってより良く最適化されるstatic/primitive型に潜在的に変換することができる動的変数を探すため、このコンパイルパスはとても重要です。

以下のコードは一連の動的変数を使っていくつかの計算を実行します:

public function someCalculations(var a, var b)
{
        var i = 0, t = 1;

        while i < 100 {
                if i % 3 == 0 {
                        continue;
                }
                let t += (a - i), i++;
        }

        return i + b;
}

変数 ‘a’, ‘b’ および ‘i’ は全て数学演算で使われるため、他のコンパイルパスを利用して静的変数に変換することができます。このパスの後で、コンパイラは自動的にこのコードを以下のように書き換えます:

public function someCalculations(int a, int b)
{
        int i = 0, t = 1;

        while i < 100 {
                if i % 3 == 0 {
                        continue;
                }
                let t += (a - i), i++;
        }

        return i + b;
}

このコンパイルパスを無効にすることで、全ての変数は最適化無しに元々宣言された型を維持するでしょう。

static-type-inference-second-pass

これは最初の静的型推測パスによって集められたデータに基づいて行われた作業を改良する二つ目の推測パスを有効にします。

local-context-pass

このコンパイルパスはヒープに割り当てられるだろう変数をスタックに移動します。この最適化はプログラムが必要とするメモリ間接参照を減らすことができます。

constant-folding

定数の畳み込みはコンパイル時の定数表現を単純化する処理です。以下のコードはこの最適化が有効な時に単純化されます:

public function getValue()
{
        return (86400 * 30) / 12;
}

これは以下のように変換されます:

public function getValue()
{
        return 216000;
}

static-constant-class-folding

この最適化はクラス定数の値をコンパイル時に置き換えます:

class MyClass
{

        const SOME_CONSTANT = 100;

        public function getValue()
        {
                return self::SOME_CONSTANT;
        }
}

これは以下のように変換されます:

class MyClass
{

        const SOME_CONSTANT = 100;

        public function getValue()
        {
                return 100;
        }
}

call-gatherer-pass

このパスは同じメソッド内で何回関数あるいはメソッドが呼ばれたかをカウントします。これによりコンパイラはメソッドあるいは関数のルックアップを避けるためにインラインキャッシュを導入することができます。

これは以下のように変換されます:

class MyClass extends OtherClass
{

        public function getValue()
        {
                this->someMethod();
    this->someMethod(); // This method is called faster
        }
}
TOP
inserted by FC2 system