Оптимизация

Параллельная ветка к ДЗ № 3.

Найдите общую мысль в следующих публикациях. Просто пробежаться глазами, в режиме сканирования.http://habrahabr.ru/blogs/htranslations/97857/

http://ru.wikibooks.org/wiki/Ruby/Идеология

http://www.xakep.ru/magazine/xa/123/102/1.asp

http://sergeybiryukov.ru/2008/02/prezhdevremennaya-optimizaciya/

Ну, и чтобы не забывали, с чем имеем дело:

http://www.forum.mista.ru/topic.php?id=456328&page=1

Это имеет отношение к оптимальному решению ДЗ № 3…

комментариев 25 на “Оптимизация”

  1. timur.bagautdinov 14.08.2010 в 13:32

    Вот что думаю по этой теме. Прежде чем программировать, нужно сначала крепко подумать.

    Потом понять, а что мы собираемся оптимизировать:
    – скорость работы
    – объем памяти
    – объем места, занимаемый на диске.

    В зависимости от задач и оборудования свой критерий.

    Как показывает практика, в большинстве случаев делают упор на скорость, память дешевле докупить.

    Какие я к ней выдвигаю требования:
    – переносимость кода (ассемблерные вставки, недокументированные возможности – все в топку)
    – небольшая трудоемкость (10-15% от общего времени)
    – значимый выигрыш (от 20%)
    – понятность программы
    – возможность развития

    Порядок оптимизации вот какой:
    1. убеждаемся, что все работает.
    2. Ищем горячие точки. Нам ох как повезло, в конфигураторе есть профиллировщик свой.
    2. Ищем правильный алгоритм или структуру данных. Катастрофический прирост обычно приходит от этого, а не от трюков с ключом компилятора.

    Соответственно с опытом и постоянным самосовершенствованием мы будем все равно писать сразу более хороший код.

    • Сергей Коцюра 14.08.2010 в 15:17

      да, только надо понимать, что в основной своей массе мы пишем не код, а инструментарий для пользователей – это разные сущности. и оценки их эффективности – тоже разные. не имеет смысл плясать от радости как быстро и оптимально работает код, если он не удовлетворяет хотелок пользователя. Поэтому у меня на первом месте: 1. код должен работать как это требуется (пользователю);
      .
      конечно же, прежде чем делать то, что “хочет” пользователь – неплохо бы убедиться в адекватности этих хотелок – это отдельная большая тема/история ;-)

  2. Сергей Коцюра 01.08.2010 в 06:44

    Для себя давно установил в порядке важности (то что выше – важнее):
    1. код должен работать как это требуется (пользователю);
    2. код должен быть легко читаем;
    3. код должен испольняться быстро/быть оптимальным
    .
    в свое время, когда начинал 7-ку – конец 90-ых, никаких книжек не было, смотрел и читал код дтиповых конфигураций – все было ясно. как впрочем ясно было и до сих пор на типовых 7-ых ТИСах, БУХ. Что в текущих конфигах 8-ки – не знаю, но люди особой радости от читабельности и понятности кода (особенно запросов на 500 строк) – особого восторга не выказывают… Вышла УТ11 – говорят что код очень хорош…

  3. Леонид 07.07.2010 в 15:14

    Мое мнение код нужно писать оптимально сразу.
    Пусть не максимально по быстродействию, тратя на это вагон времени, но приближаясь к идеалу.
    В противном случае происходят не приятные вещи:Программист пишет код на базе где объем данных минимален (запуск нового проекта, копия базы без реальных данных и т. д.). Торопится, лишь бы работало.
    Таких программистов не один.
    Через пол года база выросла до приличного объема, начались жуткие тормоза.
    И вот начинается оптимизация. :)
    Сначала определить «узкое» место.
    Потом разобраться в чужом коде.
    Убедится в том что вагон реквизитов в запросе действительно нужен, не нужные убрать.
    Переписать код на более оптимальный.
    Убедится что это не затронуло другие блоки.
    Опять вернуться к определению «узкого» места.

    Сам через это прошел. Готов был оторвать руки тем кто писал «лишь бы работало». :)

    • : )))
      Вот только это нужно сравнивать с заработанным за это время бизнесом доходом.
      “Идеально через полгода” по деньгам может оказаться сильно хуже “good enough”….

      • Леонид 07.07.2010 в 18:13

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

  4. Александр Горлов 06.07.2010 в 01:06

    Лучше – сразу писать красивый и по возможности оптимальный код. Когда это входит в привычку – с ужасом начинаешь смотреть на свой код годичной и более давности. Значит – развиваешься, растешь… :)
    Долбить по клавишам со скоростью машинистки – возможно это и программирование, но не удовлетворяющий самого себя результат. А писать стоит так, чтобы самому было приятно от сотворенного тобой результата.
    Ну и простите за бранное слово – ненавижу “говнокод” и “говнокодеров” (типа ТЗ1.Кол1 = ТЗ2.Кол2)!

  5. Главная мысль – оптимизаторов – НАКУЙ (почти по Парабеллумовски….)
    1. Делаем рабочий код – Код снимает проблемы? Решает задачи? – Да. Отлично. СТОП.
    2. Если все устраивает – НЕ трогаем.
    3. Впоследствии, если нужно, вернемся к нашему неоптимальному коду. Вылизывание, причесывание – потом…. После… Когда все (или почти все) заработает…

    • Я бы не был так резок : ) Все-таки, есть люди, которым просто сразу не нравится некрасивый код – имеют право сразу писать чисто и на скорость. Получается – отлично. Не получается – ну, значит да, пусть сначала заработает – а потом берем что есть как “контроль” и делаем вторую версию, сравниваем результаты и т.д.

      P.S.
      Марат, с Днем Рождения! : )

  6. Тимофей Житков 05.07.2010 в 19:00

    странная задача, выиграть 1% скорости, потерять читабельность(дальнейшее развитие) … ООП приводит к потере производительности, но приводит к читабельности и расширеню, чем просто обычное описание решения текущей задач …
    ИМХО лучше потрять производительность и ускорить разработу программисту …

    • Читабельность – святое, не на ассемблере же пишем…

      Но чтобы было понимание: Женя в своих решениях НЕ будет делать код легко читаемым, это тоже делается не случайно – это нужно для создания эффекта “преодоления”, чтобы срабатывало “О!!” при анализе решения, а не “просто глазами пробежаться”…

      • >>>чтобы срабатывало «О!!» при анализе решения, а не «просто глазами пробежаться»…
        Вот это супер! Ведь стандартные приемы можно и в СП подсмотреть, и в типовых, и в литературе…
        Коллеги, нам изюминок подавай! ))

  7. Сергей Шульженко 05.07.2010 в 16:26

    Ну, Вы, утрируете. Излишняя оптимизация конечно вредна, но решать задачи перебором тоже не самый лучший вариант.

    • 1. Оптимизация в “узком месте” – это оптимизация. Оптимизация не в “узком месте” – пустая потеря времени.
      2. Попробуйте все-таки увидеть и другую точку зрения:
      скорость разработки и наглядность (когда программист даже средненькой квалификации сможет понять код) для 90% кода важнее , чем выигрыш 470 миллисекунд. Тем более – в среде, которая сама убивает смысл скоростной оптимизации регулярного кода.
      10% – это ежеминутно исполняемые процедуры или алгоритмы выборки/записи массивных данных…

      • Сергей Шульженко 05.07.2010 в 17:15

        Я с Вами полностью согласен. Но чем дальше тем больше точка зрения- сделаю сейчас абы как а потом когда нужно сделаю рефакторинг приводит к большому количеству не то что неоптимального, а плохого кода.
        Оптимизация в виде сокращения переменных в циклах, количества присвоений и т.д. да это пустая потеря времени. А изменение алгоритма на такой же простой, но более эффективный – это помимо, хоть и возможно не нужного увеличения скорости еще и практика для мозгов. Хотя заниматься этим нужно действительно когда есть время.

        • Сергей Шульженко 05.07.2010 в 17:19

          Но как я и сказал я с Вами полностью согласен, и по крайней мере при данном обучении все эти споры не нужны и вредны. Люди не на то отвлекаются.

        • Сергей, мое суждение не абсолютно, Вы правы в том, что все время искать простой вариант – это не гуд для кармы, практику для мозгов тоже нужно устраивать.

      • В написании отчетов для 1С главное, чтобы пользователь не уснул, пока выполняется отчет :)

      • Ну вы товарищи даете. Сначала надаете задачек с юзюминками, потом покажете решения, тоже кстати не очень читабельные. Например по 2 заданию в возврате функции 3 знака равенства. Более читабельнее было бы использовать если. Или в 3 ем задании местами переменные менять без использования 3ей переменной тоже не очень читабельно. А потом говорите, эх куда же вас поперло.

        • : )))
          Ровно поэтому выложен этот дополнительный пост – это балансировка, чтобы не кренило в одну только сторону…

          Здесь у нас тренировочные задания, мы прокачиваем собственные навыки – но при решении прикладных задач у клиента действует больше факторов. Один из признаков хорошего коммерческого программирования – сначала сделать работающий прототип, и только потом его оптимизировать. Об этом и ссылки.

          • Спасибо за ссылки, очень было интересно.
            Я стараюсь сразу писать наиболее оптимально, насколько хватает моих знаний. иногда предпочитаю написать больше понятного кода и такого который в дальнейшем проще менять, чем запихнуть всё в 10 строк, которые через месяц не поймешь, как исправить.
            либо, когда гонят со сроками, пишу ” влоб”, чтобы читалось и работало без багов, насколько успеваю-отлавливаю.
            сегодня вот понадобилось поискать по двум критериям из одной ТЗ строки в другой. Написал быстро велосипед, который успешно работает. зато он мой, и я знаю и уверен куда он поедет.

            • Это опять вопрос баланса : )
              Если некоторый расчет производится неоднократно – будет некрасивым, если потом не вернуться и не проверить код на “затыки”…

              • Но не всегда на это есть время, и в большинстве случаев первоначальный код остается. А также срабатывает классическое “Работает – не трогай”. Пока в этот код не упрется разработчик, разбираясь: “а почему ж так медленно-то” :)
                з.ы. за ссылочки спасибо