Уменьшить время работы программы
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Уменьшить время работы программы

Уменьшить время работы программы

Ответ
Поиск в этой теме
Непрочитано 17.09.2010, 10:20 #1
Уменьшить время работы программы
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, острый вопрос нехватки времени при выполнении расчетов программным способом. Программулина выдает 15000 значений за 12 минут. Таких значений должно быть 150 миллионов, т.е. время работы будет ппц каким! Есть какие-нибудь способы по увеличению производительности???
Просмотров: 7195
 
Непрочитано 17.09.2010, 10:32
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Пересмотри алгоритм, оптимизируй код... Компьютер можно взять помощнее
Do$ вне форума  
 
Непрочитано 17.09.2010, 10:36
#3
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Друзья, острый вопрос нехватки времени при выполнении расчетов программным способом. Программулина выдает 15000 значений за 12 минут. Таких значений должно быть 150 миллионов, т.е. время работы будет ппц каким! Есть какие-нибудь способы по увеличению производительности???
Напиши в личку Евгению Елпанову - у него огромный опыт
работы с большими объемами данных
(Евгений, без обид )
Олег (jr.) вне форума  
 
Непрочитано 17.09.2010, 10:47
#4
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Если оптимизацию уже не улучшить - переведи либо полностью, либо хотя бы частично прогу на более низкий уровень скажем на ассемблер.
Крайний вариант - опустить комп в жидкий азот.
Supermax вне форума  
 
Непрочитано 17.09.2010, 11:23
#5
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Друзья, острый вопрос нехватки времени при выполнении расчетов программным способом. Программулина выдает 15000 значений за 12 минут. Таких значений должно быть 150 миллионов, т.е. время работы будет ппц каким! Есть какие-нибудь способы по увеличению производительности???
Я уверен, что вашу программу можно многократно ускорить, потом посидеть, подумать и еще многократно ускорить и так до бесконечности. Правда, на каждой итерации, время на подумать будет увеличиваться...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 17.09.2010, 11:25
#6
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,994


алгоритмом прежде всего займись, подробнее сложно сказать
повышать мощность железа - не первое должно быть
crosandr вне форума  
 
Автор темы   Непрочитано 17.09.2010, 11:26
#7
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Выжал все, что мог, на каждом шаге отсек все ненужные варианты, ситуаций при работе может быть очень много, так что старался продумать каждый и убрать лишние действия. Единственное что получилось - это разбить обрабатываемый чертеж на несколько частей и повесить по 2 када на одно ядро (всего 3). Причем в 2008 вычисления идут быстрей, чем в 2006. Не знаю почему...
Zaghim вне форума  
 
Непрочитано 17.09.2010, 11:39
#8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Выжал все, что мог, на каждом шаге отсек все ненужные варианты, ситуаций при работе может быть очень много, так что старался продумать каждый и убрать лишние действия. Единственное что получилось - это разбить обрабатываемый чертеж на несколько частей и повесить по 2 када на одно ядро (всего 3). Причем в 2008 вычисления идут быстрей, чем в 2006. Не знаю почему...
Найди самый медленный участок программы - место, на котором теряется основное время и выложи посмотреть - уверен, форум сможет ускорить этот код...

ps. никогда не стоит считать, что код не возможно улучшить и оптимизировать - это основное заблуждение! Лучше считать, что пока знаний, смекалки и времени не хватает для следующего шага...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 17.09.2010, 11:41
#9
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


С этим не спорю)))

Код:
[Выделить все]
(defun dvaline ()
  
  (setq mp1 nil
    mp2 nil
    mp3 nil
    mp4 nil
    mpa nil
    mpb nil
    mpc nil
    mpd nil
    mpe nil
    mpf nil
    mpg nil
    mph nil)
  
  (setq flag1 1)
  (setq bp1p bp1)
  (setq par1 0
    par2 0
    par3 0
    par4 0
    fl1 0
    fl2 0)

  (setq poi1 (polar bp1 ug2 1100))
  (setq dpoi (distance bp1 poi1))
  (setq ug ug2)
  (spoint)
  (setq mpa a)
  (if (/= mpa nil)
    (progn
       (setq mpaa (polar mpa ug2 esp))
       (setq mpab (polar mpa ug4 esp))
       (command "erase" a1 "")
    )
  )  
  (if (/= mpa nil)
    (progn
      (setq bp1 (polar mpa ug2 0.3))
      (setq poi2 (polar bp1 ug2 1100))
      (setq dpoi (distance bp1 poi2))
      (setq ug ug2)
      (spoint)
      (setq mpb a)
      (if (/= mpb nil)
        (progn
           (setq mpba (polar mpb ug2 esp))
           (setq mpbb (polar mpb ug4 esp))
           (command "erase" a1 "")
       (setq par1 1)
           )
      )
    )
  )
  (setq bp1 bp1p)
  (setq poi1 (polar bp1 ug4 1100))
  (setq dpoi (distance bp1 poi1))
  (setq ug ug4)
  (spoint)
  (setq mpc a)
  (if (/= mpc nil)
    (progn
      (setq mpca (polar mpc ug2 esp))
      (setq mpcb (polar mpc ug4 esp))
      (command "erase" a1 "")
    )
  )
  (if (/= mpc nil)
    (progn
      (setq bp1 (polar mpc ug4 0.3))
      (setq poi2 (polar bp1 ug4 1100))
      (setq dpoi (distance bp1 poi2))
      (setq ug ug4)
      (spoint)
      (setq mpd a)
      (if (/= mpd nil)
        (progn
          (setq mpda (polar mpd ug2 esp))
          (setq mpdb (polar mpd ug4 esp))
          (command "erase" a1 "")
          (setq par2 1)
        )
      )
    )
  )    

  (setq bp1 bp1p)
  (setq poi3 (polar bp1 ug1 1100))
  (setq dpoi (distance bp1 poi3))
  (setq ug ug1)
  (spoint)
  (setq mpe a)
  (if (/= mpe nil)
    (progn
       (setq mpea (polar mpe ug1 esp))
       (setq mpeb (polar mpe ug3 esp))
       (command "erase" a1 "")
    )
  )  
  (if (/= mpe nil)
    (progn
      (setq bp1 (polar mpe ug1 0.3))
      (setq poi4 (polar bp1 ug1 1100))
      (setq dpoi (distance bp1 poi4))
      (setq ug ug1)
      (spoint)
      (setq mpf a)
      (if (/= mpf nil)
        (progn
           (setq mpfa (polar mpf ug1 esp))
           (setq mpfb (polar mpf ug3 esp))
           (command "erase" a1 "")
       (setq par3 1)
    )
      )
    )
  )  
  (setq bp1 bp1p)
  (setq poi3 (polar bp1 ug3 1100))
  (setq dpoi (distance bp1 poi3))
  (setq ug ug3)
  (spoint)
  (setq mpg a)
  (if (/= mpg nil)
    (progn
      (setq mpga (polar mpg ug1 esp))
      (setq mpgb (polar mpg ug3 esp))
      (command "erase" a1 "")
    )
  )
  (if (/= mpg nil)
    (progn
      (setq bp1 (polar mpg ug3 0.3))
      (setq poi4 (polar bp1 ug4 1100))
      (setq dpoi (distance bp1 poi4))
      (setq ug ug3)
      (spoint)
      (setq mph a)
      (if (/= mph nil)
        (progn
          (setq mpha (polar mph ug1 esp))
          (setq mphb (polar mph ug3 esp))
          (command "erase" a1 "")
          (setq par4 1)
        )
      )  
    )
  )

  (if (and (/= mpa nil) (/= mpb nil))
    (progn
      (setq mp1 mpa
            mp2 mpb)
      (setq mp1a mpaa
        mp1b mpab
        mp2a mpba
        mp2b mpbb)
    )  
  )
  (if (and (/= mpc nil) (/= mpd nil))
    (progn
      (setq mp1 mpc
        mp2 mpd)
      (setq mp1a mpca
        mp1b mpcb
        mp2a mpda
        mp2b mpdb)
    )  
  )
  (if (and (/= mpe nil) (/= mpf nil))
    (progn
      (setq mp3 mpe
            mp4 mpf)
      (setq mp3a mpea
        mp3b mpeb
        mp4a mpfa
        mp4b mpfb)
    )  
  )
  (if (and (/= mpg nil) (/= mph nil))
    (progn
      (setq mp3 mpg
        mp4 mph)
      (setq mp3a mpga
        mp3b mpgb
        mp4a mpha
        mp4b mphb)
    )  
  )

)
(defun spoint ()
  
  (setq b (cons 10 (inter bp1 ug dpoi)))
  (setq w (nth 1 b))
  (if (/= w nil)
    (progn
      (setq c (cons 0 "POINT"))
      (setq d (list c b))
      (setq a (entmakex d))
      (setq a1 (ssget "L"))
      (setq a2 (entget (entlast)))
      (setq a (cdr (assoc 10 a2)))
    )
    (setq a nil)
  )  

)


(defun inter (bp1 ug dpoi / ss)
  (If (setq
    ss (ssget "_F" (list bp1 (polar bp1 ug dpoi)))
      )
    (cadr (cadddr (car (ssnamex ss))))
  )
)
В данном коде ищутся точки пересечения с линиями сверху-снизу-слева-справа. Если одна из точек найдена, например сверху - ищется еще одна точка выше этой. И так нужно найти все 8 точек, вне зависимости от того будут они нил или нет.

Последний раз редактировалось Zaghim, 17.09.2010 в 11:48.
Zaghim вне форума  
 
Непрочитано 17.09.2010, 11:43
#10
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,994


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
никогда не стоит считать, что код не возможно улучшить и оптимизировать - это основное заблуждение! Лучше считать, что пока знаний, смекалки и времени не хватает для следующего шага...
тока хотел нечто подобное написать)))
Цитата:
Сообщение от Zaghim Посмотреть сообщение
Единственное что получилось - это разбить обрабатываемый чертеж на несколько частей и повесить по 2 када
на чем программа написана?
crosandr вне форума  
 
Непрочитано 17.09.2010, 11:54
#11
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


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

Если убрать все три пункта, то выполнение ускорится очень существенно, возможно В СОТНЮ раз...

ps. я советую использовать математику и все вычисления делать только в памяти, работая со списками. При большой необходимости, можно редактировать примитивы, но не добавлять и удалять. Создавай примитивы только для визуализации результатов вычислений.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 17.09.2010, 11:56
#12
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


К сожалению по-другому не умею((( VisualLisp не знаю, могу только средствами АвтоЛиспа...
Zaghim вне форума  
 
Непрочитано 17.09.2010, 11:59
#13
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,994


А вообще, насколько быстр лисп (точнее интерпретатор) по сравнению с другими языками?
Zaghim, приложение компилируете предварительно?
crosandr вне форума  
 
Непрочитано 17.09.2010, 11:59
#14
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Zaghim Посмотреть сообщение
К сожалению по-другому не умею((( VisualLisp не знаю, могу только средствами АвтоЛиспа...
Если я правильно понял, в твоей программе идут расчеты методом построений. Попробуй то же самое получить математикой. И еще, поясни, что делает программа и какими методами - у меня не хватает времени разобраться, что ты хотел сделать в этом коде.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 17.09.2010, 12:01
#15
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


В 2008 каде программа работает в 3 раза быстрей!!! Не знаю почему, но это уже большой плюс!!! Думаю загрузить несколько компов и тему можно закрывать... Насчет математики, тут, к сожалению, не возможно сделать не получив точки пересечения, путем построения...
Zaghim вне форума  
 
Непрочитано 17.09.2010, 12:10
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Программу прсмотрел по диагонали, но если при помощи такой функции:
Код:
[Выделить все]
(defun inter (bp1 ug dpoi / ss)
  (If (setq
    ss (ssget "_F" (list bp1 (polar bp1 ug dpoi)))
      )
    (cadr (cadddr (car (ssnamex ss))))
  )
)
ты пытаешься находить пересечения, то:
1) Это самое узкое место
2) Вероятность получить ошибку очень велика, а если примитивы не видны на экране, то ошибка очень близка к 100%.
IMHO алгоритм нужно полностью менять.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 17.09.2010, 12:13
#17
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Я знаю, что если не видно, то капец всему, поэтому запускаю программу так, что бы все было в видимости экрана. По-другому найти не могу. Этот кусок обсуждался в теме - команда inters или подобная...
Zaghim вне форума  
 
Непрочитано 17.09.2010, 13:11
#18
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Я знаю, что если не видно, то капец всему, поэтому запускаю программу так, что бы все было в видимости экрана. По-другому найти не могу. Этот кусок обсуждался в теме - команда inters или подобная...
Это все равно не гарантирует работоспособность функции (ssget "_F" ...). Многое еще зависит от величины зума и т.д.
Александр Ривилис вне форума  
 
Непрочитано 17.09.2010, 13:40
#19
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Zaghim Посмотреть сообщение
В данном коде ищутся точки пересечения с линиями сверху-снизу-слева-справа. Если одна из точек найдена, например сверху - ищется еще одна точка выше этой. И так нужно найти все 8 точек, вне зависимости от того будут они нил или нет.
Проще было приложить рисунок с пояснениями
а так нифика не понятно
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 17.09.2010, 15:39
#20
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Смотрите все в теме: "команда inters или подобная"
Zaghim вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Уменьшить время работы программы



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Прогресс в разработке ППРк за 3 года работы Максим Павлов Технология и организация строительства 76 16.08.2012 16:57
Как васстоновить файл каким он был до завершения работы программы? Галина А. Иванова Вертикальные решения на базе AutoCAD 6 03.02.2010 17:37
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Поиск работы Perezz!! Разное 46 21.03.2008 12:50