[解決済み] .Net 4.0の新しいTuple型は、なぜ参照型(クラス)であり、値型(構造体)ではないのでしょうか?
疑問点
どなたか、この件に関する答えや意見をお持ちの方はいらっしゃいませんか?
タプルは通常あまり大きくないので、私はこれらのためにクラスよりも構造体を使用する方がより理にかなっていると仮定します。あなたはどう思いますか?
どのように解決するのですか?
Microsoft は、単純化のためにすべてのタプル型を参照型にしました。
私は個人的にこれは間違いであったと思います。4 つ以上のフィールドを持つタプルは非常に珍しく、いずれにせよより型付きな代替品 (F# のレコード型など) に置き換えられるべきで、小さなタプルのみが実用的な関心事となります。私自身のベンチマークでは、512バイトまでの非ボックス化タプルは、ボックス化タプルよりも高速であることが示されました。
メモリ効率は 1 つの懸念事項ですが、私は支配的な問題は .NET ガーベッジコレクターのオーバーヘッドであると信じています。アロケーションとコレクションは 非常に高価 そのガベージコレクターは (たとえば JVM と比較して) あまり大きく最適化されていないため、.NET 上での割り当てと収集は非常に高価です。さらに、デフォルトの .NET GC (ワークステーション) は、まだ並列化されていません。その結果、タプルを使用する並列プログラムは、すべてのコアが共有ガベージコレクタのために競合するため、スケーラビリティを破壊して停止します。これは支配的な懸念であるだけでなく、AFAIK では、Microsoft がこの問題を検討したときに完全に無視されました。
もうひとつの懸念は、仮想ディスパッチです。参照型はサブタイプをサポートし、したがって、そのメンバーは通常、仮想ディスパッチによって呼び出されます。対照的に、値型はサブタイプをサポートしないので、メンバーの呼び出しは完全に曖昧でなく、常に直接の関数呼び出しとして実行されることができます。仮想ディスパッチは、CPUがプログラム・カウンターの行き先を予測できないため、最近のハードウェアでは非常に高価です。JVMは仮想ディスパッチを最適化するために多大な努力を払いますが、.NETはそうではありません。しかし、.NETは、値型という形で仮想ディスパッチからの脱出を提供しています。したがって、タプルを値型として表現することで、ここでも劇的に性能を向上させることができたのです。例えば
GetHashCode
を100万回呼び出すと0.17秒かかりますが、同等の構造体で呼び出すとわずか0.008秒しかかかりません。
タプルのこれらのパフォーマンスの問題が一般的に発生する実際の状況は、辞書のキーとしてタプルを使用することです。私は実際に Stack Overflow の質問からのリンクをたどって、このスレッドに行き当たりました。
F#は私のアルゴリズムをPythonより遅く実行します!
ここで、著者のF#プログラムは、まさにボックス化されたタプルを使用していたため、Pythonよりも遅いことが判明しました。手動でボックス化を解除するには、手書きの
struct
型を使って手動でアンボックスすることで、彼のF#プログラムは数倍速くなり、Pythonよりも速くなりました。もしタプルが参照型ではなく値型によって表現されていれば、これらの問題は発生しなかったでしょう...。
関連
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] \0-9]よりも効率が悪い
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] JavaScriptでクラスを定義するために使用できるテクニックと、そのトレードオフとは?
-
[解決済み] Pythonにはクラス内に「プライベート」変数がある?
-
[解決済み] なぜクラスではなくストラクチャーを選ぶのか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み] Laravelは本当にこんなに遅いのか?
-
[解決済み] git ステータスのパフォーマンスを向上させる方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] CUDAカーネルのグリッドとブロックの寸法はどのように選択するのですか?
-
[解決済み] Scalaのパターンマッチはバイトコードレベルでどのように実装されているのですか?
-
[解決済み] ファイルキャッシュをクリアしてパフォーマンステストを繰り返す
-
[解決済み] Entity Frameworkのクエリは遅いが、SqlQueryの同じSQLは速い。
-
[解決済み] ループのアンロールが役に立つとしたら、どんなときか?
-
[解決済み] EBPフレームポインタレジスタの目的は何ですか?
-
[解決済み] 開発者は読みやすさとパフォーマンスのどちらを優先させるべきか?[クローズド]
-
[解決済み] Jaro-Winkler距離とLevenshtein距離の違い?[クローズド]
-
[解決済み] レジスターが猛烈に速いなら、なぜもっとたくさんないのか?
-
[解決済み] PostgreSQL: pg_dump, pg_restore の性能改善