【问题标题】:Could the .NET Jitter optimise away a While XmlReader.Read loop?.NET Jitter 能否优化 While XmlReader.Read 循环?
【发布时间】:2012-06-12 04:33:15
【问题描述】:

我问了一个单独的问题(现已删除)我认为实际问题是什么。

.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

我不希望完全是因为可能引发的异常的副作用,但我只是在检查...

【问题讨论】:

    标签: asp.net .net jit xmlreader


    【解决方案1】:

    JITer,实际上是任何优化器,只能删除对问题执行没有影响的项目。在 .Net 中很难证明一种方法没有效果。特别是因为如果源对象是null,每个方法调用都会产生影响(它会抛出异常)。因此,即使是已知为无操作的方法也无法在不插入null 各种检查的情况下完全删除 (1)

    在这种情况下,XmlReader.Read 是一个针对未密封类型的 abstract 方法,这更加困难。只有当 JITer 知道 XmlReader.Read 的每个实现都是无操作并因此无效时,它才能删除此调用。但它永远无法知道这一点,因为XmlReader 的派生数不是一个固定的集合。一个新的 DLL 可以在任何时候加载一个新的派生 XmlReader,它有一个有意义的定义,因此不能被优化掉。

    (1) 注意:我并不是说 JITer 会这样做,只是如果它删除了该方法,则需要进行某种形式的 null 检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-18
      • 2023-03-18
      • 2011-05-14
      • 2020-06-24
      • 2018-03-01
      • 2019-02-19
      • 2012-07-13
      • 2018-11-24
      相关资源
      最近更新 更多