[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 из моих любимых аккаунтов в гарене, сучонок?)
|
|
|
|