Попробуйте ... Поймать: Производительность - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть образец кода для преобразования чисел в N-базовые числа.
У меня может быть 2, 3 или 4-значное число.

Моя функция работает и выглядит следующим образом:

Private Function BaseN(s As String)
    Dim d = Val(s(s.Length - 1))
    Dim c = Val(s(s.Length - 2))
    Dim a, b As Integer
    Try
        b = Val(s(s.Length - 3))
    Catch
        b = 0
    End Try
    Try
        a = Val(s(s.Length - 4))
    Catch
        a = 0
    End Try

    Return (a * (n * n * n) + b * (n * n) + c * n + d + 1).ToString
End Function

Но по какой-то причине, например, это занимает около 10 секунд, чтобы преобразовать мой текст.

Я пробовал так:

Private Function BaseN(s As String)
    Dim d = Val(s(s.Length - 1))
    Dim c = Val(s(s.Length - 2))
    Dim a, b As Integer
        b = 0
        a = 0

    Return (a * (n * n * n) + b * (n * n) + c * n + d + 1).ToString
End Function

И здесь преобразование происходит примерно мгновенно.

Так что мне было интересно, почему try catch так долго бегал или я их неправильно использовал.

1 Ответ

0 голосов
/ 24 февраля 2019

То, что вы не перехватываете ошибки с помощью Try ... Catch, не означает, что вам не нужно учитывать ложные данные пользователя.Следующий код должен избегать сбоев, проверяя входные данные на целые числа и длину строки.

Integer.TryParse (string, integerVariable) проверит строку, чтобы увидеть, может ли она быть преобразована в целое число.Он заполняет целочисленную переменную целочисленным представлением строки.Переменная integerVariable будет равна нулю, даже если она потерпит неудачу, что делает ваше окончательное уравнение действительным.

Я не проверял действительность самой функции.

Private Function BaseN(s As String, n As Integer) As String
    Dim StringLength As Integer = s.Length
    Dim a, b, c, d As Integer
    Select Case StringLength
        Case 2
            Integer.TryParse(s(StringLength - 1), d)
            Integer.TryParse(s(StringLength - 2), c)
        Case 3
            Integer.TryParse(s(StringLength - 3), b)
            Integer.TryParse(s(StringLength - 1), d)
            Integer.TryParse(s(StringLength - 2), c)
        Case 4
            Integer.TryParse(s(StringLength - 4), a)
            Integer.TryParse(s(StringLength - 3), b)
            Integer.TryParse(s(StringLength - 1), d)
            Integer.TryParse(s(StringLength - 2), c)
        Case Else
            Return ""
    End Select
    Return (a * (n * n * n) + b * (n * n) + c * n + d + 1).ToString
End Function
...