2

最近、フレームワークの v2.0 でジェネリックが導入される前に書かれたと思われる「レガシー」コードをまだ使用している部分が BCL にあることに気付きました。どうやら、その「レガシー」コードの一部により、CLR が多数のボックス化/ボックス化解除操作を実行する可能性があります。

ボクシングの過度の使用は決して良いことではないので、ボクシングが発生していることに気付いた BCL の他の重要な場所があるかどうかを知りたいと思いましたか? ありがとう

4

3 に答える 3

3

言及された特定の例については、次のことに注意してください。

  • DateTime.Now は、int のボックス化よりもかなり高いコストでシステム関数を呼び出します (それに関連する gen0 コレクション頻度の増加を考慮しても)。
  • Dateime.Now の精度は、Windows プラットフォームでは非常に低くなります (ほとんどの場合 10 ~15 ミリ秒)。
    • したがって、この関数を何度も呼び出すことは、とにかくあまり役​​に立ちません。それを行っている場合は、何か他の間違ったことをしている可能性があります...

そのため、プロファイリングで問題があることが示されている場合にのみ、これの内部について心配する必要があります。
MS はこれを修正しようとはしなかったので、これが顧客にとって問題になったことはないと思われます。

隠された割り当ての静脈であなたがより懸念しているのは、次の可能性が高いです。

しかし、繰り返しになりますが、これらすべて (回避するのにかなりの労力を必要とする辞書のキーとしての列挙は別として) は、必要な場合にのみ処理する必要があります。

于 2009-09-05T00:12:11.797 に答える
2

一つには、あなたは正しいです-それは良くありません。ただし、ドットネットフレームワークを埋め込んでも効果はありません。フレームワークの内部をそのまま受け入れ、将来の最適化(たとえば、TransactionScope2.0から3.5 SP1に最適化されている)を期待する必要があります。

それがそれをクリアしたことを願っています。

于 2009-09-04T20:39:55.217 に答える
0

知識はあなたに力を与えます。

最近、 "path" +'\'+"fileName"がどのように実装されているかを知りました。

真ん中の文字'\'は最初にオブジェクトにボックス化され、次にConcat(object、object、object)が呼び出され、次にToStringが3回呼び出され、最後にConcat(string、string、string)が呼び出されます。

プログラマーがそれを知っていたら、彼/彼女は次のように書くことができたでしょう: "path" + "\" + "filename"

于 2012-07-17T04:23:44.917 に答える