1

実際の問題だと思ったものについて、別の質問をしました(現在は削除されています)。

.NET Jitter が実際にこのループを実行しない可能性があります:

Private Shared Sub CheckXmlValidity(ByVal textReader As System.IO.StreamReader)
  Try
    ' Check for "interesting" xml documents.
    Dim settings = New System.Xml.XmlReaderSettings()
    settings.XmlResolver = Nothing
    settings.MaxCharactersInDocument = 655360
    ' Successfully parse the file, otherwise an XmlException is to be thrown.
    Dim reader = System.Xml.XmlReader.Create(textReader, settings)
    Try
      While reader.Read()
        'Just checking.
      End While
    Finally
      reader.Close()
    End Try
  Catch ex As Exception
    Throw New HttpException(500, "Invalid Xml data", ex)
  End Try
End Sub

スローされる可能性のある例外の副作用が原因ではないことを願っていますが、チェックしているだけです...

4

1 に答える 1

3

JITer、そして実際にはすべてのオプティマイザーは、問題の実行に影響を与えないアイテムのみを削除できます。メソッドが効果がないことを証明することは、.Net では非常に困難です。特に、ソースオブジェクトがそうである場合、すべてのメソッド呼び出しが影響を与える可能性があるためですnull(例外がスローされます)。nullしたがって、ノーオペレーションであることが知られているメソッドでさえ、ある種のチェックを挿入せずに完全に削除することはできません(1)

この場合XmlReader.Readabstract、封印されていない型のメソッドであり、さらに困難です。JITer がこの呼び出しを削除できるのは、 のすべての実装が XmlReader.Readノーオペレーションであり、効果がないことがわかっている場合のみでした。XmlReaderただし、 の派生の数は固定集合ではないため、これを知ることはできません。新しい DLL は、意味のある定義を持つ新しい派生物と共にいつでもロードされる可能性がXmlReaderあり、したがって最適化して取り除くことはできませんでした。

(1) 注: JITer がこれを行うと言っているわけではありません。ただ、JITer がメソッドを削除した場合、何らかの形式のnullチェックを行う必要があるというだけです。

于 2012-06-08T05:15:40.410 に答える