Gforth を CGI スクリプトやシェルスクリプトで使用する場合、 起動速度が問題になる場合があります。 libc-2.7 を搭載した 64 ビット
Linux 2.6.27.8 上の 3GHz Core 2 Duo E8400 では、 gforth-fast -e bye
でユーザー時間は 13.1 ミリ秒、システム時間は 1.2 ミリ秒かかります(gforth -e bye
は、
下記で説明するオプションの一部を組み込んでいるため、 ユーザー時間は約 3.4 ミリ秒、 システム時間は 1.2 ミリ秒で起動がより高速になります)。
起動速度が問題になる場合は、 以下の改善方法を検討してください。 または、 起動の数を減らす方法(Fast-CGI の使用など)を検討することもできます。 以下の最初の手順では、 (コンパイル時間を含む)実行時間を犠牲にして起動時間を短縮するため、 それで利益が得られるかどうかはあなたのアプリケーションでのこれらの時間のバランスによって決まることに注意してください。
Gforth の起動速度に影響を及ぼす簡単な手順は、 実行時間(run-time)を増加させながらイメージの読み込み時間(image-loading time)を短縮する多数のオプションを使用してみることです。
最初に試す必要があるのは --ss-number=0 --ss-states=1
です。
このオプションは実行時の高速化が比較的わずかなのに、 起動時にかなりの時間がかかるためです。 gforth-fast
--ss-number=0 --ss-states=1 -e bye
には、 ユーザー時間が約 2.8 ミリ秒、 システム時間が約 1.5
ミリ秒かかります。
次のオプションは --no-dynamic
です。 これは実行時間に大きな影響を及ぼします(いくつかのプラットフォームでは約 2
倍です)が、 それでも起動速度が若干速くなります。 gforth-fast -- ss-number=0 --ss-states=1
--no-dynamic -e bye
は、 約 2.6 ミリ秒のユーザー時間と 1.2 ミリ秒のシステム時間を消費します。
起動速度を向上させるための次のステップは、 データ再配置可能イメージ(data-relocatable
image)を使用することです(see Data-Relocatable Image Files)。 これにより、
イメージ内のコードの再配置コストが回避されます(ただし、 データの再配置コストは回避されません)。 イメージは、 使用している特定のバイナリ(つまり、
gforth
、 gforth-fast
、さらには特定のビルド)に固有であることに注意してください。
./gforth-fast
で動作するデータ再配置可能イメージを作成するには、 GFORTHD="./gforth-fast
--no-dynamic" gforthmi gforthdr.fi
とします(これには --no-dynamic
が必要です。そうしないとこのイメージは機能しません)。 そして、 gforth-fast -i gforthdr.fi ... -e
bye
で実行します(上記で説明したフラグは、 再配置可能なコードでのみ機能するため、ここでは重要ではありません)。
gforth-fast -i gforthdr.fi -e bye
では、 ユーザー時間は約 1.1 ミリ秒、 システム時間は約 1.2
ミリ秒かかります。
さらにもう 1 つのステップは、 再配置不可イメージ(non-relocatable image)を使用することで、
すべての再配置コストと書き換え時コピー(copy-on-write;COW)コストの一部を回避することです(see Non-Relocatable Image Files)。ただし、 アドレス空間のランダム化が行われているオペレーティング・システム(最近の Linux 等ではこれがデフォルト)や、
その他の理由でディクショナリーが移動した場合(OS カーネルの変更や、 ライブラリー更新などの場合)には機能しないという欠点があるため、
あまりお勧めできません。再配置不可イメージ(non-relocatable image)を作成するために gforth-fast
--no-dynamic -e "savesystem gforthnr.fi bye"
とします(ここでも --no-dynamic
が必要です)。 そして、 gforth-fast -i gforthnr.fi ... -e bye
として実行します(ここでも、
上記で説明したフラグは重要ではありません)。 gforth-fast -i gforthdr.fi -e bye
はユーザー時間は約
0.9 ミリ秒、 システム時間は約 0.9 ミリ秒かかります。
実行するスクリプトに大量のコードが含まれている場合は、 起動時のコンパイルのコストを避けるために、 それをイメージにコンパイルすると有益な場合があります。