| 04-12-2008, 09:47 PM | #1 |
I just wanted to tell you all that vJass has finally reached a new level of insanity. So, next version of jasshelper includes two changes: - extended array size limit increased from 60000ish to 400000ish. - Binary split for extended array size. As for the binary split, I decided not to apply it directly, instead it will wait till there are more than 4 or 3 arrays and the remaining arrays are even. This speeds up the execution for low indexes, which are supposedly used more often. I am not sure if this assumption is good*, I might end up adding //! pragma so that you could configure the compiler, but I am leaving that stuff for the project after jasshelper. *The problem is that there are 12 comparison max for 50 arrays. Which is double high in comparison to log_2(50) which is 5.something. Edit: Might try with splitting after 2 comparisons. JASS:scope insane globals private integer array A[400000] endglobals endscope Becomes: JASS:globals integer array s__insane___A integer array s__2insane___A integer array s__3insane___A integer array s__4insane___A integer array s__5insane___A integer array s__6insane___A integer array s__7insane___A integer array s__8insane___A integer array s__9insane___A integer array s__10insane___A integer array s__11insane___A integer array s__12insane___A integer array s__13insane___A integer array s__14insane___A integer array s__15insane___A integer array s__16insane___A integer array s__17insane___A integer array s__18insane___A integer array s__19insane___A integer array s__20insane___A integer array s__21insane___A integer array s__22insane___A integer array s__23insane___A integer array s__24insane___A integer array s__25insane___A integer array s__26insane___A integer array s__27insane___A integer array s__28insane___A integer array s__29insane___A integer array s__30insane___A integer array s__31insane___A integer array s__32insane___A integer array s__33insane___A integer array s__34insane___A integer array s__35insane___A integer array s__36insane___A integer array s__37insane___A integer array s__38insane___A integer array s__39insane___A integer array s__40insane___A integer array s__41insane___A integer array s__42insane___A integer array s__43insane___A integer array s__44insane___A integer array s__45insane___A integer array s__46insane___A integer array s__47insane___A integer array s__48insane___A integer array s__49insane___A integer f__arg_this endglobals function sg__insane___A_get takes integer i returns integer if(i<8191) then return s__insane___A[i] elseif(i<16382) then return s__2insane___A[i-8191] elseif(i<24573) then return s__3insane___A[i-16382] elseif(i<212966) then if(i<32764) then return s__4insane___A[i-24573] elseif(i<40955) then return s__5insane___A[i-32764] elseif(i<49146) then return s__6insane___A[i-40955] elseif(i<131056) then if(i<57337) then return s__7insane___A[i-49146] elseif(i<65528) then return s__8insane___A[i-57337] elseif(i<73719) then return s__9insane___A[i-65528] elseif(i<81910) then return s__10insane___A[i-73719] elseif(i<106483) then if(i<90101) then return s__11insane___A[i-81910] elseif(i<98292) then return s__12insane___A[i-90101] else return s__13insane___A[i-98292] endif else if(i<114674) then return s__14insane___A[i-106483] elseif(i<122865) then return s__15insane___A[i-114674] else return s__16insane___A[i-122865] endif endif else if(i<139247) then return s__17insane___A[i-131056] elseif(i<147438) then return s__18insane___A[i-139247] elseif(i<155629) then return s__19insane___A[i-147438] elseif(i<163820) then return s__20insane___A[i-155629] elseif(i<188393) then if(i<172011) then return s__21insane___A[i-163820] elseif(i<180202) then return s__22insane___A[i-172011] else return s__23insane___A[i-180202] endif else if(i<196584) then return s__24insane___A[i-188393] elseif(i<204775) then return s__25insane___A[i-196584] else return s__26insane___A[i-204775] endif endif endif else if(i<221157) then return s__27insane___A[i-212966] elseif(i<229348) then return s__28insane___A[i-221157] elseif(i<237539) then return s__29insane___A[i-229348] elseif(i<319449) then if(i<245730) then return s__30insane___A[i-237539] elseif(i<253921) then return s__31insane___A[i-245730] elseif(i<262112) then return s__32insane___A[i-253921] elseif(i<270303) then return s__33insane___A[i-262112] elseif(i<294876) then if(i<278494) then return s__34insane___A[i-270303] elseif(i<286685) then return s__35insane___A[i-278494] else return s__36insane___A[i-286685] endif else if(i<303067) then return s__37insane___A[i-294876] elseif(i<311258) then return s__38insane___A[i-303067] else return s__39insane___A[i-311258] endif endif else if(i<327640) then return s__40insane___A[i-319449] elseif(i<335831) then return s__41insane___A[i-327640] elseif(i<344022) then return s__42insane___A[i-335831] elseif(i<352213) then return s__43insane___A[i-344022] elseif(i<376786) then if(i<360404) then return s__44insane___A[i-352213] elseif(i<368595) then return s__45insane___A[i-360404] else return s__46insane___A[i-368595] endif else if(i<384977) then return s__47insane___A[i-376786] elseif(i<393168) then return s__48insane___A[i-384977] else return s__49insane___A[i-393168] endif endif endif endif endfunction function sg__insane___A_set takes integer i,integer v returns nothing if(i<8191) then set s__insane___A[i]=v elseif(i<16382) then set s__2insane___A[i-8191]=v elseif(i<24573) then set s__3insane___A[i-16382]=v elseif(i<212966) then if(i<32764) then set s__4insane___A[i-24573]=v elseif(i<40955) then set s__5insane___A[i-32764]=v elseif(i<49146) then set s__6insane___A[i-40955]=v elseif(i<131056) then if(i<57337) then set s__7insane___A[i-49146]=v elseif(i<65528) then set s__8insane___A[i-57337]=v elseif(i<73719) then set s__9insane___A[i-65528]=v elseif(i<81910) then set s__10insane___A[i-73719]=v elseif(i<106483) then if(i<90101) then set s__11insane___A[i-81910]=v elseif(i<98292) then set s__12insane___A[i-90101]=v else set s__13insane___A[i-98292]=v endif else if(i<114674) then set s__14insane___A[i-106483]=v elseif(i<122865) then set s__15insane___A[i-114674]=v else set s__16insane___A[i-122865]=v endif endif else if(i<139247) then set s__17insane___A[i-131056]=v elseif(i<147438) then set s__18insane___A[i-139247]=v elseif(i<155629) then set s__19insane___A[i-147438]=v elseif(i<163820) then set s__20insane___A[i-155629]=v elseif(i<188393) then if(i<172011) then set s__21insane___A[i-163820]=v elseif(i<180202) then set s__22insane___A[i-172011]=v else set s__23insane___A[i-180202]=v endif else if(i<196584) then set s__24insane___A[i-188393]=v elseif(i<204775) then set s__25insane___A[i-196584]=v else set s__26insane___A[i-204775]=v endif endif endif else if(i<221157) then set s__27insane___A[i-212966]=v elseif(i<229348) then set s__28insane___A[i-221157]=v elseif(i<237539) then set s__29insane___A[i-229348]=v elseif(i<319449) then if(i<245730) then set s__30insane___A[i-237539]=v elseif(i<253921) then set s__31insane___A[i-245730]=v elseif(i<262112) then set s__32insane___A[i-253921]=v elseif(i<270303) then set s__33insane___A[i-262112]=v elseif(i<294876) then if(i<278494) then set s__34insane___A[i-270303]=v elseif(i<286685) then set s__35insane___A[i-278494]=v else set s__36insane___A[i-286685]=v endif else if(i<303067) then set s__37insane___A[i-294876]=v elseif(i<311258) then set s__38insane___A[i-303067]=v else set s__39insane___A[i-311258]=v endif endif else if(i<327640) then set s__40insane___A[i-319449]=v elseif(i<335831) then set s__41insane___A[i-327640]=v elseif(i<344022) then set s__42insane___A[i-335831]=v elseif(i<352213) then set s__43insane___A[i-344022]=v elseif(i<376786) then if(i<360404) then set s__44insane___A[i-352213]=v elseif(i<368595) then set s__45insane___A[i-360404]=v else set s__46insane___A[i-368595]=v endif else if(i<384977) then set s__47insane___A[i-376786]=v elseif(i<393168) then set s__48insane___A[i-384977]=v else set s__49insane___A[i-393168]=v endif endif endif endif endfunction So, if anyone is crazy enough to require 400K array indexes and is able to make a system using them that doesn't hit the limit op, you shall feel better... -- Edit: If anyone needs a quick vJass fix, I might be able to implement it, if I don't get any report about something like that in 2 hours I am going to upload 0.9.9.B |
| 04-12-2008, 10:01 PM | #2 |
I'm not sure if this bug has been reported yet but: Code:
scope Zzz initializer Init
private function Init takes nothing returns nothing
endfunction
endscope
scope Zzz2 initializer Init
private function Init takes nothing returns nothing
endfunction
endscopeCode:
Syntax Error: call Zzz___Init()call Zzz2___Init() Awesome changes, by the way. ![]() |
| 04-12-2008, 10:06 PM | #3 |
The reason I decided to do this change, was actually that I found out that bug with scopes, and needed a better reason to release than such embarrassing bug. |
| 04-12-2008, 10:10 PM | #4 |
All I can say is.... Awesome, but I wanna try looping through that array looking for 1 value :D Btw, Cohadars EA got owned :P |
| 04-12-2008, 10:18 PM | #5 | |
Quote:
Assimilated is a better word. Anyways, this thing with the array [size] was implemented a couple of weeks ago already, I am just introducing a much bigger limit and the binary split. Btw JASS:struct sok[400000] integer a //and other 30 members. endstruct 400K is unrealistic, but I said to myself, that if such a large value is possible, why not let people use it? Something more realistic would be 100000 or even 20000. |
| 04-12-2008, 10:20 PM | #6 |
at least... =) now add define xD + 100% it need some extra identifier maybe bin ? integer bin array A[400000] ??? so it would make it bin otherwise phail or set back to 60K. |
| 04-12-2008, 10:21 PM | #7 |
bin? Edit: Ah, you want to make it optional? Then I really would need pragma. Anyways, since split is not too aggressive, it doesn't affect it a lot for low sizes like 60000: JASS:
if(i<8191) then
return s__Terror__Vx[i]
elseif(i<16382) then
return s__2Terror__Vx[i-8191]
elseif(i<40955) then
if(i<24573) then
return s__3Terror__Vx[i-16382]
elseif(i<32764) then
return s__4Terror__Vx[i-24573]
else
return s__5Terror__Vx[i-32764]
endif
else
if(i<49146) then
return s__6Terror__Vx[i-40955]
elseif(i<57337) then
return s__7Terror__Vx[i-49146]
else
return s__8Terror__Vx[i-57337]
endif
endifJust an extra comparison and it limits the number of necessary operations to 6 down from 8. Tc, do you really need define? Or would you accept anything that allows inlining? |
| 04-12-2008, 10:25 PM | #8 |
What about this: JASS:type int extends integer array [65255] I was just thinking about it because with the new bigger arrays you could fit up to 400000/4 in your own types. (If you wanna follow how it works with normal arrays and your types.) |
| 04-12-2008, 10:33 PM | #9 |
Right now you can make JASS:type int extends integer array [2000, 60000] 2000 is the size of each instance, and 60000 the storage limit, so you can have 30 instances of size 2000 I am improving the limit to JASS:type int extends integer array [12000, 400000] Which is quite massive. |
| 04-12-2008, 10:50 PM | #10 | |
Quote:
JASS://! define lol " call echo(%)" // will allows spaces and if it would allow line breaks so it would be uber pawning but i think not. OR could you procces "\n","|n" ? like "blab bla \n blablba" would be "blab bla blablba" after it's inlined. and yes the useage would be like that lol(var_message) and the result would be call echo(var_message) // it's just an example about the bin arrays... in truth after 2 arrays bin split (tree) would be faster. so you can do it automaticly. |
| 04-12-2008, 10:55 PM | #11 | |
Your new define looks like a line textmacro. Perhaps it is easier to implement it based of the work in text macros. Do you need nesting for this? Quote:
|
| 04-12-2008, 11:04 PM | #12 | ||
Quote:
Quote:
|
| 04-12-2008, 11:09 PM | #13 | |
Quote:
nesting: JASS:// temp syntax, hopefuly changes: //! define cook(a,b,c) { $c$$a$ $b$ } //! define cook2(a) { cook(a,a,a) cook(a,a,a) } |
| 04-12-2008, 11:15 PM | #14 |
yes what i thought ^^ well ok i like it =) |
| 04-12-2008, 11:43 PM | #15 |
Awesome, fast access databases FTW |
