目次
返信内容:
ホームページ バックエンド開発 PHPチュートリアル 言語の反映が遅いのはなぜですか? 反映の重要性は何ですか?なぜ C++ にはリフレクションがないのでしょうか?

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

Jun 17, 2016 am 08:31 AM
java php

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

クロスサイトリクエストフォーファリー(CSRF)とは何ですか?また、PHPにCSRF保護をどのように実装しますか? クロスサイトリクエストフォーファリー(CSRF)とは何ですか?また、PHPにCSRF保護をどのように実装しますか? Apr 07, 2025 am 12:02 AM

PHPでは、予測不可能なトークンを使用して、CSRF攻撃を効果的に防ぐことができます。特定の方法には次のものが含まれます。1。フォームのCSRFトークンを生成および埋め込みます。 2.リクエストを処理するときにトークンの有効性を確認します。

一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 Apr 06, 2025 am 12:03 AM

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

See all articles