タグ付けされた質問 「unboxing」

10
「as」およびnull許容型によるパフォーマンスの驚き
null許容型を扱うC#in Depthの第4章を改訂し、 "as"演算子の使用に関するセクションを追加して、次のように記述できるようにします。 object o = ...; int? x = o as int?; if (x.HasValue) { ... // Use x.Value in here } 私はこれが本当に素晴らしいと思い、 "is"に続けてキャストを使用することで、C#1と同等のパフォーマンスを向上させることができると思いました。 。 ただし、そうではないようです。以下にサンプルテストアプリを含めました。これは基本的にオブジェクト配列内のすべての整数を合計しますが、配列には多くのnull参照と文字列参照、およびボックス化された整数が含まれています。ベンチマークは、C#1で使用する必要があるコード、「as」演算子を使用するコード、およびLINQソリューションのキックを測定します。驚いたことに、この場合、C#1コードは20倍高速です。また、LINQコード(イテレータが関与していることを考えると、遅くなることが予想されていました)でも「as」コードよりも優れています。 isinstnull許容型の.NET実装は本当に遅いのですか?unbox.any問題の原因は追加ですか?これには別の説明がありますか?現時点では、パフォーマンスに敏感な状況でこれを使用することに対する警告を含める必要があるように思われます... 結果: キャスト:10000000:121 As:10000000:2211 LINQ:10000000:2143 コード: using System; using System.Diagnostics; using System.Linq; class Test { const int Size = 30000000; static void Main() …


2
Java 6とJava 7の自動ボックス化解除の違い
Java SE 6とJava SE 7の自動ボックス化解除動作の違いに気付きました。なぜかと思います。これら2つのバージョン間でのこの動作の変更に関するドキュメントが見つからないためです。 以下に簡単な例を示します。 Object[] objs = new Object[2]; objs[0] = new Integer(5); int myInt = (int)objs[0]; これは、Java SE 7のjavacで正常にコンパイルされます。ただし、コンパイラに「-source 1.6」引数を指定すると、最後の行でエラーが発生します。 inconvertible types found : java.lang.Object required: int Java SE 6をダウンロードして、ネイティブバージョン6コンパイラー(-sourceオプションなし)でコンパイルしてみました。それは同意し、上記と同じエラーを出します。 だから何を与えるのですか?いくつかの実験から、Java 6のボックス化解除では、(コンパイル時に)ボックス化されたタイプの値のみをボックス化解除できるように思われます。たとえば、これは両方のバージョンで機能します。 Integer[] objs = new Integer[2]; objs[0] = new Integer(5); int myInt = (int)objs[0]; したがって、Java 6と7の間でボックス化解除機能が強化され、値が適切なボックス化されたタイプであることを(コンパイル時に)認識せずに、1度にオブジェクトタイプをキャストおよびボックス化解除できるようになりました。ただし、Java …
107 java  casting  java-7  unboxing 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.