コンポーネントについて
2 posters
コンポーネントについて
お世話になります。4D v16.6です。
コンポーネントについて今更ながら試してみました。v18がーとかいってるのに周回遅れ感が激しいですが・・・また、コンパイル実行とインタープリタ実行、そしてコンポーネントとの関係についても調べていました。
コンポーネントとしてソースストラクチャーを指定したら、ホストのコンパイル実行とインタープリター実行で、自動的に切り替えて対応するコードが実行されるようでした。その際には処理内容によって、明らかなパフォーマンスの差異がありました。(当然ながらコンパイルモードの方が早い)コンポーネントをビルドしたコンパイル済みストラクチャーにしたら、ホスト側の実行環境に左右されずパフォーマンスが発揮できました。
四つのパターンでB,C,Dではほぼ誤差範囲の処理結果で、Aのみが遅い結果となりました。しかしながら、パフォーマンスとしては約20%の向上に留まっています。
4D 6.x時代、4D 200x時代にコンパイルしたバイナリで実行したら10倍ほどパフォーマンスアップした記憶があります。<処理にもよりますが>例えば32kを超えるようなテキストブロックBLOBを走査して簡易的なワードラップ処理(Shift_JISの句読点や英単語のぶら下がり行送り等の禁則処理)を行い改行を挿入するなど、その当時Cのプラグインと4Dコードでほぼ同等の結果になるように作成し、4Dのコンパイル実行がプラグイン実行速度と遜色ないことに驚いた程です。
今回、CSVをBLOBに読み込んで解析し二次元配列に展開、配列の行と列からデータ取り出し、テキスト変換処理などを実施しましたが、10倍は言い過ぎでも、2〜3倍のパフォーマンスアップは期待していただけに20%という数字にはちょっと残念でした。これは、コンパイル実行の速度アップ効果が薄い?(中間コード処理している等)又はv16v17辺りではインタープリター実行が爆速になっている?どのように解釈したらよいのでしょうか。
ホスト側とコンポーネント側に同一名のメソッドがあった場合、ホスト側が優先して実行されるようですが、これを明示的に切り替える方法はありますでしょうか?
また、メソッドエディタでコンポーネントメソッドと、ホストメソッドのどちらを指し示しているかをコードハイライトで分かりやすくできると嬉しいかも。
コンポーネントについて今更ながら試してみました。v18がーとかいってるのに周回遅れ感が激しいですが・・・また、コンパイル実行とインタープリタ実行、そしてコンポーネントとの関係についても調べていました。
コンポーネントとしてソースストラクチャーを指定したら、ホストのコンパイル実行とインタープリター実行で、自動的に切り替えて対応するコードが実行されるようでした。その際には処理内容によって、明らかなパフォーマンスの差異がありました。(当然ながらコンパイルモードの方が早い)コンポーネントをビルドしたコンパイル済みストラクチャーにしたら、ホスト側の実行環境に左右されずパフォーマンスが発揮できました。
ホスト側 | コンポーネント側 | |
A | インタープリター | インタープリター |
B | コンパイル | インタープリター(実行はコンパイルコードに切り替わる?) |
C | インタープリター | コンパイル |
D | コンパイル | コンパイル |
4D 6.x時代、4D 200x時代にコンパイルしたバイナリで実行したら10倍ほどパフォーマンスアップした記憶があります。<処理にもよりますが>例えば32kを超えるようなテキストブロックBLOBを走査して簡易的なワードラップ処理(Shift_JISの句読点や英単語のぶら下がり行送り等の禁則処理)を行い改行を挿入するなど、その当時Cのプラグインと4Dコードでほぼ同等の結果になるように作成し、4Dのコンパイル実行がプラグイン実行速度と遜色ないことに驚いた程です。
今回、CSVをBLOBに読み込んで解析し二次元配列に展開、配列の行と列からデータ取り出し、テキスト変換処理などを実施しましたが、10倍は言い過ぎでも、2〜3倍のパフォーマンスアップは期待していただけに20%という数字にはちょっと残念でした。これは、コンパイル実行の速度アップ効果が薄い?(中間コード処理している等)又はv16v17辺りではインタープリター実行が爆速になっている?どのように解釈したらよいのでしょうか。
ホスト側とコンポーネント側に同一名のメソッドがあった場合、ホスト側が優先して実行されるようですが、これを明示的に切り替える方法はありますでしょうか?
また、メソッドエディタでコンポーネントメソッドと、ホストメソッドのどちらを指し示しているかをコードハイライトで分かりやすくできると嬉しいかも。
osaru- 投稿数 : 67
登録日 : 2017/08/14
Re: コンポーネントについて
同名のメソッドがあった場合,ホストのほうが参照されるのは仕様です。
この特性を利用し,処理の流れをホスト側に誘導したり,
デバッグ中はホスト側のメソッドをトレースし,
コンパイル前に当該メソッドを「ゴミ箱」に入れて,
コンポーネント側に処理を戻す,といったことができますが,
どうしても間違いが起きやすいので,やはり,
同名のメソッドは作成しないのが無難だと思います。
どちらが参照されるかは,実行時に決まることなので,
メソッドエディター上で区別されるようなことはありません。
なお,メソッドがコンポーネントで実行されているかどうかは,
Structure file=Structure file(*) で判定できます。
いずれにしても,コンポーネントの公開メソッド数は最小限に留めておき,
サブルーチンは非公開にすることで,
ホスト側の名前空間が混雑することを避けることが大事です。
パフォーマンスについていえば,
コマンドはすでにコンパイルされているわけですから,
違いは条件分岐(For, While...)や演算(+, *, ...)などに限られます。
あと,おおきいのは,コンパイルモードでは変数の宣言をしない(コンパイル時にすべて宣言済み)という点でしょうか。
単純にコマンドをたくさん実行しているだけのメソッドは,
すでにコンパイルモードと同等に速いはずです。
最後に,ワードラップするのであれば,
TEXT TO ARRAYコマンドが便利です。
https://doc.4d.com/4Dv17R6/4D/17-R6/TEXT-TO-ARRAY.301-4310515.ja.html
この特性を利用し,処理の流れをホスト側に誘導したり,
デバッグ中はホスト側のメソッドをトレースし,
コンパイル前に当該メソッドを「ゴミ箱」に入れて,
コンポーネント側に処理を戻す,といったことができますが,
どうしても間違いが起きやすいので,やはり,
同名のメソッドは作成しないのが無難だと思います。
どちらが参照されるかは,実行時に決まることなので,
メソッドエディター上で区別されるようなことはありません。
なお,メソッドがコンポーネントで実行されているかどうかは,
Structure file=Structure file(*) で判定できます。
いずれにしても,コンポーネントの公開メソッド数は最小限に留めておき,
サブルーチンは非公開にすることで,
ホスト側の名前空間が混雑することを避けることが大事です。
パフォーマンスについていえば,
コマンドはすでにコンパイルされているわけですから,
違いは条件分岐(For, While...)や演算(+, *, ...)などに限られます。
あと,おおきいのは,コンパイルモードでは変数の宣言をしない(コンパイル時にすべて宣言済み)という点でしょうか。
単純にコマンドをたくさん実行しているだけのメソッドは,
すでにコンパイルモードと同等に速いはずです。
最後に,ワードラップするのであれば,
TEXT TO ARRAYコマンドが便利です。
https://doc.4d.com/4Dv17R6/4D/17-R6/TEXT-TO-ARRAY.301-4310515.ja.html
miyako- 投稿数 : 485
登録日 : 2016/07/05
Permissions in this forum:
返信投稿: 不可
|
|