Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2014, 14:11   #1
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию Проверить, что строка не пустая - как быстрее

1. if S <> '' then
2. if Length(S) > 0 then

Как будет быстрее в принципе? Или может можно ещё быстрее проверить неким ассемблером?
xexxex вне форума Ответить с цитированием
Старый 23.10.2014, 14:16   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Шо то шо то должно сводиться к одному - сравнивание первого байта (слова, дв.слова) где хранится длина строки.
Забацай оба в одну прогу и посмотри как ассемблер отладчика покажет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2014, 14:19   #3
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Там всегда идет test регистров сначала, проверка переменной на nil. Ведь в случае строки длиной 0 и смысла нет держать такую строку, уничтожается и обнуляется.

Хотя вот с WideString он идет сравнивать...(в случае S<>''')

Последний раз редактировалось WhiskasTM; 23.10.2014 в 14:23.
WhiskasTM вне форума Ответить с цитированием
Старый 23.10.2014, 15:23   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не имеет значения... Всегда сравниваю с EmptyStr.
По факту строку триммировать надо перед сравнением.
в древних IDE:
Код:
If (Trim(Str) <> EmptyStr) then
...
else
raise Exception.Create('str is empty.');
в новых IDE так:
Код:
 if Str.Trim.IsEmpty then
 ...
 else
 raise Exception.Create('str is empty.');

P.S.
А в лазаре есть поддержка class-helper'ов?


Цитата:
Шо то шо то должно сводиться к одному - сравнивание первого байта (слова, дв.слова) где хранится длина строки.
Может нулевого?
Думается это справедливо только для Ansi-строк. Unicode и Wide по другому хранятся, там символ уже 2 байта занимает.
Мб чего-то напутал...

Последний раз редактировалось Человек_Борща; 23.10.2014 в 15:26.
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2014, 15:25   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,778
По умолчанию

Цитата:
Сообщение от xexxex Посмотреть сообщение
1. if S <> '' then
Только так, ибо это одна ассемблерная инструкция. Можно посмотреть в подстрочнике.
Vapaamies вне форума Ответить с цитированием
Старый 23.10.2014, 15:41   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Trim(Str) <> EmptyStr
Trim зачем? Строка с пробелом далеко не пустая строка. Иногда (а кому и часто) это важно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.10.2014, 16:06   #7
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Научитесь вы уже раз и навсегда проверять, как быстрее. Загоняете в цикл то и другое и сравниваете дельту времени. Телодвижений меньше, чем на форум сообщение писать.
Цитата:
Сказано ведь: ассемблерный подстрочник смотреть! Если операция сравнения транслируется в одну ассемблерную инструкцию, сравнивать ее с вызовом процедуры бессмысленно.
Это было без привязки к конкретному языку и среде. Просто задолбюали подобными вопросами. Что же касается дизассемблера - так вы сами знаете, сколько зародышей программистов даже не в курсе, где у них дебаггер находится и зачем он нужен.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!

Последний раз редактировалось crazy horse; 23.10.2014 в 17:01.
crazy horse вне форума Ответить с цитированием
Старый 23.10.2014, 16:54   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,778
По умолчанию

Цитата:
Сообщение от crazy horse Посмотреть сообщение
Загоняете в цикл то и другое и сравниваете дельту времени.
Сказано ведь: ассемблерный подстрочник смотреть! Если операция сравнения транслируется в одну ассемблерную инструкцию, сравнивать ее с вызовом процедуры бессмысленно.
Vapaamies вне форума Ответить с цитированием
Старый 23.10.2014, 18:59   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Trim зачем? Строка с пробелом далеко не пустая строка. Иногда (а кому и часто) это важно
Пустая строка подразумевает именно пустую строку, т.е. совсем пустую Length('') = 0, будь там хоть один пробел, было бы Length(' ') = 1 и это уже не пустая строка, это строка с пробелом.

Потому из строки убираются все пробелы с обеих сторон, для сравнения с ''.
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2014, 19:01   #10
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Ага, значит,
Код:
 if S <> '' then
будет в принципе явно быстрее.
А что такое "ассемблерный подстрочник"?
Всем спасибо! Попробую ещё посмотреть гдето в сторону дебиггера.
xexxex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StringGrid - проверить, что строка не выбрана sasha_14-88 Общие вопросы Delphi 6 23.05.2014 12:23
Пустая строка си Praud Помощь студентам 3 21.12.2013 18:08
Пустая строка в Си приправыч Помощь студентам 1 08.12.2012 15:13
как сделать что бы работала быстрее luffi Помощь студентам 3 10.04.2012 23:53
Пустая строка ForzaJuve Общие вопросы C/C++ 3 13.10.2010 15:41