|
|
|
Оптимальный алгоритм если очень много условий в программе.
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток, господа. У меня немного странная проблема. Сейчас работаю над одним проектом в котором нужно проверять одновременное выполнение большого количества простых линейных выражений. К примеру if ((a+b==c)&&(5d==3с) &&(8k/5>10)...) { ... } else { ... } Проблема что таких условий может быть около 500-700 штук. Свести логику программы к меньшему их числу мало вероятно из-за специфики предметной области. Вопрос, как оптимально (с точки зрения производительности и читаемости кода) реализовать проверку такого количества условий? Спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2015, 04:26 |
|
||
|
Оптимальный алгоритм если очень много условий в программе.
|
|||
|---|---|---|---|
|
#18+
Рабинович, По скорости. расположить утверждения по возрастанию вероятности невыполнения. Не сомневаюсь, что часть утверждений/неравенств/ условий можно усилить. Прикрепляйте файл с условиями. По реализации. Создать структуру условие. Далее массив всех структур. И цикл с проверкой выполнения каждого. Производительность и читабельность чаще всего несовместимы. PS А язык на котором вы программируете поддерживает столько условий в операторе if() ? А если не секрет для чего такое большое число условий ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2015, 05:57 |
|
||
|
Оптимальный алгоритм если очень много условий в программе.
|
|||
|---|---|---|---|
|
#18+
Оптимально... Ну я бы начал с того чтобы убедиться а действительно ли надо такое большое количество условий? Не очень верится что это действительно так надо. Но если действительно.... Ну можно начать с упрощения условий и сведения их в какую-нибудь таблицу для хэш функции. Почитай вот тут: http://www.sql.ru/forum/1134172/tyapnichnyy-koi-8r Может чего и найдешь. А если условия действительно типа "(a+b==c)&&(5d==3с) &&(8k/5>10)" то можно использовать чуть более сложный подход: сделать себе авто-генератор исходного текста. То есть ты будешь вручную писать список условий и какую функцию на это условие запустить. Например так: Код: plaintext 1. 2. А генератор потом возьмет эти строки, отсортирует условия в порядке упрощения, выругается если два условия конфликтуют, и выдаст уже код готовый к компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2015, 06:58 |
|
||
|
Оптимальный алгоритм если очень много условий в программе.
|
|||
|---|---|---|---|
|
#18+
Рабинович, А группировать эти условия никак нельзя? if ЭтоСобака() then... sub ЭтоСобака { res = ВыглядитКакСобака && ЛаетКакСобака && КусаетсяКакСобака } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2015, 10:13 |
|
||
|
Оптимальный алгоритм если очень много условий в программе.
|
|||
|---|---|---|---|
|
#18+
РабиновичВопрос, как оптимально (с точки зрения производительности и читаемости кода) реализовать проверку такого количества условий? Во-первых, это часто противоречащие друг другу вещи, так что придётся выбирать. С точки зрения читаемости (а также лёгкости отладки и сопровождения) оптимально проанализировать эти выражения на предмет разделения на осмысленные и повторяющиеся части, присвоить результаты этих выражений логическим переменным с осмысленными именами и дальше формулировать бизнес-логику как серию минимально вложенных if-ов с использованием этих переменных. Примерно так: Код: sql 1. 2. 3. 4. 5. 6. С точки зрения производительности следует минимизировать ненужные операции (в частности, выносить часто срабатывающие условия до редко срабатывающих), исключить дублирование (если что-то уже вычислено, использовать это, а не считать повторно), использовать индексные операции (чтение из массива, switch) там, где ими можно заменить if. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2015, 17:27 |
|
||
|
Оптимальный алгоритм если очень много условий в программе.
|
|||
|---|---|---|---|
|
#18+
Рабинович, эффект оптимизаци данного ПО будет сильно зависеть от самой выборки входных данных. Лучше всего пару раз протрассировать выборку данных с выводом в таблицу где колонками будут во первых аргументы a,b,c,... и во вторых предикаты в скобках (p1,p2,p3...). Некоторые из элементов будут часто (почти тождественно) равны false, некоторые true, некоторые будут сильно зависеть друг от друга. На основании этой таблицы можно стоить гипотезы. А так, оптимизировать вобщем - бесполезно. Сейчас почти нет оснований улучшать этот код пока мы не увидим его в работе с живыми данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2015, 18:24 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38869748&tid=1341094]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 465ms |

| 0 / 0 |
