ホームページ  >  記事  >  バックエンド開発  >  言語の反映が遅いのはなぜですか? 反映の重要性は何ですか?なぜ C++ にはリフレクションがないのでしょうか?

言語の反映が遅いのはなぜですか? 反映の重要性は何ですか?なぜ C++ にはリフレクションがないのでしょうか?

WBOY
WBOYオリジナル
2016-06-17 08:31:292261ブラウズ

1. PHP、Java、C# にはすべてリフレクションがありますが、多くのチュートリアルではリフレクションが遅いと書かれていますが、なぜリフレクションが遅いのでしょうか?
2. 遅いのに、なぜこれらの言語はリフレクションを提供するのでしょうか? これらの言語にはリフレクションが必要ですか?
3. C++ にはリフレクションがないのはなぜですか? C++ もオブジェクト指向です

返信内容:

通常、リフレクションが遅いのではなく、リフレクションを使用するコードが特定の最適化を実行できないことが原因です...

リフレクションが遅い理由は、呼び出し時に非最適化が必要か、または言語の設計が原因である可能性があります。リフレクション API は面倒です。リフレクション呼び出しでは、パラメータのボックス化とアンボックス化、再配置、例外の再スローなどの追加の作業を追加する必要があります。

同じ言語であっても、リフレクションの速度は実装に関係します。たとえば、実行時オブジェクトのメタデータは保持され、オブジェクト構造が基本的に最適化されていない場合、現在のコンパイル時のプログラム分析の改善により、リフレクション コードの一部を最適化することもできます。

「リフレクション」に関しては、C でも実行できます。たとえば、__typeof__ はコンパイル時に変数の型を取得できますが、__typeof__ がないと一部のマクロは記述できません。 .. そして、dlsym は、C の「実行時反映」とみなすことができます。」。C++ では、テンプレートの特殊化を使用して、コンパイル時に型情報を取得することもできます。その用途については、コードを書きすぎると、「Don't」について考えることがよくあります。繰り返します。 初めて .net を学習し始めたときはいつも驚きました。 。 。なぜこれが欲しいのですか?キーブックに記載されている例は、実際にはコードにコメントを追加する属性です。 。 。私は頭がおかしい (あるいは、今までこのレベルを理解していなかったかもしれない)
それから、最近は MVC をいじっています (Web フォームは何年も前から MVC がトレンドになっていると感じており、それに追いつく必要があると感じています) ) 次に、MVCMusicStore をダウンロードして、ここを見てください。ヘッダーのモデル層は、[Required] 属性を属性に直接追加します。 。 。それで思ったのは、くそ、くそ、くそ、労使はまだ ASPX ページにさまざまな検証を書くために頑張っているんだ!
その後、この製品は MVC でのみ使用できることがわかり、不満があったので、コントロールのセットを自分で作成しました フィールドを直接結び付けます (実際には、一般的には asp.net付属のコントロールのセットには BindTo 属性が追加されています) ---なるほど、ここではリフレクションを使用する必要があります---- - ページのすべての CRUD ロジックを記述する必要はありません。BindTo 属性を取得したので、[Required] 機能を直接取得できるので、BindTo 属性を使用して各コントロールを循環します。ページが初期化されるとき次に、必須の機能があるかどうかを確認します -- ここではまだリフレクションであることがわかります -- 次に、辞書をアセンブルして、フロントエンドに Json にシリアル化し、次のように書き込みますフロントエンドが校正するための JS を使用します。これは、JS を dll に埋め込むために使用されます。これで、面倒なバインディング フィールド コードと検証コードに別れを告げることになります。

反映が遅いのは実は間違いです。あなたは彼を誰と比較していますか? 反省なしには特定のことはできないので、何かをしたいときは反省をしなければなりません。もちろん、a=b+c のようなことをすると反映が遅くなります。これはインタプリタと jit の違いと同じです。


そういえば、リフレクションって実は便利なんです。 www.gaclib.net は C++ を使用してリフレクションのセットを作成しました。リフレクションがなければ、多くの宣言型プログラミング メソッドを命令型プログラミング言語で実装することはできません。 DSL が必要です。また、元の言語構造と対話できる DSL も必要です。つまり、言語がある程度動的である必要があり、このときにリフレクションが役立ちます。 ..


C++ に関しては、これは父親の好みの問題です。

初期のコンピューターはネイティブのアセンブリ言語でプログラムされていましたが、これらの元のアーキテクチャは命令をデータとして定義し、自己変更コードを使用することでプログラムできたため、本質的に反射型でした > プログラミングが C などの高レベル言語に移行するにつれて、このリフレクション機能は消滅しました (マルウェア の外) リフレクションが組み込まれたプログラミング言語が登場するまで型システムが登場しました。 プロジェクトを実行するために javac# を個人的に使用したことのある人だけが、リフレクションの利点、特にプロジェクト フレームワークの読み込みについて知ることができます。リフレクションのパフォーマンスは一般化できません。リフレクションは非常に高速である場合もあります。たとえば、フレームワーク モジュールの読み込みは、通常、一度だけ反映されてから実行されます。交換可能なモジュールは動的にロードされます。
リフレクションなどを処理するには、仮想マシンまたは実行プラットフォームが必要です。C++ などのネイティブ バイトの場合、ランタイム型を提供できることはすでに非常に優れています。
また、オブジェクト指向はオブジェクト指向であり、リフレクションはオブジェクト指向を示す厳密な指標ではありません。
最後に、cpp は cpp と同じ方法で記述されているため、反映されたものには近づかないでください。 プログラミング言語におけるリフレクションの意味について、私が理解している範囲でのみ話します。

あなたは仕事中で、小屋から戻ってくると、机の上に「○○リーダーからすぐに探しに行くように言われました!」と書かれたメモが置いてありました。この時点で、あなたは間違いなくリーダーに向けてノンストップで走ります。

わかりました。この場面では、「リーダーの○○さんがすぐに探しに行ってほしいとのこと!」が命令文であり、あなたの「リーダーを探しに走り続ける」という行為がこの命令文の実行となります。

あなたは人間であり、高度な動物であり、内省する能力を持っています。つまり、リーダーを探しに行く途中やその後に、「○○リーダーがすぐに探しに行くように頼んだから行きました!」ということが分かります。これは勤務時間中であることはわかっているので、上司はおそらく仕事などについてあなたに何か聞きたいことがあるでしょう。つまり、: あなたは自分が何をしているのか知っています

問題は、コンピューター プログラムが一連のステートメント命令を実行した後、何を実行しているのかを認識しているかということです。それは何をしているのか知っていますか? リフレクション は、言語レベルでそのような機能を提供する試みです。コードに内省機能を持たせ、コードが何をしているのかを知らせることができます。ただし、現在の実装はまだです。とても初歩的で浅いです。 一部の実装ではリフレクションが使用されず、プログラムの書き方は美しくなく、自動ではありません。
一部の JAVA プロジェクトでは、アクション マッピングの構成が圧倒的であることが分かりました。
また、このように構成する必要のない Struts の最新機能を確認したところ (この例は間違っている可能性があります)、私は長い間 Java に触れていませんでした)、私はただ静かに泣いただけですよね?

多くの場所で、リフレクションは非常にエレガントな実装を実現するために使用されており、必要なコードは数行だけです。

アプリケーション シナリオに関して言えば、権限の割り当てが 1 つあります。モジュール、コントローラー、メソッドに基づいた詳細な権限構成。
どのようなコントローラーやメソッドがあるかを知るには、リフレクションを使用する必要があります。

もちろん、私は PHP について話しています。リフレクションにはいくつかのメリットがあるだけではありません。 たとえば、データベースには複数のフィールドを持つデータ テーブルがあり、コードには複数のメンバーを持つクラスがあります。
コード内のクラスのインスタンスをデータ テーブルに書き込むことが要件の場合、「クラスのどのメンバー値をデータ テーブルのどのフィールドに書き込むか」という要件があります。

この要件はリフレクションを使用しなくても達成できますが、不器用で非効率的で柔軟性に欠けます。言語にリフレクティブ構文がある場合、この要件の実現はシンプルかつ柔軟 (コード作成効率) かつ効率的になります。

リフレクションのパフォーマンスについては…リフレクションのパフォーマンスが良くないと思うなら、リフレクションを使用しないでください。
私の実践では、リフレクションを頻繁に使用するコード ブロックのパフォーマンスを繰り返し測定しましたが、そのコード ブロックはどのように測定しても 0 ~ 1 ミリ秒かかります (測定精度も 1 ミリ秒です)。したがって、少なくとも私のアプリケーション シナリオ (操作への応答には 0.6 ~ 1.2 秒かかります) では、リフレクションによるパフォーマンスの消費は無視できます。

最後に、決まり文句を言わせてください。システム全体を構築する前に推測するパフォーマンスのボトルネックは、実際のシステムのパフォーマンスのボトルネックではないことが多いため、最適化 (およびパフォーマンスの問題) をあまり早く検討しないでください。 データドリブンについて聞いたことがありますか
リフレクションを使用するとさらに楽しいでしょう 言語リフレクションが遅くなるのはなぜですか? リフレクションは追加されたものにすぎませんが、追加すると、追加する前よりも確実に遅くなります (少なくとも、使用しない場合は速くなりません)。

リフレクションはプログラミング手法です。リフレクションを備えた言語にはこの機能のみが組み込まれています。リフレクションを持たない言語は通常、それ自体でリフレクションを実装できます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。