VB.NET - Производительность при тестировании пустой строки

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

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

или же

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

вместо:

If "ABC" = "" then 'slower

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
5 370
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вам следует использовать:

If ("Value").Length > 0 Then

End If
Ответ принят как подходящий

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

String.IsNullOrEmpty("ABC")

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

Вы хотите сказать, что IsNullOrEmpty быстрее, чем .length?

Tom Anderson 06.01.2009 16:23

Нет. Если вы отлаживаете эту функцию, вы увидите, что .NET Framework использует .length вместо сравнения с пустой строкой.

robertpnl 06.01.2009 16:46

На самом деле не имеет значения, использует ли он длину: MS может изменить эту реализацию в будущем патче. Что еще более важно, это метод верный для проведения теста. Время от времени это может быть немного медленнее, но я серьезно сомневаюсь, что проверка пустых строк является узким местом в вашем приложении.

Joel Coehoorn 06.01.2009 17:08

скажем, строка нулевая - будет ли проверка только длины вызывать исключение? Если да, то, наверное, безопаснее использовать String.IsNullOrEmpty.

moster67 06.01.2009 17:29

Выполнение str.Length, когда str равно Nothing, вызовет ошибку. Функция IsNullOrEmpty - правильный способ сделать это.

Bryan Anderson 06.01.2009 17:43

Проблема скорости значительно перевешивается удобочитаемостью. Подобные виды оптимизации - редкие исключения - пустая трата времени. Даже если один из способов окажется немного быстрее, это может измениться в будущих версиях компилятора. Это не является частью контракта между компилятором и разработчиком.

JohnFx 15.01.2009 23:05

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

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

Я с вами. Подобные преждевременные оптимизации глупы. Я бы даже не подумал о том, чтобы сделать что-то подобное, если бы вы не были в чрезвычайно критичном ко времени приложении, которое миллионы раз выполняет проверку пустой строки. Даже тогда это под вопросом.

JohnFx 07.01.2009 00:02

Я думаю, что лучшим решением для 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 as string имеет значение «0». Поэтому, если вы не будете осторожны при использовании этой версии, вы можете получить некоторые странные ошибки.

Другие вопросы по теме