VB.NET - производительность при тестировании пустой строки - PullRequest
2 голосов
/ 06 января 2009

В VB6 мне сказали, что при тестировании на пустую строку будет гораздо быстрее проверить это, проверив длину строки с помощью:

If Len("ABC") = 0 then 'fast

или

If LenB("ABC") = 0 then 'even faster

вместо:

If "ABC" = "" then 'slower

Знаете ли вы случайно, верно ли это и в VB.NET? Спасибо.

Ответы [ 4 ]

9 голосов
/ 06 января 2009

Я не совсем синтаксис для VB, но в C # вы можете использовать статический метод String IsNullOrEmpty:

String.IsNullOrEmpty("ABC")

Когда вы отлаживаете этот метод, он будет проверять длину параметра. Проверка длины всегда быстрее, потому что при сравнении строк компилятор должен создать новый объект для сравнения (в данном случае это строка "ABC").

6 голосов
/ 06 января 2009

Нет необходимости нет, я имею в виду, ты издеваешься надо мной? Сколько людей пишут программы, в которых сравнение строки с целью определения ее нулевой длины никак не влияет на производительность. Даже если строки не сохраняют счетчик длины и VB каждый раз выполняет сравнение строк strcmp () в стиле c, функция сравнения строк не занимает много времени, чтобы определить, что одна из строк имеет нулевую длину, не так ли? Но строки .NET включают в себя поле длины, и поэтому, когда вы проводите сравнение строк, первое, что он собирается проверить, это то, отличаются ли длины, то есть прямое сравнение int. Все, что вы сохраняете, делая это самостоятельно, если вызов функции, и только тогда, когда JIT вставляет Len ().

Кстати, в VB.NET вам не нужно вызывать String.IsNullOrEmpty (), потому что сравнения между строками преобразуются в вызов String.strcmp (), который преобразует нули (Nothing в VB) в ссылки на String. .Пустой строки. Затем он продолжает вызывать встроенную функцию, которую Reflector не может исследовать, но я был бы совершенно уверен, что первое, что он делает, это проверяет, отличаются ли длины строк.

1 голос
/ 06 января 2009

Вы должны использовать:

If ("Value").Length > 0 Then

End If
0 голосов
/ 05 августа 2009

Я думаю, что лучшим решением для VB6, эквивалентным IsNullOrEmpty, является

Public Function IsNullOrEmpty(ByRef s As Variant) As Boolean

  If IsNull(s) Then ' IsNull returns true if s is a Variant that is Null
    IsNullOrEmpty = True ' IsNull returns false if s is a Variant and s = vbEmpty
    Exit Function
  End If

  If LenB(s) = 0 Then ' never compare a string to "" - it's slow
    IsNullOrEmpty = True
    Exit Function
  End If

  If LenB(Trim(s)) = 0 Then
    IsNullOrEmpty = True
    Exit Function
  End If

  IsNullOrEmpty = False

End Function

По иронии судьбы, если у вас есть строки или варианты, которые установлены в vbEmpty, то эта функция вернет false, потому что vbEmpty в качестве строки равен "0". Поэтому, если вы не будете осторожны с этой версией, вы можете получить странные ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...