我有一个项目,我想已经检查默认运算,除了一个性能敏感点。不幸的是,VB.Net不具有未选中块。

在理想情况下该框架将有某种整数类型有明确未经检查的算术,但我没有发现这样的事情。我确实发现表达式树有未经检查的操作二元表达式,但代表的开销抵消了选中的优势(然后一些)。

目前我将输入转换为UINT64 / Int64的执行算术运算之前,然后转换回(具有按位并保证在范围内)。它比未经检查的算术慢约50%(根据分析)。

移动运算敏感的部分与未检查的算术可能工作的一个项目,但似乎矫枉过正,给它一个集中的所有给自己。

有帮助吗?

解决方案

我个人认为,离开这个在自己的装配,特别是因为它会是这样一个小总成,是一个不错的选择。这使得维护更加容易,因为它很容易在任何时候重新生成该组件。只是做一个单独的装配标记选中,并把你的性能敏感的代码存在。

其他提示

我知道这是老了,但我最近需要转换所用选中一些C#代码,我想我会分享我是如何做的。这是纯VB代码然而,可以作用域,你需要(而不是一个项目范围选项)。

诀窍是创建包含长字段和两个整数字段的结构。然后使用StructLayout和FieldOffset属性来建立长和两个整数的联合。该字段可以(应该)是私有的。使用扩大CTYPE运营商从长转换的结构和从结构到一个整数(使用低整数值)。添加运算符重载的+, - ,*,等...和急!未检查的算术在VB!

排序... ...它还是会溢出,因为Strilanc指出,如果长期价值无二多头的范围之外。但它工作得很好了很多的情况下未选中时使用。

下面是一个例子:

<StructLayout(LayoutKind.Explicit)>
Public Structure UncheckedInteger

    <FieldOffset(0)>
    Private longValue As Long
    <FieldOffset(0)>
    Private intValueLo As Integer
    <FieldOffset(4)>
    Private intValueHi As Integer

    Private Sub New(newLongValue As Long)
        longValue = newLongValue
    End Sub

    Public Overloads Shared Widening Operator CType(value As Long) As UncheckedInteger
        Return New UncheckedInteger(value)
    End Operator

    Public Overloads Shared Widening Operator CType(value As UncheckedInteger) As Long
        Return value.longValue
    End Operator

    Public Overloads Shared Widening Operator CType(value As UncheckedInteger) As Integer
        Return value.intValueLo
    End Operator

    Public Overloads Shared Operator *(x As UncheckedInteger, y As Integer) As UncheckedInteger
        Return New UncheckedInteger(x.longValue * y)
    End Operator

    Public Overloads Shared Operator Xor(x As UncheckedInteger, y As Integer) As UncheckedInteger
        Return New UncheckedInteger(x.longValue Xor y)
    End Operator

    ' Any other operator overload you need...
End Structure

使用结构中这样的代码:

Dim x As UncheckedInteger = 2147483647
Dim result As Integer = x * 2  ' This would throw OverflowException using just Integers

Console.WriteLine(result.ToString())  ' -2

注意你的计算结果赋给一个UncheckedInteger之前不会溢出。你可以使用相同的技术创建UncheckedShort和UncheckedByte结构。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top