2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Теория оптимизации программ
Сообщение25.02.2016, 21:54 
Заслуженный участник


08/04/08
8562
Нашел свое преобразование в Вики: https://en.wikipedia.org/wiki/Loop-inva ... ode_motion - там тоже отсылают к Ахо, Сети, Ульману.

(Оффтоп)

rockclimber в сообщении #1101994 писал(а):
Sonic86 в сообщении #1101948 писал(а):
Язык взят исключительно для примера: он достаточно бедный и безглючный.
Я буквально пару недель назад напоролся на очень неприятный глюк (см. обсуждение тут). Это пока единственный известный мне глюк такого рода, но неприятно то, что типичная ошибка этапа компиляции вылезает только в рантайме. Другие языки такого себе не позволяют обычно. Oracle, насколько я знаю, в курсе, но считает, что это нормально. Случай не ваш конечно (раз вы в БД не лезете), просто, скорее, как иллюстрация того, что и на старуху бывает проруха.
Ой, да там достаточно того, что криво написанный group by не вылетает при компиляции. Ой не буду вспоминать.

rockclimber в сообщении #1101994 писал(а):
Sonic86 в сообщении #1101948 писал(а):
С таким же успехом я мог бы взять C++, Pascal, м.б. Delphi, Lua какой-нибудь - любой C-подобный процедурный язык.
Ну вот я бы не сказал, что с таким же успехом. Хоть я и фанат PL/SQL, но для вашей задачи он мало подходит, имхо. Может, вам все-таки что-то более классическое взять?
М.б. я вообще себе возьму какой-нибудь абстрактный примитивный язык с минимумом синтаксиса. Буду все писать процедурами вида pName(par1,...,parn);

mustitz в сообщении #1101983 писал(а):
Если это константное выражение, то да. Ну а так надо быть уверенным в том, составные части не изменились.
Ну да. Я опять повторюсь: я не привожу точные условия применения правила, поскольку они сильно будут зависеть от языка и м.б. еще чего-нибудь. Меня попросили привести примеры, я привел.

mustitz в сообщении #1101983 писал(а):
Если брать теорию, то мне больше нравится старый двухтомник Ахо, Ульман, «Теория синтаксического анализа, перевода и компиляции», 1978. Она более математична, чем книга Дракона. Там глава 11 (последняя во втором томе) как раз посвящена оптимизации.
Спасибо!

mustitz в сообщении #1101983 писал(а):
Если брать практику, то одна из самых простых дорог — генерация кода LLVM, который затем может быть оптимизирован средствами самого LLVM.
Спасибо! Нашел чего-то на хабре, почитаю. Интересно, сколько там цельной теории? Или это просто инструмент?

rockclimber в сообщении #1101994 писал(а):
mustitz в сообщении #1101983 писал(а):
Если от переменной явно или неявно взят адрес, или переменная может изменяться из другого потока?
Конкретно в PL/SQL этого нет.
Ой да, давайте без указателей, адресной арифметики и прочего насилия над мозгом. Не надо также ООП, классов, шаблонов, БД и еще что там есть, вполне достаточно арифметики и строк.

aa_dav в сообщении #1101966 писал(а):
Ну тот же Кнут незабвенный.
А том хотя бы какой? У меня до ИП Кнута руки дошли только до ГСЧ в середине 2-го тома.

aa_dav в сообщении #1101966 писал(а):
Как альтернативу я бы предложил https://ru.wikipedia.org/wiki/%D0%90%D0 ... 0%B8%D0%B7
Это больше плохо алгоритмизуемое искусство.
Вообще, вот я написал сортировку пузырьком. У меня даже близко нет ни одного преобразования, которое приводило бы к использованию метода "разделяй и властвуй". Потому то, что в Кормене описано - это пока как недоступное искусство. И там оно тоже неконструктивное. Т.е. там типа "возьмем такую-то задачу". Для нее внезапно есть вот такой-то алгоритм. Вот мы можем у него вычислить скорость. А откуда сам алгоритм взялся - непонятно. А в теории схем программ - там хоть преобразования есть.

Munin в сообщении #1102047 писал(а):
Под "оптимизацией" понимаются две сильно разные вещи:
- оптимизация порядка сложности алгоритма;
- оптимизация, не меняющая порядка сложности.

Примерно с 2000 года в программировании вырос и закрепился тезис, что первой заниматься нужно, а второй не нужно. <аргументы>

Sonic86, как видно по его примерам, под оптимизацией понимает вторую вещь. Ну так и не надо жаловаться, что она ушла в компиляторы.

Но важнее, конечно же, первая. Теории тут никакой нет, это дело творческое, максимум теория может помочь вычислить сложность алгоритма.
Я согласен полностью! И меня больше интересует все-таки первое, чем второе.

Maslov в сообщении #1101982 писал(а):
Sonic86, с какой целью оптимизируете?
С целью развлечения :-) С целью удовлетворения любопытства, например.

Давайте я другой пример приведу, ладно (видимо, никто мне больше все равно не ответит).
Хочу я написать значит программу, которая решает мне судоку. Алгоритм решения я какой-то там себе представляю, он там частичный и все равно может упереться в небольшой перебор. Но писать его мне лень. Зато мне интересно написать программу, которая оптимизирует другие программы (пусть там немножко понижает асимптотику - уже хорошо). И пусть я ее написал. Беру я задачу судоку и переписываю ее в виде совершенно унылого тормозного кода
Код:
A[1][1]=a11;
A[1][2]=a12;
...
A[9][9]=a99;

for(i1=1;i1<10;i1++){
...
    for(i81=1;i81<10;i81++){
      if(a11=i1 && ... && a81=i81){
        if(Все элементы в строках разные &&...){
          printf('решение');
        }
      }
    }
...
}

Далее беру я этот код и скармливаю программе-оптимизатору. Насколько сильного эффекта я могу добиться?

 Профиль  
                  
 
 Re: Теория оптимизации программ
Сообщение25.02.2016, 22:17 
Заслуженный участник
Аватара пользователя


30/01/06
72407
arseniiv в сообщении #1102069 писал(а):
Ну здрасьте. Нет, нужно.

Скажем так. Нужно, но гораздо реже, чем думают энтузиасты. Гораздо чаще это - ошибка, называемая premature optimization.

arseniiv в сообщении #1102069 писал(а):
Имеется в виду сравнительно высокоуровневая оптимизация: например, изменение структуры данных: вместо итератора, к примеру, дерево какое, если нужно постоянно узнавать, содержится ли в множестве элемент.

Это как раз пример первой :-)

 Профиль  
                  
 
 Re: Теория оптимизации программ
Сообщение25.02.2016, 22:58 


05/09/12
2587
Sonic86 в сообщении #1102134 писал(а):
Далее беру я этот код и скармливаю программе-оптимизатору. Насколько сильного эффекта я могу добиться?

Если программа-оптимизатор посерфит в гугле алгоритмы обхода графов в ширину и глубину, зарегистрирует логин на каком-нибудь компьютерном форуме и создаст там тему с таким вопросом, проанализирует ответы и выберет лучший - то можно добиться достаточно сильного эффекта :lol:

 Профиль  
                  
 
 Re: Теория оптимизации программ
Сообщение25.02.2016, 23:32 
Заслуженный участник


09/08/09
3438
С.Петербург
Sonic86 в сообщении #1102134 писал(а):
Далее беру я этот код и скармливаю программе-оптимизатору. Насколько сильного эффекта я могу добиться?

Если Ваша программа-оптимизатор работает на уровне локальной оптимизации кода (типа правил, описанных Вами в стартовом посте), то, боюсь, никакого. Никакой оптимизатор не сможет преобразовать грубый перебор во что-то более рациональное. В частности, ни одно из Ваших правил не сможет превратить $O(n)$ в $O(\log n)$

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

Хотя... вон какие штуки люди делают: https://habrahabr.ru/post/236689/
Цитата:
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень
Пусть мы хотим вычислить десятимиллионное число Фибоначчи программой на Python. Функция, использующая тривиальный алгоритм, на моём компьютере будет производить вычисления более 25 минут. Но если применить к функции специальный оптимизирующий декоратор, функция вычислит ответ всего за 18 секунд (в 85 раз быстрее)
Дальше - про содержательную оптимизацию питонного байт-кода.

 Профиль  
                  
 
 Re: Теория оптимизации программ
Сообщение26.02.2016, 00:17 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Sonic86 в сообщении #1102134 писал(а):
Вообще, вот я написал сортировку пузырьком. У меня даже близко нет ни одного преобразования, которое приводило бы к использованию метода "разделяй и властвуй". Потому то, что в Кормене описано - это пока как недоступное искусство. И там оно тоже неконструктивное. Т.е. там типа "возьмем такую-то задачу". Для нее внезапно есть вот такой-то алгоритм. Вот мы можем у него вычислить скорость. А откуда сам алгоритм взялся - непонятно. А в теории схем программ - там хоть преобразования есть.
Я когда-то видел статью, в которой описывался переход от сортировки вставками до сортировки слиянием, но сейчас хоть убей не могу ее нагуглить. Была она вроде в каком-то месте, связанном с функциональным программированием, возможно, ICFP. Дело там шло примерно так: сортировка вставками - это свертка $\operatorname{sort}([x_1, x_2, \dots,x_n]) = \operatorname{insert}(x_n,\dots,\operatorname{insert}(x_2, \operatorname{insert}(x_1, []))\dots)$. От перестановки в последовательности иксов у нас результат не меняется, по определению сортировки. Значит, есть некоторая коммутативная ассоциативная операция $\operatorname{merge}(xs, ys)$, для которой $\operatorname{insert}$ является частным случаем когда $xs = [x]$. Дальше мы берем и заменяем эти самые $\operatorname{insert}$ в сортировке на $\operatorname{merge}$ и с помощью ассоциативности реорганизуем дерево свертки из такого: $\xymatrix{ & \bullet\ar[d] & \bullet\ar[d] & \dots & \bullet\ar[d] & \bullet\ar[d] \\ \bullet\ar[r] & \bullet\ar[r] & \bullet\ar[r] & \dots\ar[r] & \bullet\ar[r] & \bullet}$ в сбалансированное.

 Профиль  
                  
 
 Re: Теория оптимизации программ
Сообщение26.02.2016, 02:50 


17/10/08

1313
Записываем задачу сортировки математически.

Дано: вектор целых (для определенности) чисел $a$ длины $N$.
Найти функцию $f:1..N \rightarrow 1..N$ такую, что
1. $f$ - биекция
2. $y_{i-1} \le y_i$, где $i = 1, 2, …, N-1$, $y=a(f(<1,2,…,N>))$

Данная задача решается алгоритмом перебора всех возможных функций (это примерно $O(N^N)$) и в выборе такой $f$, что выполняются все условия.

Поиск более эффективного вычисления функции $f$ состоит в эквивалентном преобразовании математической постановки задачи. Т.е. нужно выбрать набор разрешенных закорючек для таких преобразований и указать, каким образом вычисляется функция по ее математической формулировке. Например: если в описании задачи/подзадачи имеем не равенство, то это перебор.

Если хочется теории, как все это может производиться корректно, полно и т.п., то получится труд а-ля Бурбаки. Проблемы эффективности поиска рассматривать не будем, т.к. ТС спрашивал про теорию.

На этом постановка задачи не заканчивается, т.к. нужно оценивать, насколько каждый вариант вычисления функции $f$ нам подходит. Для этого требуется иметь репозиторий исходных данных (множество векторов $a$). Его также можно назвать "обучающим набором данных". Репозиторий должен содержать данные, отражающие "модель" применения функции $f$ на «практике».

"Прогон" каждого примера из репозитория дает некоторые характеристики: время, память и может еще чего-нибудь. Также можно придумать какие-нибудь оценки сложности (количество закорючек в мат. описании задачи). Из этого всего слепить критерий оптимальности.

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

Таким образом, если задача конечнопространственная, то поиск алгоритма с нужными качествами - вполне себе математическая задача. В домашних условиях, наверное, можно соорудить какой-нибудь ограниченный макет. Что-либо практически приемлемое под силу разве что технологическим гигантам...

 Профиль  
                  
 
 Re: Теория оптимизации программ
Сообщение26.02.2016, 12:23 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Munin в сообщении #1102143 писал(а):
Гораздо чаще это - ошибка, называемая premature optimization.
Мне подумалось, об этом в теме сейчас, наверное, все знают, и потому можно считать, что речь не о ней. :-)

 Профиль  
                  
 
 Re: Теория оптимизации программ
Сообщение26.02.2016, 16:27 


10/04/12
705
Sonic86 в сообщении #1102134 писал(а):
Ну да. Я опять повторюсь: я не привожу точные условия применения правила, поскольку они сильно будут зависеть от языка и м.б. еще чего-нибудь. Меня попросили привести примеры, я привел.

Я не верю, что существует некоторая общая «оптимизация» в вакууме. Все приёмы, как мне кажется, очень сильно привязаны к конкретному языку программированию. Если брать чистый C, то использование указателей превращает оптимизацию в ад. Поэтому там надо пользоваться const и restrict, иначе чуть ли не каждая операция будет сбрасывать значения всех переменных. Проблема в том, что большинство языков требуют/допускают интеграцию с C, и тут становится вопрос, что важнее: оптимизация или интеграция? Потому что любое обращение к внешней С-процедуре может изменить всё. С другой стороны есть Haskell и функциональные языки, где нет изменяемых переменных, и, как следствие, открываются большие просторы оптимизации. Посредине стоит Ada 2012, где есть контрактное программирование, можно доказать некоторые свойства программы, ...

Sonic86 в сообщении #1102134 писал(а):
mustitz в сообщении #1101983 писал(а):
Если брать практику, то одна из самых простых дорог — генерация кода LLVM, который затем может быть оптимизирован средствами самого LLVM.
Спасибо! Нашел чего-то на хабре, почитаю. Интересно, сколько там цельной теории? Или это просто инструмент?
Просто инструмент, читай универсальный ассемблер, которые может быть перекодирован в любой другой. Соответственно, оптимизация только на уровне ассемблерного кода.

Sonic86 в сообщении #1102134 писал(а):
Беру я задачу судоку и переписываю ее в виде совершенно унылого тормозного кода

...

Далее беру я этот код и скармливаю программе-оптимизатору. Насколько сильного эффекта я могу добиться?

Не думаю, что эффект будет сильный :) Это уже ближе к автоматическому доказательству теорем, потому как надо менять алгоритм. А потом доказать их эквивалентность. Мне так видится.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group