Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 3 из 4 ПерваяПервая 1 2 3 4 ПоследняяПоследняя
Показано с 21 по 30 из 39
  1. #21
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Refraktor Посмотреть сообщение
    Подробней можно о "сбрасывании" тэга?
    Очевидно, что данная операция сбрасывает тег. Она помогает только в ситуациях, когда нужно избавиться от предупреждения и/или некоторых зависимостей (например, перегрузка операторов и т.п.). В компиляторе же тег выражения сбрасывается на значение "публичного" тега.

    Например, можно использовать сбрасывание тега в данном участке кода:
    PHP код:
    if (!('A' <= name[0] <= 'Z'))
            return 
    0
    Т.е. можно сделать так:
    PHP код:
    if (== _:('A' <= name[0] <= 'Z'))
            return 
    0
    Из-за того, что логическое выражение возвращает значение с тегом bool, то для сравнения его с нулём нам необходимо избавиться от этого тега, иначе возникнет предупреждение.
    Последний раз редактировалось VVWVV; 30.03.2017 в 15:02.

  2. Пользователь сказал cпасибо:
    Refraktor (31.03.2017)
  3. #22
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Обновил реализацию функции: внесены новые оптимизации, исправлена проблема с const-корректностью (аргумент "name" был объявлен без const), добавлен тег bool для возвращаемого значения.
    Также эксперимента ради набросал улучшенную версию с использованием оператора emit, которая работает в ~1.5 раза (~2 с JIT) быстрее обычной реализации.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. #23
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Обновил реализацию функции: внесены новые оптимизации, исправлена проблема с const-корректностью (аргумент "name" был объявлен без const), добавлен тег bool для возвращаемого значения.
    Также эксперимента ради набросал улучшенную версию с использованием оператора emit, которая работает в ~1.5 раза (~2 с JIT) быстрее обычной реализации.
    Пора уже делать библиотеку с часто используемыми функциями на emit.

  5. 2 пользователя(ей) сказали cпасибо:
    Elrmrnt-Kritik (15.07.2018) StevenH (15.07.2018)
  6. #24
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Пора уже делать библиотеку с часто используемыми функциями на emit.
    Понимаю твой сарказм, но нет, я не являюсь сторонником перевода всего и вся на emit. Касаемо данной конкретной функции, как я уже сказал, это был простой эксперимент с целью определить, сколько потенциала для оптимизации упускает компилятор. А раз уж сделал что-то и оно хорошо работает, то почему бы и не поделиться?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #25
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Понимаю твой сарказм, но нет, я не являюсь сторонником перевода всего и вся на emit. Касаемо данной конкретной функции, как я уже сказал, это был простой эксперимент с целью определить, сколько потенциала для оптимизации упускает компилятор. А раз уж сделал что-то и оно хорошо работает, то почему бы и не поделиться?
    Хех. Это был не сарказм. Как-то давно проверял, что некоторые функции на #emit работают в несколько раз быстрее, тем более в таймерах. Тыж сам говорил, что компилятор не умеет хорошо оптимизировать код, поэтому нужно делать это вручную.


  8. #26
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Хех. Это был не сарказм. Как-то давно проверял, что некоторые функции на #emit работают в несколько раз быстрее, тем более в таймерах. Тыж сам говорил, что компилятор не умеет хорошо оптимизировать код, поэтому нужно делать это вручную.

    Целенаправленно всё переписывать на них жизни не хватит (а если серьёзно, то просто нецелесообразно)
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  9. #27
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Целенаправленно всё переписывать на них жизни не хватит (а если серьёзно, то просто нецелесообразно)
    Так вроде никто и не предлагает всё переписывать на emit. VVWVV предлагает собрать существующие функции, написанные на emit, в одну библиотеку, дабы можно было просто подключить эту самую библиотеку и пользоваться.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #28
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Так вроде никто и не предлагает всё переписывать на emit. VVWVV предлагает собрать существующие функции, написанные на emit, в одну библиотеку, дабы можно было просто подключить эту самую библиотеку и пользоваться.
    А, ну мне показалось, что речь именно о намеренном переводе чего-либо, что и не имело бы никакого смысла.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  11. #29
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Обновил вариант функции на emit: убрал пару лишних случаев записи в переменную и слегка улучшил код перед возвратом 1 - в итоге получилось выжать ещё примерно на 5% больше производительности (~12% с JIT).

    Настройки для профайлера и результаты:
      Открыть/закрыть

    1. const PROFILER_ITERATIONS_MAJOR = 1_000;
    2. const PROFILER_ITERATIONS_MINOR = 5_000;
    3.  
    4. new const code_snippets_names[][] =
    5. {
    6. {"IsRPNick"},
    7. {"IsRPNickEmitOld"},
    8. {"IsRPNickEmit"}
    9. };
    10.  
    11. stock bool:IsRPNick(const name[])
    12. { // http://pro-pawn.ru/showthread.php?7528
    13. static i, __;
    14. if (('A' <= name[0] <= 'Z' && ('a' <= name[1] <= 'z')))
    15. {
    16. for (i = 1, __ = 0;;)
    17. {
    18. switch (name[++i])
    19. {
    20. case 'a'..'z':
    21. continue;
    22. case '_':
    23. if (__++, 'A' <= name[++i] <= 'Z' && 'a' <= name[++i] <= 'z')
    24. continue;
    25. else
    26. break;
    27. case '\0':
    28. return (i >= 4 && __ == 1);
    29. default:
    30. return false;
    31. }
    32. }
    33. }
    34. return false;
    35. }
    36.  
    37. stock bool:IsRPNickEmitOld(const name[])
    38. { // http://pro-pawn.ru/showthread.php?7528
    39. static num_underscores, ptr;
    40. emit
    41. {
    42. load.s.pri name
    43. load.i
    44. const.alt 'A'
    45. jsless ret_false
    46. const.alt 'Z'
    47. jsgrtr ret_false
    48. load.s.pri name
    49. add.c (cellbits / charbits)
    50. stor.pri ptr
    51. load.i
    52. const.alt 'a'
    53. jsless ret_false
    54. const.alt 'z'
    55. jsgrtr ret_false
    56. zero num_underscores
    57. loop:
    58. load.pri ptr
    59. add.c (cellbits / charbits)
    60. stor.pri ptr
    61. load.i
    62. const.alt 'a'
    63. jsless is_underscore
    64. const.alt 'z'
    65. jsleq loop
    66. is_underscore:
    67. const.alt '_'
    68. jneq is_term
    69. inc num_underscores
    70. load.pri ptr
    71. add.c (cellbits / charbits)
    72. stor.pri ptr
    73. load.i
    74. const.alt 'A'
    75. jsless ret_false
    76. const.alt 'Z'
    77. jsgrtr ret_false
    78. load.pri ptr
    79. add.c (cellbits / charbits)
    80. stor.pri ptr
    81. load.i
    82. const.alt 'a'
    83. jsless ret_false
    84. const.alt 'z'
    85. jsleq loop
    86. jump ret_false
    87. is_term:
    88. jnz ret_false
    89. load.pri ptr
    90. load.s.alt name
    91. sub
    92. const.alt (cellbits / charbits * 4)
    93. jsless ret_false
    94. load.pri num_underscores
    95. const.alt 1
    96. jsless ret_false
    97. const.pri 1
    98. retn
    99. ret_false:
    100. }
    101. return false;
    102. }
    103.  
    104. stock bool:IsRPNickEmit(const name[])
    105. { // http://pro-pawn.ru/showthread.php?7528
    106. static num_underscores, ptr;
    107. emit
    108. {
    109. load.s.pri name
    110. load.i
    111. const.alt 'A'
    112. jsless ret_false
    113. const.alt 'Z'
    114. jsgrtr ret_false
    115. load.s.pri name
    116. add.c (cellbits / charbits)
    117. load.i
    118. const.alt 'a'
    119. jsless ret_false
    120. const.alt 'z'
    121. jsgrtr ret_false
    122. zero num_underscores
    123. load.s.pri name
    124. add.c (cellbits / charbits * 2)
    125. jump loop_entry
    126. loop:
    127. load.pri ptr
    128. add.c (cellbits / charbits)
    129. loop_entry:
    130. stor.pri ptr
    131. load.i
    132. const.alt 'a'
    133. jsless is_underscore
    134. const.alt 'z'
    135. jsleq loop
    136. is_underscore:
    137. const.alt '_'
    138. jneq is_term
    139. inc num_underscores
    140. load.pri ptr
    141. add.c (cellbits / charbits)
    142. load.i
    143. const.alt 'A'
    144. jsless ret_false
    145. const.alt 'Z'
    146. jsgrtr ret_false
    147. load.pri ptr
    148. add.c (cellbits / charbits * 2)
    149. stor.pri ptr
    150. load.i
    151. const.alt 'a'
    152. jsless ret_false
    153. const.alt 'z'
    154. jsleq loop
    155. jump ret_false
    156. is_term:
    157. jnz ret_false
    158. load.pri ptr
    159. load.s.alt name
    160. sub
    161. const.alt (cellbits / charbits * 4)
    162. jsless ret_false
    163. load.pri num_underscores
    164. const.alt 1
    165. eq
    166. retn
    167. ret_false:
    168. }
    169. return false;
    170. }
    171.  
    172. static const nicks[][] =
    173. {
    174. /* 50 valid nicks */
    175. "Maurice_Young",
    176. "Leonard_Cooper",
    177. "Norman_Allen",
    178. "Charles_Lopez",
    179. "Larry_Martin",
    180. "Vince_Stewart",
    181. "Leonard_Clark",
    182. "Matthew_Morgan",
    183. "Hunter_Rodriguez",
    184. "Charles_Wright",
    185. "Tobias_Nelson",
    186. "Vince_Harris",
    187. "Aaron_Wright",
    188. "Charles_Morris",
    189. "Alex_Young",
    190. "Robert_Hill",
    191. "Vince_Hernandez",
    192. "Colin_Edwards",
    193. "Jack_Lee",
    194. "Leonard_Johnson",
    195. "Justin_Taylor",
    196. "Aaron_Allen",
    197. "James_Jackson",
    198. "Ronald_Howard",
    199. "Richard_Campbell",
    200. "Daniel_Brown",
    201. "Zachary_Cooper",
    202. "James_Cooper",
    203. "Chad_Sanchez",
    204. "Miles_Martin",
    205. "Zachary_Anderson",
    206. "Daniel_Cooper",
    207. "James_Lopez",
    208. "Samuel_Lopez",
    209. "Brendan_Roberts",
    210. "James_Thompson",
    211. "Maurice_Harris",
    212. "Brendan_Allen",
    213. "Todd_Smith",
    214. "John_Collins",
    215. "Norman_Jones",
    216. "Eric_Murphy",
    217. "Alex_Garcia",
    218. "Dan_Stewart",
    219. "Mark_Bailey",
    220. "Frank_Garcia",
    221. "Barry_Wilson",
    222. "Barry_Williams",
    223. "Walter_Davis",
    224. "Zachary_Taylor",
    225. /* invalid nicks */
    226. "JonhDoe",
    227. "Johndoe",
    228. "johnDoe",
    229. "John__Doe",
    230. "John_Richard_Doe",
    231. "john_Doe",
    232. "John_doe",
    233. "_",
    234. "J_D",
    235. "_D",
    236. "J_",
    237. "Richard_D",
    238. "R_Doe"
    239. };
    240.  
    241. #define Prerequisites(); \
    242.   static i;
    243.  
    244. #define CodeSnippet0(); \
    245.   for (i = 0; i < sizeof(nicks); ++i) \
    246.   IsRPNick(nicks[i]);
    247.  
    248. #define CodeSnippet1(); \
    249.   for (i = 0; i < sizeof(nicks); ++i) \
    250.   IsRPNickEmitOld(nicks[i]);
    251.  
    252. #define CodeSnippet2(); \
    253.   for (i = 0; i < sizeof(nicks); ++i) \
    254.   IsRPNickEmit(nicks[i]);

    Код:
    Режим: интерпретируемый, 1000x500 итераций.
    IsRPNick: 20781
    IsRPNickEmitOld: 13630
    IsRPNickEmit: 12930
    
    Режим: с JIT-компиляцией, 1000x5000 итераций.
    IsRPNick: 27033
    IsRPNickEmitOld: 14411
    IsRPNickEmit: 12811


    Цитата Сообщение от VVWVV Посмотреть сообщение
    Тыж сам говорил, что компилятор не умеет хорошо оптимизировать код, поэтому нужно делать это вручную.
    Да, но целесообразно такое обычно только для функций, обрабатывающих массивы данных - например, для строковых функций, коей и является IsRPNick().
    Касаемо библиотеки, если собираешься такую делать - я не против включения в неё своей функции, но только при выполнении двух простых условий:
    • Библиотека должна быть выпущена под лицензией, не требующей бинарной аттрибуции. Многие не задумываются при выборе лицензии, почём зря - многие популярные лицензии, такие как MIT, MPL, BSD и пр. требуют от пользователей включать копирайт и текст лицензии в скомпилированный скрипт или таскать их в отдельном текстовом файле вместе с *.amx - хотя, как правило, у самих авторов нет намерения требовать это в обязательном порядке. Одни из немногих лицензий, не требующих бинарной аттрибуции - лицензия zlib, Boost Software License.
    • В функции должен быть сохранён комментарий со ссылкой на данную тему, чтобы пользователи могли узнать её происхождение.


    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Целенаправленно всё переписывать на них жизни не хватит (а если серьёзно, то просто нецелесообразно)
    Если речь про директиву #emit, то там больше проблема в ограничениях (нельзя сделать переход на метку впереди, не поддерживаются инструкции с более чем 1 аргументом) и в том, что очень просто допустить ошибку, которую потом найти затруднительно (например, вместо "load.s.pri local_var" написать "load.pri local_var" или вообще "load.s.pri" без аргумента - компилятор всё это пропустит). При этом с оператором emit эти и многие другие проблемы либо полностью решены, либо сведены к минимуму - можно куда производительнее писать код, не задумываясь об ограничениях или о том, что где-то перепутал инструкцию или тип аргумента.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  12. #30
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Да, но целесообразно такое обычно только для функций, обрабатывающих массивы данных - например, для строковых функций, коей и является IsRPNick().
    Касаемо библиотеки, если собираешься такую делать - я не против включения в неё своей функции, но только при выполнении двух простых условий:
    • Библиотека должна быть выпущена под лицензией, не требующей бинарной аттрибуции. Многие не задумываются при выборе лицензии, почём зря - многие популярные лицензии, такие как MIT, MPL, BSD и пр. требуют от пользователей включать копирайт и текст лицензии в скомпилированный скрипт или таскать их в отдельном текстовом файле вместе с *.amx - хотя, как правило, у самих авторов нет намерения требовать это в обязательном порядке. Одни из немногих лицензий, не требующих бинарной аттрибуции - лицензия zlib, Boost Software License.
    • В функции должен быть сохранён комментарий со ссылкой на данную тему, чтобы пользователи могли узнать её происхождение.
    1. Мы в jabber уже обсуждали эту тему с лицензиями, я это прекрасно помню. Да, и в общем знал об этом, поскольку мои библиотеки использую zlib лицензию.
    2. Ссылки можно разместить в шапке файла, чтобы они не бросались в глаза. Как минимум, это будет говорить, что библиотека - лишь сборник функций, не направленный на конкретную деятельность (как, например, tdw rscan).

 

 
Страница 3 из 4 ПерваяПервая 1 2 3 4 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

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