Который более эффективен для компилятора и лучшей практики для проверки, является ли строка пробелом?
Кроме того, ответ зависит от языка?
Да, это зависит от языка, так как строковое устройство хранения данных отличается между языками.
Length = 0
. [0] == 0
. .IsNullOrEmpty
. И т.д.
Снова, не зная язык, невозможно сказать.
Однако я рекомендую выбрать технику, которая имеет большую часть смысла программисту обслуживания, который следует и должен будет поддержать работу.
я рекомендовал бы писать функцию, которая явно делает то, что Вы хотите, такой как
#define IS_EMPTY(s) ((s)[0]==0)
или сопоставимый. Теперь нет сомнения, что в, Вы проверяете.
Для струн до,
if (s[0] == 0)
будет быстрее или, чем
if (strlen(s) == 0)
или, чем
if (strcmp(s, "") == 0)
, потому что Вы избежите издержек вызова функции.
@Nathan
На самом деле, может быть лучше проверить, ли первый символ в строке '\0':
я почти упомянул, что, но закончил тем, что пропустил его, начиная с вызова strcmp()
с пустой строкой и непосредственно проверкой, что первый символ в строке оба O (1). Вы в основном просто платите за дополнительный вызов функции, который является довольно дешевым. Если Вам действительно нужна абсолютная лучшая скорость, тем не менее, определенно идут с прямым first-char-to-0 сравнением.
Честно, я всегда использую strlen() == 0
, потому что я имею никогда записанный программа, где это было на самом деле измеримой проблемой производительности, и я думаю, что это - самый читаемый способ выразить проверку.
В этом случае, непосредственно проверяя длину быстрее, потому что она избегает издержек построения новой пустой строки.
@DerekPark: это не всегда верно. "" строковый литерал так, в Java, он будет почти наверняка уже интернирован.
На самом деле IMO лучший способ определить является IsNullOrEmpty () метод строкового класса.
http://msdn.microsoft.com/en-us/library/system.string.isnullorempty.
Обновление: Я принял .NET на других языках, это могло бы отличаться.
На языках, которые используют C-стиль (завершенные пустым указателем) строки, по сравнению с "" будут быстрее
На самом деле, может быть лучше проверить, ли первый символ в строке '\0':
char *mystring;
/* do something with the string */
if ((mystring != NULL) && (mystring[0] == '\0')) {
/* the string is empty */
}
В Perl существует третья опция, что строка не определена. Это несколько отличается от Нулевого указателя в C, если только потому, что Вы не получаете отказ сегментации для доступа к неопределенной строке.
В Java 1.6 Строковый класс имеет новый метод isEmpty
, Там также Джакартская библиотека свободного городского населения, которая имеет метод isBlank . Пробел определяется как строка, которая содержит только пробел.
В .NET:
string.IsNullOrEmpty( nystr );
строки могут быть пустыми, таким образом.Length иногда бросает NullReferenceException
На языках, которые используют C-стиль (завершенные пустым указателем) строки, по сравнению с ""
будут быстрее. Это - O (1) операция, в то время как взятие длины строки C-стиля является O (n).
На языках, которые хранят длину как часть строкового объекта (C#, Java...) проверка длины также O (1). В этом случае непосредственно проверка длины быстрее, потому что она избегает издержек построения новой пустой строки.
String.IsNullOrEmpty()
только работы над .net 2.0 и выше, для .net 1/1.1, я склонен использовать:
if (inputString == null || inputString == String.Empty)
{
// String is null or empty, do something clever here. Or just expload.
}
я использую Строку. Пустой в противоположность, "" потому что "" создаст объект, тогда как Строка. Пустая привычка - я знаю что-то маленькое и тривиальное, но идентификатор все еще скорее не создает объекты, когда мне не нужны они! ( Источник )
Предполагая, что ваш вопрос относится к .NET:
Если вы хотите проверить вашу строку на нулевость, используйте IsNullOrEmpty, если вы уже знаете, что ваша строка не является нулевой, например, при проверке TextBox.Text и т.д., не используйте IsNullOrEmpty, и тогда приходит ваш вопрос.
Так что, на мой взгляд, String.Length менее производителен, чем сравнение строк.
Я протестировал это (я также тестировал на C#, тот же результат):
Module Module1
Sub Main()
Dim myString = ""
Dim a, b, c, d As Long
Console.WriteLine("Way 1...")
a = Now.Ticks
For index = 0 To 10000000
Dim isEmpty = myString = ""
Next
b = Now.Ticks
Console.WriteLine("Way 2...")
c = Now.Ticks
For index = 0 To 10000000
Dim isEmpty = myString.Length = 0
Next
d = Now.Ticks
Dim way1 = b - a, way2 = d - c
Console.WriteLine("way 1 took {0} ticks", way1)
Console.WriteLine("way 2 took {0} ticks", way2)
Console.WriteLine("way 1 took {0} ticks more than way 2", way1 - way2)
Console.Read()
End Sub
End Module
Результат:
Way 1...
Way 2...
way 1 took 624001 ticks
way 2 took 468001 ticks
way 1 took 156000 ticks more than way 2
Что означает, что сравнение занимает намного больше времени, чем проверка длины строки.