| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > скорость проверки условий |
| Автор: sgentstuff 19.7.2006, 08:03 | ||
есть много вот таких условий, как можно увеличить скорость проверки, может нужно в корне что-то поменять или подругому никак?
|
| Автор: skyboy 19.7.2006, 08:21 |
| sgentstuff, ну ты спросил! А откуда переменная берётся? Если, например, ты её вытягиваешь ихз базы, то можно посоветовать сравнивать числовые идентификаторы(мало ли, может вышло бы что-нить типа "if *(id>3) AND (id<12)"). Если у тебя приходит на порт в виде сигнала, тоже можно отсеят. Например, наложив на пришедший сигнал битовую маску.. Если речь же именно об этом варианте, то ответ "нет". Других конструкций, более быстрых чем if, в этом случае не предвидится. Разве что отсортируй совпадения по мере уменьшения вероянтости(сначала - самое вероятное) и отключи флаг компиляции "Полная эмуляция логического выражения". |
| Автор: Romikgy 19.7.2006, 09:01 |
| sgentstuff, я так понимаю строки сравниваешь, можно предложить вариант со сравнением посимвольно , имхо будет быстрее |
| Автор: Alexeis 19.7.2006, 09:15 |
| sgentstuff, не знаю на сколько здесь критично использование именно строк, но можно все строковые константы, заменить перечисляемым типом и проверить попадает ли число во множество состоящее из этих констант. |
| Автор: sgentstuff 19.7.2006, 09:32 | ||||
alexeis1 - и намного быстрее будет работать? Добавлено @ 09:36
как это сделать? |
| Автор: BUGOR 19.7.2006, 09:37 |
| sgentstuff, я бы использовал регулярные выражения, по крайней мере из всего предложенного на мой взгляд наиболее рациональный и довольно быстрый способ. |
| Автор: Matematik 19.7.2006, 09:43 | ||
Можно еще запихнуть строки в StringList отсортировать и делать так
|
| Автор: sgentstuff 19.7.2006, 09:50 | ||||
и это быстрее будет работать, ведь стринг лист теми же or будет проверять, или нет? |
| Автор: Alexeis 19.7.2006, 09:50 | ||||
Еще как! - будут ведь сравниватся не строки, а индексы констант в множестве, но плохо, что может понадобится сама строка, тогда можно сделать масив типа.
и иметь строковое представление. Добавлено @ 09:52
Еще как медленно, он ведь будет еще каждый раз организовывать поиск в строке, для нахождения индекса. |
| Автор: dvamaster 19.7.2006, 09:54 | ||||
отнюдь не быстрее, он сравнивает в цикле все строки, а потом индекс выдает Мона так
|
| Автор: BUGOR 19.7.2006, 09:55 |
| Вообще, если такие условия используются в цикле и их много, то нужно что-то в корне менять, ибо в любом случае много ты не выиграешь ни на одном предложенном способе, а если сравнения выполняются не в цикле, то речь идёт больше о "красоте" и рациональности кода, то я всё же настаиваю на регулярных выражениях |
| Автор: sgentstuff 19.7.2006, 09:56 |
| PS а чем не подошел обычное сравнение строк? дело в том что этих условий у меня будет около 200 штук, и эта проверка вставленна в очень большой цикл, и теперь моя прога работает несколько часов, все из-за того что проверяется много условий, вот я и хотел как-то оптимизировать |
| Автор: Romikgy 19.7.2006, 09:57 |
а такое откомпилится? |
| Автор: sgentstuff 19.7.2006, 10:01 | ||||||
на счет стринг листа, если отсортировать как предложили и потом сравнивать может все-таки быстрее будет? |
| Автор: Romikgy 19.7.2006, 10:01 |
имхо это не так много условий, конечно если они не вызываются пол милиона раз, а вообще я бы посоветовал, где то рядом с каждой строкой держать ключ который сравнивать, кса можно еще поигратся с указателями и преобразованиями в целые числа Добавлено @ 10:05 sgentstuff, а могут ли в проверяемых строках быть допустим такие 'tsu' и 'tsur'? |
| Автор: Alexeis 19.7.2006, 10:11 | ||
| нет, конечно, имена элементов множества ведь существуют только в исходном коде! Добавлено @ 10:19
Если все строки такие маленькие 3-5 симвотов, то лучше оставить как есть. |
| Автор: Girder 19.7.2006, 10:45 |
| xxx='|me|tur|na|afr'; if pos('|'+s2,xxx) then... |
| Автор: Romikgy 19.7.2006, 10:56 | ||
| Girder, я тоже так подумал только два замечания: 1. это дельфи форум 2. если будет
tur - будет строкой поиска то никогда правильного результата не получишь , плюс символ | не может быть в строках |
| Автор: sgentstuff 19.7.2006, 11:13 | ||
неа! |
| Автор: Romikgy 19.7.2006, 11:17 | ||
имхо самое быстро будет так
|
| Автор: sgentstuff 19.7.2006, 11:19 | ||
покажите пример пожалуйста! |
| Автор: Alexeis 19.7.2006, 11:19 | ||||
ну тогда можно чуть поправить
Добавлено @ 11:26
|
| Автор: Mechanic 19.7.2006, 12:40 | ||
А я бы составил строку из всех вариантов, типа
Ой, уже показал этот вариант alexeis1. Только похоже, этот самый быстрый, по-любому. |
| Автор: sgentstuff 19.7.2006, 12:42 | ||||
проверил я этот способ, скорость работы таже! |
| Автор: Romikgy 19.7.2006, 12:44 |
| значит тормозит не в условиях! |
| Автор: sgentstuff 19.7.2006, 12:47 | ||||
пишу я так, но в переменных не может быть пробела
Добавлено @ 12:49
почему этот способ не берет первую переменную? |
| Автор: Girder 19.7.2006, 13:00 |
| А ты список каждый раз создаеш? |
| Автор: sgentstuff 19.7.2006, 13:00 | ||
| Romikgy - твой способ почему-то неберет первую переменную, видимо у нее нет впереди '+' Добавлено @ 13:02
1 раз! |
| Автор: Romikgy 19.7.2006, 13:45 | ||||
сделай так
и в конце массива добавлений добавь
|
| Автор: sgentstuff 19.7.2006, 13:47 | ||||||
этот способ затестил, чуть чуть быстрее Добавлено @ 13:57 alexeis1 - компилятор не пропускает переменную ark-k, что делать?
|