-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

上記の @Tim Schmelter のコメントに加えて、3 番目の条件文がまだ potherrule2 を見ていることに気付きましたか? このため、potherrule3 が <> "x" であり、評価したい場合、コードは MinimumPriceWhenPother4IsDBnull 関数にデフォルト設定されていると思います。その機能が何をするのかはわかりませんが、頻繁に実行されている場合は、速度の問題の原因となる可能性があります.

于 2012-08-24T12:14:07.490 に答える
0

@APrough に同意します。この問題は、3 番目の ElseIf が間違った比較を行い、メソッドがMinimumPriceWhenPother4IsDBnull(SupplierMargin, oprice)予期せずにドロップしたことが原因である可能性があります。その方法で何をしていますか?その時点でデータベースから読み取っている可能性はありますか?

最初の 3 つの If ハンドラーをそれぞれ別のメソッドに分解して、コードの再利用を増やすことができます。ただし、パフォーマンスは向上しません。

警告の別のポイント。Math.Round に注意してください。デフォルトでは、学校で学んだ丸めではなく、最も近い偶数への ANSI 標準の丸めを使用します。http://www.thinqlinq.com/Post.aspx/Title/Rounding-in-.Netを参照してください。ただし、これはパフォーマンスが 10 倍低下する原因にはなりません。

さらに、VS Ultimate でパフォーマンス分析を実行するか、Ants プロファイラーの評価を取得して、実際のボトルネックがコードのどこにあるかを確認することもできます。多くの場合、イベント ハンドラー、メソッド呼び出しの背後、またはその他の予期しない場所によって隠されている可能性があります。

于 2012-08-24T13:26:36.690 に答える