| 
				
				[JASS] Альтернативный урок 3. Функции
				 | 
				
			  | 
| Ty3uK | Дата: Суббота, 13 Апреля 2013, 13:34:42 | Сообщение # 51 |  
 
Группа: Ветераны 
Сообщений: 6125 
Награды:  2 
Репутация:  1617 
Блокировки:    
 
 | Цитата (dredsss) Функция, которая убивает все живое  
  
 |  
|   | 
 |   
  | 
| Волчачка | Дата: Суббота, 13 Апреля 2013, 13:41:15 | Сообщение # 52 |  
 
САЙТ УМЕР ППЦ
Группа: Проверенные 
Сообщений: 1361 
Награды:  0 
Репутация:  2165 
Блокировки:    
 
  | Ty3uK, я разве убиваю всё живое?
 |  
|   | 
 |   
  | 
| Ty3uK | Дата: Суббота, 13 Апреля 2013, 13:50:32 | Сообщение # 53 |  
 
Группа: Ветераны 
Сообщений: 6125 
Награды:  2 
Репутация:  1617 
Блокировки:    
 
 | Ну, видимо именно такие ассоциации есть в голове у некоторых людей.  
  
 |  
|   | 
 |   
  | 
| Волчачка | Дата: Суббота, 13 Апреля 2013, 13:52:17 | Сообщение # 54 |  
 
САЙТ УМЕР ППЦ
Группа: Проверенные 
Сообщений: 1361 
Награды:  0 
Репутация:  2165 
Блокировки:    
 
  | Цитата (Ty3uK) Ну, видимо именно такие ассоциации есть в голове у некоторых людей.     Очень интересно.   Alice, почему именно я?
 |  
|   | 
 |   
  | 
| Мона | Дата: Воскресенье, 21 Апреля 2013, 22:42:13 | Сообщение # 55 |  
1 уровень
 
Группа: Пользователи 
Сообщений: 10 
Награды:  0 
Репутация:  0 
Блокировки:    
 
 | //без домыслов   Цитата (H_A_PK) т.е. поток всё таки 1?      call ExecuteFunc(<ВЫРАЖЕНИЕ>)   Создается новый поток; текущий прерывается.   ------------------------------------------      При трансляции в объектный код, условный оператор кодируется четырьмя командами:   Код if then       <истинная ветка>   else       <ложная ветка>   endif 
   IFNOTJUMP   <истинная ветка>   JUMP   LABEL   <ложная ветка>   LABEL     Даже если в обеих ветках нет операторов и убран else, все равно создаются эти четыре команды.   Как при истинном так и при ложном условии, условный оператор отнимает 3 действия, 10мкс.Добавлено (21 Апреля 2013, 22:42:13) --------------------------------------------- А вот такой алгоритм для обыкновенного сложения: set var1=var1+va2 (или var1+=var2)    Код Скопировать переменную var1 в регистр интерпретатора r1   Толкнуть регистр r1 интерпретатора в стек   Скопировать переменную va2 в регистр интерпретатора r2   Извлечь из стека в регистр интерпретатора r3   r3=r3+r2   Скопировать из регистра интерпретатора r3 в переменную var1     6 действий.
 |  
|   | 
 |   
  | 
| BlackFox | Дата: Воскресенье, 21 Апреля 2013, 23:19:57 | Сообщение # 56 |  
3 уровень
 
Группа: Проверенные 
Сообщений: 52 
Награды:  0 
Репутация:  25 
Блокировки:    
 
 | Мона, на уровне ассемблера? Добавлено (21 Апреля 2013, 23:19:57) --------------------------------------------- if then endif vs if then else endif 
    Код function Test1 takes nothing returns nothing   local integer i = 0   loop   set i = i + 1   if not false then   call BJDebugMsg(I2S(i))   endif   endloop   //809   endfunction   function Test2 takes nothing returns nothing   local integer i = 0   loop   set i = i + 1   if false then   else   call BJDebugMsg(I2S(i))   endif   endloop   //811   endfunction   function Test3 takes nothing returns nothing   local integer i = 0   loop   set i = i + 1   if false>== false then   call BJDebugMsg(I2S(i))   endif   endloop   //803   endfunction  
  
SirNikolas падёт в неравном бою с брутфорсом, Alice. 
 |  
|   | 
 |   
  | 
| Мона | Дата: Вторник, 23 Апреля 2013, 20:34:40 | Сообщение # 57 |  
1 уровень
 
Группа: Пользователи 
Сообщений: 10 
Награды:  0 
Репутация:  0 
Блокировки:    
 
 | Duosora, ты где там?
 |  
|   | 
 |   
  | 
| Волчачка | Дата: Вторник, 23 Апреля 2013, 20:36:54 | Сообщение # 58 |  
 
САЙТ УМЕР ППЦ
Группа: Проверенные 
Сообщений: 1361 
Награды:  0 
Репутация:  2165 
Блокировки:    
 
  | Мона, сие господин, позову его.
 |  
|   | 
 |   
  | 
| Duosora | Дата: Вторник, 23 Апреля 2013, 20:37:55 | Сообщение # 59 |  
| 
 The cats never sleep... 
Группа: Ветераны 
Сообщений: 6734 
Награды:  10 
Репутация:  2161 
Блокировки:    
 
 | Это были мои тесты.
  
Не зли других и сам не злись.   Мы - гости в этом мире.   И если что не так - смирись,   Будь поумнее - улыбнись,   Ведь в мире всё закономерно.   Зло, излучённое тобой,   К тебе вернётся непременно. 
 |  
|   | 
 |   
  | 
| Мона | Дата: Вторник, 23 Апреля 2013, 20:41:00 | Сообщение # 60 |  
1 уровень
 
Группа: Пользователи 
Сообщений: 10 
Награды:  0 
Репутация:  0 
Блокировки:    
 
 | Да? И каков результат? Добавлено (23 Апреля 2013, 20:41:00) --------------------------------------------- Под какими выводами из тестов ты подпишешься? 
 |  
|   | 
 |   
  | 
| Ty3uK | Дата: Вторник, 23 Апреля 2013, 20:44:16 | Сообщение # 61 |  
 
Группа: Ветераны 
Сообщений: 6125 
Награды:  2 
Репутация:  1617 
Блокировки:    
 
 | Не думаю, что тесты твои - ты расставляешь отступы всегда.  
  
 |  
|   | 
 |   
  | 
| Duosora | Дата: Вторник, 23 Апреля 2013, 20:49:53 | Сообщение # 62 |  
| 
 The cats never sleep... 
Группа: Ветераны 
Сообщений: 6734 
Награды:  10 
Репутация:  2161 
Блокировки:    
 
 | Ty3uK,   Это кое-чья редакция моих тестов. На Терноксе оригиналы.  
  
Не зли других и сам не злись.   Мы - гости в этом мире.   И если что не так - смирись,   Будь поумнее - улыбнись,   Ведь в мире всё закономерно.   Зло, излучённое тобой,   К тебе вернётся непременно. 
 |  
|   | 
 |   
  | 
| Ty3uK | Дата: Вторник, 23 Апреля 2013, 21:10:35 | Сообщение # 63 |  
 
Группа: Ветераны 
Сообщений: 6125 
Награды:  2 
Репутация:  1617 
Блокировки:    
 
 | Duosora, на терноксе в первом примере тоже отступов нет.
  
 |  
|   | 
 |   
  | 
| Мона | Дата: Среда, 24 Апреля 2013, 20:18:18 | Сообщение # 64 |  
1 уровень
 
Группа: Пользователи 
Сообщений: 10 
Награды:  0 
Репутация:  0 
Блокировки:    
 
 | Ty3uK, это его тесты. Только он их не проводил, потому что   if false>== false then и if GetWidgetLife(u,UNIT_STATE_LIFE) > 0. then   ему не позволили.   А еще он таки купился на всю мою хню в этой теме. Он поверил, что количество итераций цикла, исчерпывающих лимит операций, показывают скорость выполнения тела цикла. Зря. Теперь наконец-то доказано, что Дуос - программист, слепо следующий чужим инструкциям. 
   На самом деле в #28 и #49 написано вранье, близкое к правде, и провокация. Сосчитав количество итераций, легко определить, на какое количество команд объектного кода распадается тело цикла. И только; это не производительность. 
   Чтобы определить скорость выполнения jass кода, в реальных условиях, со всеми кешами L1 L2 L3 L4, со всеми передергиваниями оси, не оттраханного гринморем вара, нужно: или засекать секундомером что-то на подобие этого   Код call DisplayTimedTextToPlayer(Player(0),0,0,20,"start")       call Sleep(0.1)       loop           set lIz = 0           loop               exitwhen lIz == 10000               //               set lIz = lIz +1           endloop           call Sleep(0.001)           set lIIz = lIIz+ 1           exitwhen lIIz == 1000       endloop       call DisplayTimedTextToPlayer(Player(0),0,0,20,"stop")     (можно Кингу пожелать),   или читать системное время через самописный инъект,   или считать количество тактов проца через самописный инъект.   Во всех трех случаях получается погрешность ~10%. Последний способ самый простой. В game.dll есть подпрограмма:   Код .text:6F5277D0 sub_6F5277D0    proc near               ; CODE XREF: sub_6F527E90+83   .text:6F5277D0                 rdtsc   .text:6F5277D2                 retn   .text:6F5277D2 sub_6F5277D0    endp     она ничего не принимает, а возвращает младшие 32 бита от количества процессорных тактов, натикавших с последнего ресета. (старшие херятся в EDX)   Еще есть нативка   native GetAllyColorFilterState takes nothing returns integer   , проживающая по адресу 6F3B3A50h. Заменив с помощью HEX-редактора всего три байта(game.dll[v1.26a]:3d84c8h: 50h 3ah 3bh 6fh -> d0h 77h 52h 6fh), получаем самописный бенч.   Код function Trig_B_Actions takes nothing returns nothing       local integer lAz = 0       set lAz = GetAllyColorFilterState()   //       set lAz = GetAllyColorFilterState()-lAz       call DisplayTextToPlayer(Player(0),0,0,I2S(lAz))   endfunction     Только поправку на вызов GetAllyColorFilterState не забыть бы.   У меня приведенный пример вывел: 1521, 1808, 1425, 1601, 1629, 1756, 1518, 1443, 1722, 1499, 1852, 1678(i7-2800K). Разброс, главным образом, обусловлен кешированием.   PS   if GetWidgetLife(u,UNIT_STATE_LIFE) > 0. then\n endif   if IsUnitType(u,UNIT_TYPE_DEAD) then\n else\n endif   с точностью до погрешности измерений выполняются за одинаковое время:8000 тактов   not выполнется ~ 700 тактов.
 |  
|   | 
 |   
  | 
| Ty3uK | Дата: Среда, 24 Апреля 2013, 20:46:09 | Сообщение # 65 |  
 
Группа: Ветераны 
Сообщений: 6125 
Награды:  2 
Репутация:  1617 
Блокировки:    
 
 | Мона, ого, а вот это круто.   Вообще, я тоже засомневался с бенчмарка циклом, ибо на хгм все бенчи делают в таймере.  
  
 |  
|   | 
 |   
  | 
| Волчачка | Дата: Среда, 24 Апреля 2013, 21:29:45 | Сообщение # 66 |  
 
САЙТ УМЕР ППЦ
Группа: Проверенные 
Сообщений: 1361 
Награды:  0 
Репутация:  2165 
Блокировки:    
 
  | Мой господин очень остроумен? Иль же это новый вызов дуосу?   Цитата (Мона) А еще он таки купился на всю мою фигню в этой теме.     Может быть на две фигни? :D   Нельзя просто так и узнать точное время выполнения операций, это ещё и от мощности самого процессора зависит, который обрабатывает эти данные. Разве аппаратная часть тоже не влияет?   Цитата (Мона) можно Кингу пожелать     Нет.   PS: Алиса из страны чудес показала истинные чудеса дуосу. Что же ответит дуос?
 |  
|   | 
 |   
  | 
| Daro | Дата: Среда, 24 Апреля 2013, 21:51:45 | Сообщение # 67 |  
 
6 уровень
 
Группа: Проверенные 
Сообщений: 217 
Награды:  0 
Репутация:  105 
Блокировки:    
 
 | Хорошая статья,только разбираться долго
  
 |  
|   | 
 |   
  | 
| Волчачка | Дата: Среда, 24 Апреля 2013, 22:56:46 | Сообщение # 68 |  
 
САЙТ УМЕР ППЦ
Группа: Проверенные 
Сообщений: 1361 
Награды:  0 
Репутация:  2165 
Блокировки:    
 
  | Даро, это вовсе не статья, а урок от пользователя Alice.   Вообще интересная.
 |  
|   | 
 |   
  | 
| Ty3uK | Дата: Среда, 24 Апреля 2013, 23:09:38 | Сообщение # 69 |  
 
Группа: Ветераны 
Сообщений: 6125 
Награды:  2 
Репутация:  1617 
Блокировки:    
 
 | Волчачка, было сказано выше, что интерпретатор должен выполнять команды с приблизительно одинаковой скоростью на почти любом железе.
  
 |  
|   | 
 |   
  | 
| Волчачка | Дата: Четверг, 25 Апреля 2013, 00:08:17 | Сообщение # 70 |  
 
САЙТ УМЕР ППЦ
Группа: Проверенные 
Сообщений: 1361 
Награды:  0 
Репутация:  2165 
Блокировки:    
 
  |       Ну тут всё ясно. 
   А так по сути, я имел ввиду по другое, а в общем неважно. 
   Добавлено (25 Апреля 2013, 00:08:17)   ---------------------------------------------   Цитата (Ty3uK) Волчачка, было сказано выше, что интерпретатор должен выполнять команды с приблизительно одинаковой скоростью на почти любом железе.      Помнишь говорили поточности вара. Ну это не важно.   А так если подумать.   Допустим есть события и действия с условиями. События и Действия Допустим два взаимосвязанных псевдопотока.   Помнишь тот мой тест с получением урона, где я ломал общий поток.   Т.е. там присутствует последовательное выполнение операций с неким сдвигом. Например: Если будет два таймера и они будут выполнять одну и туже операцию. Выполнят они их одинаково, но с очень мизерной разницей во времени, почему?   А Элис показал выполнение самой операции а не общее выполнение. 
   Алис, а Алис? А ты действительно хочешь дуосу устроить сказку?
 
 Сообщение отредактировал Волчачка - Четверг, 25 Апреля 2013, 00:09:26  |  
|   | 
 |   
  | 
| lawson | Дата: Четверг, 25 Апреля 2013, 00:54:54 | Сообщение # 71 |  
| 
 Группа: Проверенные 
Сообщений: 3482 
Награды:  0 
Репутация:  974 
Блокировки:    
 
 | ктонибудь вообще знает почему некоторые функции требуют для выполнения время а некоторые не ждут выполнения - просто вызываются.   Например в АС была такая фунцкия по загрузке xml документа, нужен был чтото типа таймера чтобы узнать загружен ли xml документ.
  
Nic nie wiem bo mam chuj.   редактирую посты! ВСЕ! 
 |  
|   | 
 |   
  | 
| Волчачка | Дата: Четверг, 25 Апреля 2013, 01:05:58 | Сообщение # 72 |  
 
САЙТ УМЕР ППЦ
Группа: Проверенные 
Сообщений: 1361 
Награды:  0 
Репутация:  2165 
Блокировки:    
 
  | lawson, может быть потому, что в некоторых функциях применяются стеки.
 
 Сообщение отредактировал Волчачка - Четверг, 25 Апреля 2013, 01:06:16  |  
|   | 
 |   
  | 
| Ty3uK | Дата: Четверг, 25 Апреля 2013, 10:19:01 | Сообщение # 73 |  
 
Группа: Ветераны 
Сообщений: 6125 
Награды:  2 
Репутация:  1617 
Блокировки:    
 
 | Причем здесь стек? Пуш в стек занимает ничтожно малое количество времени. Добавлено (25 Апреля 2013, 10:19:01) --------------------------------------------- Хотя, конечно, зависит от самого объекта, но все же. 
  
 |  
|   | 
 |   
  | 
| Волчачка | Дата: Четверг, 25 Апреля 2013, 14:08:49 | Сообщение # 74 |  
 
САЙТ УМЕР ППЦ
Группа: Проверенные 
Сообщений: 1361 
Награды:  0 
Репутация:  2165 
Блокировки:    
 
  | Ty3uK, ладно. О просто загружает скрипт в буфер и обрабатывает большой массив текста + ещё сравнения и получения значений. Время загрузки ещё зависит от веса\количества полученных данных. Ведь буфер это большой массив данных. Отличается же от строкового в 0..255
 |  
|   | 
 |   
  | 
| Naturekid | Дата: Четверг, 25 Апреля 2013, 19:59:18 | Сообщение # 75 |  
| 
 Группа: Заблокированные 
Сообщений: 4982 
Награды:  3 
Репутация:  3347 
Блокировки:    
 
 | Волчачка, твоя наглая рожа ломанула 1 из моих любимых аккаунтов в гарене, сучонок?)
  
 |  
|   | 
 |   
  |