Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Задался вопросом, как писать на Каше эффективные расчетные программы: большие и длинные с подпрограммами, или маленькие и короткие, которые друг к другу обращаются. Например, 100 небольших функций объединить в одну программу, или не объединять? Влияет ли это на скорость выполнения кода? Под "программой" здесь понимается int или mac модуль. Написал тест: testcall ; s vzts=$zts for i=1:1:1000000 do ; .;s c=$$testcall2(2,3) ;вызов внутренней процедуры/функции .;s c=$$testcall^OMvalue(2,3) ;вызов внешней процедуры/функции (лежит в длинной программе 350строк) .s c=$$testcall2^testcall(2,3) ;вызов внешней процедуры/функции (лежит в короткой программе 20строк) w !,$p($zts,",",2)-$p(vzts,",",2)," сек" q testcall2(a,b) ;поверка эффективности внешних вызовов q a+b Результаты: .281 сек - вызов внутренней процедуры/функции,точнее 1000000 вызовов .312 сек - вызов внешней процедуры/функции (лежит в короткой программе 20строк) .437 сек - вызов внешней процедуры/функции (лежит в длинной программе 350строк) Есть небольшая разница, видимо загрузка длинной программы в процесс пользователя потребляет сколько-то ресурсов. Но, похоже, не стоит из-за этих миллисекунд заморачиваться :) 1.Придерживаетесь ли Вы каких-то ограничений на размер программ? 2.Может есть другие моменты, типа, надо писать модули размером 32кб, чтобы получить эффективное кэширование программ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2012, 15:15 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Как рассказывал Сергей Кудинов на одной из школ. чем меньше стек тем лучше, думаю тем более для расчетного кода. на счет скорости выполнения в зависимости от размера исходника, полагаю стоит попробовать еще поиграть с размером буфера программ обычно придерживаемся тем ограничением при котором программа просто перестает компилится из-за большого размера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2012, 16:09 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
DirksDR , Для большей производительности по возможности лучше вовсе отказаться от вызова функций/процедур (стр. 33, 36-41; ссылка ниже): testcall #define testcall2(%a,%b) %a+%b n t,i,c #;вызов внутренней процедуры/функции s time=$zh for i=1:1:1000000 s c=$$testcall2(2,3) w !,$zh-time," сек." s time=$zh for i=1:1:1000000 s c=$$$testcall2(2,3) w !,$zh-time," сек." testcall2(a,b) ;поверка эффективности внешних вызовов q a+b Код: plaintext 1. 2. 3. General System Limits Оптимизация Caché-приложений (pdf, автор: Сергей Кудинов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2012, 16:43 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Спасибо ответившим! servit, Применение макроса вообще впечатлило, надо почитать и взять на вооружение. DAiMor Вы, наверное, широко используете макроподстановки, раз у Вас получаются такие тексты, что "программа просто перестает компилится из-за большого размера " :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 12:12 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
макросы конечно активно, но в основном они достаточно простые и не так сложно написать программу которая будет при компиляции ругаться на большой размер. обычно у меня было так когда строк кода переваливало за 5-6 тыс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 12:18 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
DAiMorмакросы конечно активно, но в основном они достаточно простые и не так сложно написать программу которая будет при компиляции ругаться на большой размер. обычно у меня было так когда строк кода переваливало за 5-6 тыс. Расскажите пожалуйста секреты отладки программы на 5 тыс строк :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 12:39 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
DirksDRПрименение макроса вообще впечатлило, надо почитать и взять на вооружениеИспользую макросы, но довольно ограниченно. Например, чтобы написать код, который будет работать в разных версиях Cache (есть где-то в запасниках пара макросов: $$$LISTFROMSTRING и $$$LISTTOSTRING :). Но заменить макросами существующие подпрограммы и функции (почти никогда) не получится, т.к. либо придётся превратить функцию в "oneliner", либо, в случае многострочных макросов, перелопатить код, чтобы макровызов стал единственной командой в строке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 13:00 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
D_De1mosDAiMorмакросы конечно активно, но в основном они достаточно простые и не так сложно написать программу которая будет при компиляции ругаться на большой размер. обычно у меня было так когда строк кода переваливало за 5-6 тыс. Расскажите пожалуйста секреты отладки программы на 5 тыс строк :) Секрет очень прост - поменьше "программировать в дисплей" и вспомнить что есть такие понятие, как "машинонезависимая оптимизация программ", "отладка программы по листингу". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 13:25 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Alexey MaslovDirksDRПрименение макроса вообще впечатлило, надо почитать и взять на вооружениеИспользую макросы, но довольно ограниченно. Например, чтобы написать код, который будет работать в разных версиях Cache (есть где-то в запасниках пара макросов: $$$LISTFROMSTRING и $$$LISTTOSTRING :). Но заменить макросами существующие подпрограммы и функции (почти никогда) не получится, т.к. либо придётся превратить функцию в "oneliner", либо, в случае многострочных макросов, перелопатить код, чтобы макровызов стал единственной командой в строке. Использую макросы интенсивно, в том числе многострочные. Именно использование макросов позволило мне существенно увеличить быстродействие. Когда-то проводил ислледования на предмет поиска скрытых резервов Cache. Правда их никто не скрывал, просто мы очень "ленивые", чтобы посмотреть поглубже. В Cache действительно очень много различных приемов для оптимизации быстродействия кода. В свое время радовался каждой сэкономленной микросекунде. В результате всех ухищрений удалось сэкономить аж целых 20 миллисекунд!!! Это для меня было очень много и дальше я не стал этим заниматься. Именно эти 20 миллисекунд сыграли решающую в выборе технологии Cache, в свое время, перед остальными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 13:35 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Использование в программах макросов многострочных (подпрограмм). Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Если у меня много программ используют одни и те же подпрограммы, то разумно их вынести в отдельную рутину. Но для интенсивных вычислений такой способ приведет к потере быстродействия перед вышеприведенным способом. Останется в inc файле разместить многострочные макросы, по сути подпрограммы, а в своей программе вызывать их как свои подпрограммы. Мы сейчас не будем обсуждать удобства сопровождения таких подпрограмм, на этот счет есть тоже множество приемов. Но именно такой подход, в свое время, дал мне драгоценные, кажется 5-7 миллисекунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 13:56 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Ой, не все привел, извиняюсь. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 14:08 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
AlexKB, Прием с включением подпрограмм мне здорово понравился. Как раз начал думать, как это сделать, для функций преобразования дат, например. Можно пример многострочного макроса выложить? Кому-нибудь попадались общеупотребительные макробиблиотеки для Cache в инете? И по ходу еще вопрос - есть ли макросы в GT.M, и совместимы ли по синтаксису? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 15:26 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
DirksDR, Один из многих Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 15:42 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
AlexKB, почему предпочли функцию-обёртку над макросом без параметров Код: javascript 1. 2. 3. 4. макросу с параметрами : Код: javascript 1. 2. 3. 4. еще бы и на вызове функции сэкономили... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 15:45 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Alexey MaslovAlexKB, почему предпочли функцию-обёртку над макросом без параметров Код: javascript 1. 2. 3. 4. макросу с параметрами : Код: javascript 1. 2. 3. 4. еще бы и на вызове функции сэкономили... 1. Функция обертка у меня только над многострочными макросами. 2. Потому что Код: plaintext 1. у меня может встречаться множество раз. И тогда макрос Код: plaintext 1. развернулся бы столько же раз. 3. Потому что фунции-обертки у меня в других программах являются участниками выражений. 4. А может и еще были причины, честно не помню - давно это быоо. Задавшему вопрос, еще очень помогают экономить время генераторы программ, когда на основании справочных данных генерится программа, которая максимально содеожит константные выражения, и мало бегает по справочникам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 16:00 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
AlexKBразвернулся бы столько же разОно бы и ничего, особенно c 2011.1+ с ее большими программами (RoutineSize <= 8MB). Но вот написать многострочный макрос, пусть даже подпрограмму, а не функцию, чтобы его многократные развертывания правильно работали, не так-то просто. Слишком бедны штатные средства: ньючить-то нечего нельзя. Например, я могу определить только одну уникальную переменную: ##Unique(new), точнее я могу определить их сколько угодно, но сослаться смогу только на последнюю: ##Unique(old) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 16:29 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Alexey MaslovAlexKBразвернулся бы столько же разОно бы и ничего, особенно c 2011.1+ с ее большими программами (RoutineSize <= 8MB). Но вот написать многострочный макрос, пусть даже подпрограмму, а не функцию, чтобы его многократные развертывания правильно работали, не так-то просто. Слишком бедны штатные средства: ньючить-то нечего нельзя. Например, я могу определить только одну уникальную переменную: ##Unique(new), точнее я могу определить их сколько угодно, но сослаться смогу только на последнюю: ##Unique(old) Ну это все делалось еще для 4-ки, потом переносилось на 5.0.21, дорабатывалось... Для решений на более новых версиях не было таких жестких требований. Там уже были другие требования... А вот ньючить - наоборот старались от этого уходить, потеря быстродействия. Процедуры тоже теряют в быстродействии перед подпрограммами и функциями. Для задавшего вопрос, еще дают выиграши использование однострочных IF и FOR, использование точечного синтаксиса - блочные подпрограммы, да еще много чего. Все зависит от того, что требуется. Также дает выиграш использование стиля программирования "80*24". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 16:52 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Жизнь не стоит на месте, и многое зависит от "целевой" версии Cache. В версии 2010.1 (более ранние уже плохо помню):многострочные if cond {...}, for {...} не проигрывают по скорости однострочным if и for {скобки} быстрее, чем "точки" процедуры быстрее, чем традиционные функции с New a,b,c. Начиная с 2010.2: ускорена работа с большими локальными массивами улучшена производительность $PIECE/$FIND Начиная с 2012.2, локальные массивы действительно получили право называться большими: предельный объём памяти процесса увеличен до 2TB. Ну и много другого в разных версиях по мелочи улучшалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2012, 18:01 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
AlexKB, Еще раз спасибо. >Также дает выиграш использование стиля программирования "80*24". Сомневаюсь, что правильно понял, что Вы имели ввиду. Это ведь размер экрана терминала? Встречал рекомендации, не имеющие отношения к Каше, так делить программы на модули, чтобы текст каждого модуля умещался на одном экране. Мол, так легче для понимания и сопровождения. ИМХО, перегиб, надо хотя бы 72 строки на модуль(страница А4). Говоря о выигрыше, Вы имели в виду выигрыш от хорошего стиля программирования? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2012, 12:26 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
DirksDRAlexKB, Еще раз спасибо. >Также дает выиграш использование стиля программирования "80*24". Сомневаюсь, что правильно понял, что Вы имели ввиду. Это ведь размер экрана терминала? Встречал рекомендации, не имеющие отношения к Каше, так делить программы на модули, чтобы текст каждого модуля умещался на одном экране. Мол, так легче для понимания и сопровождения. ИМХО, перегиб, надо хотя бы 72 строки на модуль(страница А4). Говоря о выигрыше, Вы имели в виду выигрыш от хорошего стиля программирования? На самом деле я могу ошибаться, поскольку скоростные исследования проводил очень давно, а жизнь не стоит на месте, как справедливо заметил тов. Маслов. Поэтому, многие мои рекомендации могут быть не верными на данный момент. 24*80, я имел ввиду размещать в одной строке побольше команд, не злоупотреблять пробелами, избегать комментариев, которые попадут в obj-программу. Но на сегодняшний день это уже может уже и не иметь заметного выиграша. Тут нужно экспериментировать и находить наиболее приемлемые варианты, постоянно балансируя между скоростью и читаемостью кода. Если у Вас Каше последних версий, то в добавок могу сказать: 1. Если у Вас инженерные расчеты, то скорость может добавить вычисление данных во float-представлении. 2. Если данные поступают от измерительных систем, то можно использовать Кашовские упаковки распаковки входных данных и полученных результатов (там теперь есть float и битовые преобразования). 3. Если у Вас выисления находятся в разных процессах, или обмены и вычисления находятся в разных процессах, то хорошо использовать координацию такой работы при помощи семафоров и почтовых ящиков - очень хорошая скорость переключения между процессами и прогнозируемая, управляемая координация работы процессов. 4. Если при вычислениях интенсивно используются данные в глобалах, то желательно такие данные размещать в одном глобале, тщательно спроек4тировать структуру глобала, чтобы уменьшить число обращений. Также использовать неполный синтаксис глобала, но очень осторожно. 5. Если в результате расчетов должна интенсивно расти БД, то лучше заранее разметить ее размером побольше, в сплошной области на диске. 6. Ну и еще куча всего: временные глобалы, отключение сортировки, отключение журналирования, и т.д и т.п. А главное - мои советы не догма. Прислушивайтесь и к другим форумчан и делайте свои собственные выводы, опираясь на результаты Ваших исследований. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2012, 12:48 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
AlexKB, что (какие конструкции) вы использовали в качестве семафоров и почтовых ящиков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2012, 15:24 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Alexey MaslovAlexKB, что (какие конструкции) вы использовали в качестве семафоров и почтовых ящиков? class %SYSTEM.Event Там есть подробное описание использования - очень удобная штучка! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2012, 16:10 |
|
||
|
эффективность вызова подпрограмм/функций
|
|||
|---|---|---|---|
|
#18+
Все прям как в ОСРВ, даже проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2012, 16:11 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=37912390&tid=1557412]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 260ms |
| total: | 410ms |

| 0 / 0 |
