Добавлено (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.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
Ty3uK, Это кое-чья редакция моих тестов. На Терноксе оригиналы.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
Ty3uK, это его тесты. Только он их не проводил, потому что if false>== false then и if GetWidgetLife(u,UNIT_STATE_LIFE) > 0. then ему не позволили. А еще он таки купился на всю мою хню в этой теме. Он поверил, что количество итераций цикла, исчерпывающих лимит операций, показывают скорость выполнения тела цикла. Зря. Теперь наконец-то доказано, что Дуос - программист, слепо следующий чужим инструкциям.
На самом деле в #28 и #49 написано вранье, близкое к правде, и провокация. Сосчитав количество итераций, легко определить, на какое количество команд объектного кода распадается тело цикла. И только; это не производительность.
Чтобы определить скорость выполнения jass кода, в реальных условиях, со всеми кешами L1 L2 L3 L4, со всеми передергиваниями оси, не оттраханного гринморем вара, нужно: или засекать секундомером что-то на подобие этого
(можно Кингу пожелать), или читать системное время через самописный инъект, или считать количество тактов проца через самописный инъект. Во всех трех случаях получается погрешность ~10%. Последний способ самый простой. В game.dll есть подпрограмма:
она ничего не принимает, а возвращает младшие 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 тактов.
Мой господин очень остроумен? Иль же это новый вызов дуосу?
Цитата (Мона)
А еще он таки купился на всю мою фигню в этой теме.
Может быть на две фигни? :D Нельзя просто так и узнать точное время выполнения операций, это ещё и от мощности самого процессора зависит, который обрабатывает эти данные. Разве аппаратная часть тоже не влияет?
Цитата (Мона)
можно Кингу пожелать
Нет. PS: Алиса из страны чудес показала истинные чудеса дуосу. Что же ответит дуос?
А так по сути, я имел ввиду по другое, а в общем неважно.
Добавлено (25 Апреля 2013, 00:08:17) ---------------------------------------------
Цитата (Ty3uK)
Волчачка, было сказано выше, что интерпретатор должен выполнять команды с приблизительно одинаковой скоростью на почти любом железе.
Помнишь говорили поточности вара. Ну это не важно. А так если подумать. Допустим есть события и действия с условиями. События и Действия Допустим два взаимосвязанных псевдопотока. Помнишь тот мой тест с получением урона, где я ломал общий поток. Т.е. там присутствует последовательное выполнение операций с неким сдвигом. Например: Если будет два таймера и они будут выполнять одну и туже операцию. Выполнят они их одинаково, но с очень мизерной разницей во времени, почему? А Элис показал выполнение самой операции а не общее выполнение.
Алис, а Алис? А ты действительно хочешь дуосу устроить сказку?
Сообщение отредактировал Волчачка - Четверг, 25 Апреля 2013, 00:09:26
ктонибудь вообще знает почему некоторые функции требуют для выполнения время а некоторые не ждут выполнения - просто вызываются. Например в АС была такая фунцкия по загрузке xml документа, нужен был чтото типа таймера чтобы узнать загружен ли xml документ.
кто ж виноват, что ты приём лс отключил. боишься, что тебя будут огорашивать внезапными сообщениями с матами, как это ты делал что ли? Да никому ты не нужен я даже твои мультиакки в ответ не материл.
Naturekid, парнишка, они лишь куклы, не мультиакки. И кстати, Мистер П. не мультиак и не кукла, а настоящий пользователь. Не этому учили детей природы, с куклами играть и чай пить в беседке.
Цитата (Naturekid)
кто ж виноват, что ты приём лс отключил.
Я отключил потому, что всё заканчивается на у.
Цитата (Naturekid)
боишься, что тебя будут огорашивать внезапными сообщениями с матами, как это ты делал что ли?
Нет.
Цитата (Naturekid)
Да никому ты не нужен я даже твои мультиакки в ответ не материл.
class king { public: int x; int y; int GetX(); int GetY(); void SetX(int val); void SetY(int val); };
int king::GetX() { return king::x; }
int king::GetY() { return king::y; }
void king::SetX(int val) { king::x=val; }
void king::SetY(int val) { king::y=val; } }
main.cpp
Код
#include <iostream> #include "kingmaximaxclass.h" using namespace std; using namespace kingmaximaxpack; int i_pow( int a, int b) { int r = 1; if (b > 0) { for(int i=0;i<b;i++) { r=r*a; } return r; } else { return r; } }
void main() { int z = 1*i_pow(2,5)+1*i_pow(2,4)+0*i_pow(2,3)+0*i_pow(2,2)+1*i_pow(2,1)+1*i_pow(2,0); int x,y; king k; if (z == 51) { cout<<"Excellent! "<<endl; } else { cout<<"Abomination! "<<endl; } cout<<"Enter x: ";cin>>x;cout<<endl; cout<<"Enter y: ";cin>>y;cout<<endl; k.SetX(x);k.SetY(y); cout<<"test class king x,y: "<<k.GetX()<<","<<k.GetY()<<endl; system("pause"); }
Сделал небольшую разминку на C++, так как стало скучно. Правда я ещё не рассмотрел работу с DirectX.. ну это очень позже. Меня лишь сие интересуют dll и чтение файлов.
namespace kingmaximaxpack { class king { int x, y;
public: int GetX() const; int GetY() const; int SetX(int); int SetY(int); }; }
Код
//king.cpp: #include "king.h"
namespace kingmaximaxpack { int king::GetX() const { return x /*Или this->x*/; } int king::GetY() const { return y; } int king::SetX(int val) { return x = val; } int king::SetY(int val) { return y = val; } }
Код
long long i_pow(long long base, long long exp) { static const int MOD = (int)1e9 + 7; if (exp < 0) return 0LL;//Возведение-то целочисленное. long long result = 1LL; while (exp) { if (exp & 1LL) { result = result * base % MOD; } exp >>= 1; base = base * base % MOD; } return result; }