-1

我有这个函数,它根据可用库存计算某些产品的建议价格,现在它的作用并不重要,但它以某种方式运行,我的程序在没有它的情况下运行得像 x10 更快,我真的很困惑,我不确定为什么它很慢

 Dim MinPrice As Double
    Dim VAT = 1.1899999999999999
    Dim margin1
    Dim potherrule1 As String
    Dim margin2
    Dim potherrule2 As String
    Dim margin3
    Dim potherrule3 As String
    Dim defaultmargin

    If SupplierMargin IsNot Nothing Then
        margin1 = SupplierMargin(0)
        potherrule1 = SupplierPother(0)
        margin2 = SupplierMargin(1)
        potherrule2 = SupplierPother(1)
        margin3 = SupplierMargin(2)
        potherrule3 = SupplierPother(2)
        defaultmargin = SupplierMargin(3)
    End If


    If IsDBNull(CurrentPother) Or (potherrule1 = "x" And potherrule2 = "x" And potherrule3 = "x") Then
        MinPrice = Math.Round((oprice / (1 - defaultmargin)) * VAT, 2)
        Return MinPrice
    End If

    If Not IsDBNull(CurrentPother) Then
        If potherrule1 <> "x" Then
            Dim v1 As Integer
            Dim v2 As Integer
            Dim rule As String = potherrule1
            Dim parts() As String = rule.Split(New String() {" bis "}, StringSplitOptions.None)
            v1 = Integer.Parse(parts(0))
            v2 = Integer.Parse(parts(1))
            If CurrentPother >= v1 And CurrentPother <= v2 Then
                MinPrice = Math.Round((oprice / (1 - margin1)) * VAT, 2)
            End If
            Return MinPrice

        ElseIf potherrule2 <> "x" Then
            Dim v1 As Integer
            Dim v2 As Integer
            Dim rule As String = potherrule2
            Dim parts() As String = rule.Split(New String() {" bis "}, StringSplitOptions.None)
            v1 = Integer.Parse(parts(0))
            v2 = Integer.Parse(parts(1))
            If CurrentPother >= v1 And CurrentPother <= v2 Then
                MinPrice = Math.Round((oprice / (1 - margin2)) * VAT, 2)
                Return MinPrice
            End If

        ElseIf potherrule2 <> "x" Then
            Dim v1 As Integer
            Dim v2 As Integer
            Dim rule As String = potherrule3
            Dim parts() As String = rule.Split(New String() {" bis "}, StringSplitOptions.None)
            v1 = Integer.Parse(parts(0))
            v2 = Integer.Parse(parts(1))
            If CurrentPother >= v1 And CurrentPother <= v2 Then
                MinPrice = Math.Round((oprice / (1 - margin3)) * VAT, 2)
                Return MinPrice
            End If
        Else
            MinimumPriceWhenPother4IsDBnull(SupplierMargin, oprice)
        End If
    End If

您能否建议一些可以使此功能更快的改进?

4

2 回答 2

0

MinimumPriceWhenPother4IsDBnull(SupplierMargin, oprice)我同意@APrough 的观点,该问题可能是由于您的第三个 ElseIf 进行了错误的比较,然后该方法意外下降。你用那个方法做什么?那时你有可能从数据库中读取吗?

您的前三个 If 处理程序中的每一个都可以分解为另一种方法以增加代码重用。虽然它不会增加性能。

另一个警告点。注意 Math.Round。默认情况下,它使用 ANSI 标准四舍五入到最接近的偶数,而不是您在学校学到的四舍五入。请参阅http://www.thinqlinq.com/Post.aspx/Title/Rounding-in-.Net。不过,这不会导致性能下降 10 倍。

此外,您可能希望在 VS Ultimate 中运行性能分析,或获取 Ants 分析器的 eval 以查看代码中真正的瓶颈在哪里。它通常会被事件处理程序、方法调用或其他意想不到的地方隐藏起来。

于 2012-08-24T13:26:36.690 回答
0

除了上面@Tim Schmelter 的评论,您确实意识到您的第三个条件仍在查看 potherrule2?因此,我的猜测是,当 potherrule3 为 <> "x" 并且您希望它进行评估时,您的代码默认为您的 MinimumPriceWhenPother4IsDBnull 函数。不确定该功能的作用,但如果它运行很多,那可能会导致您的速度问题。

于 2012-08-24T12:14:07.490 回答