Jump to content

Recommended Posts

Posted (edited)

ConcurrentDictionary is similar to ConcurrentHashMap ? Cause atm you simply need a HashMap, as you simply use it to check, and that map is fed normally only once (and content never replaced, removed or edited anew).

 

You obviously didn't noticed that he creates and runs a new thread for handling and running a dumb client request (they may come as thousands per second on a decent server), so I guess optimization and efficieny is the least of his concerns for now at least, his just making things that should work no matter the cost.

Edited by xxdem
Posted

Threadhandling and concurrency and async tasks is handled differently in CLR than JVM so you cant compare it.

 

My thread will be disposed in milliseconds once its executed. If the call was synchronous i would have performance issues.

 

All of those thread will be handled by enqueue eventually if they need to.

Posted (edited)

You obviously didn't noticed that he creates and runs a new thread for handling and running a dumb client request (they may come as thousands per second on a decent server), so I guess optimization and efficieny is the least of his concerns for now at least, his just making things that should work no matter the cost.

 

Until I missed the point, the map is used as a static checker for packet opcode and class reference, nothing else.

 

It worked fine before. I don't see the use of replacement, except winning 200 lines (at best and only for GS) on a never edited class.

 

----

 

K then, if it's differently handled. I clearly doubt concurrent is better performance than a simple switch = new object though. It must perform similar anyway.

Edited by Tryskell
Posted

Until I missed the point, the map is used as a static checker for packet opcode and class reference, nothing else.

 

It worked fine before. I don't see the use of replacement, except winning 200 lines (at best and only for GS) on a never edited class.

 

----

 

K then, if it's differently handled. I clearly doubt concurrent is better performance than a simple switch = new object though. It must perform similar anyway.

Only time will tell. Forget the concurrent keyword. It is just there because i use a Synchronization attribute in the class .

Technically it could be a simple Dictionary and i will test it that way too as a simple dictionary upon population is almost 2 times faster.

Posted

You obviously didn't noticed that he creates and runs a new thread for handling and running a dumb client request (they may come as thousands per second on a decent server), so I guess optimization and efficieny is the least of his concerns for now at least, his just making things that should work no matter the cost.

Interestingly enough I debugged the threads and yeah they where disposed really fast but I removed them, see how it performs and add a queue if it is needed.

 

About the benchmarking it performs exactly the same (Apart of the initial Dictionary loading which happens on startup anyway) but it is just way more easy to maintain and debug (which is very important for a project that is still adding the packets).

I can add a packet in one line instead of 5 and stepping through the code it way better.

Posted

Interestingly enough I debugged the threads and yeah they where disposed really fast but I removed them, see how it performs and add a queue if it is needed.

 

About the benchmarking it performs exactly the same (Apart of the initial Dictionary loading which happens on startup anyway) but it is just way more easy to maintain and debug (which is very important for a project that is still adding the packets).

I can add a packet in one line instead of 5 and stepping through the code it way better.

 

Just make 2-8 Thread workers and add Client Requests on their Queues, these threads are supposed to sleep a given time and execute from the queue forever.

 

I can tell you many reasons why creating a new thread sucks for every client request one of them and most important from me is that the Player has direct access on your resources both soft and hard, whereas in a worker queue design he can't

Posted

Just make 2-8 Thread workers and add Client Requests on their Queues, these threads are supposed to sleep a given time and execute from the queue forever.

 

I can tell you many reasons why creating a new thread sucks for every client request one of them and most important from me is that the Player has direct access on your resources both soft and hard, whereas in a worker queue design he can't

Yeah Enqueue should be fine. Really glad i got rid of that ugly switch statement. Thanks for the recommendation.

Posted

Yeah Enqueue should be fine. Really glad i got rid of that ugly switch statement. Thanks for the recommendation.

 

the switch statement has nothing to do with that, it was ugly but supper fast. Your design has the overhead of searching every time for the class and then initiating its instance through reflection. I guess its 100x slower but for sure cleaner and the overhead impact is unnoticeable 

Posted

the switch statement has nothing to do with that, it was ugly but supper fast. Your design has the overhead of searching every time for the class and then initiating its instance through reflection. I guess its 100x slower but for sure cleaner and the overhead impact is unnoticeable 

It is as fast as checking a small HashMap for a key value which is technically the same as as switch of the same size.

Posted

It is as fast as checking a small HashMap for a key value which is technically the same as as switch of the same size.

 

Im not talking about the HashMap, HashMap is super fast O(1) in most cases, Im talking about Class.newInstance which most probably is done with reflection on the runtime, I doubt that EnterWorld.class.getConstructor().newInstance() is anything close to "new EnterWorld()" in terms of perfomance

Posted

Im not talking about the HashMap, HashMap is super fast O(1) in most cases, Im talking about Class.newInstance which most probably is done with reflection on the runtime, I doubt that EnterWorld.class.getConstructor().newInstance() is anything close to "new EnterWorld()" in terms of perfomance

It is indeed using reflection but it caches the action so once it's done then it acts the same as new EnterWorld(), because it uses System instead of Reflection to create the instances. But that means that every single packet would have to be created with reflection at least once.

Posted

bWxaYHh.png

 

After some benchmarking it seems that in heavy load (50kk iterations) Activator.CreateInstance is up to 4 times slower (can get higher).

I know that's nothing for l2 but i wanna get as much horsepower as possible so i will be replacing Activator with compiled lambda expressions.

  • 2 weeks later...
Posted

Added the basic implementation of a Plugin API.

 

Simply create a class library on .NET Framework 4.6, extend the Plugin class and override whichever method you want.

Then drop the dll in the plugins folder and thats it.

 

3segxli.png

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



  • Posts

    • Try to add before the row " ; " like in File_52= ;File_52={{[chatfilter.ini];{363E6F64AABB21A81C61E9C89737B84F}}}   [CliExt_Files] Enabled=1 MostrarMensajesConsola=1 ;File_1={{[ALAudio.dll];{9BBF6199558AE72F3CB8C54D4A09009F}} ;File_2={{[Core.dll];{B519540B5F7F5B9153263ECB492E88CC}} ;File_3={{[D3DDrv.dll];{8AB869364379486F220259FA1C6C7D90};{F99D13D552D2E19F5EFD195B264BC2F8}} ;File_4={{[defopenal32.dll];{ECAB7CB66244BFB9FD926ADBDEEB0412}} ;File_5={{[dsetup.dll];{230173F19C0AD3648B455F50C9088EA2}} ;File_6={{[encvag.dll];{DC48574DC8C7B4DF5708A53AF50AFE8A}} ;File_7={{[engine.dll];{BD3F551F5F942CABF7457084E810FD62}} ;File_8={{[Fire.dll];{961D0C1622CC7D41682BA3E2600E62FE}} ;File_9={{[ifc23.dll];{3A1970D3E997B018FBC776560740B95E}} ;File_10={{[IpDrv.dll];{4DCD3F45A05B962B458B13969C5F906B}} ;File_11={{[LineageCreature.dll];{B212DACDECBAB47CC09DB633C232CF18}} ;File_12={{[lineageenv.dll];{3C2506853038560AA66D5DA32DFC795F}} ;File_13={{[msxml4.dll];{7851D6CFA3AA0B41444978F2EAC40FE1}} ;File_14={{[msxml4a.dll];{31AF8904D926B6EDF664E420E0E58865}} ;File_15={{[msxml4r.dll];{644031676F66BC9DBC1989D2F73044E6}} ;File_16={{[nosleep.dll];{E70AFA303842DBA60FF0E8CEFEA3E513}} ;File_17={{[npkcrypt.dll];{A89A8D11CD3C9D8C75B91EA40E3A38FF}} ;File_18={{[npkpdb.dll];{755F8B8BEBC46D524ED232FB46F44575}} ;File_19={{[nwindow.dll];{4AD629893C278777987DA63A2792C6AD};{6C1B532F8FB48657D5BAC6B2944E83B8}} ;File_20={{[ogg.dll];{DB3A7B14F42EE908B966D3E03FB31A44}} ;File_21={{[openal32.dll];{432204FEE4A5CF3D9AF1D518CF135DEF}} ;File_22={{[orc.dll];{292658615568B670CA54CDF0C7F05DA1}} ;File_23={{[vorbis.dll];{991B6CEBEC143D42E2E837A85A67FBC1}} ;File_24={{[vorbisfile.dll];{79DC3FB2408AAFB15A0C7432C3498256}} ;File_25={{[Window.dll];{769B7A97B3EF8693DCEDEF0916005767}} ;File_26={{[WinDrv.dll];{A01CA9CBE89CE9AB665BA4D64CF15865}} ;File_27={{[wrap_oal.dll];{3F4A774BE86425D0FE098F9D82C12DE9}} ;File_28={{[Core.u];{16FC24769D23435B7F25C7B93B7396D3}} ;File_29={{[Editor.u];{1FF6A7867E913AB658D2AB9CEC5A3A19}} ;File_30={{[Engine.u];{F3CD3D4BFF79246C6D54AB381DE8E7CA}} ;File_31={{[Fire.u];{D3627A58A9339565EF9A313C58130C24}} ;File_32={{[GamePlay.u];{F0CFF07EB8318E45AAFDB8FDD32ABE44}} ;File_34={{[IpDrv.u];{E37822CA6BD9DED36858EBBE91F5A6BA}} ;File_35={{[LineageCreature.u];{4DAFE33542B9E86519A2931EEA1B0244}} ;File_36={{[LineageDeco.u];{F71E69C0F16A285DC860F63BFDF93747}} ;File_37={{[lineageeffect.u];{65F0DBB83A8DC7C859FD990D7B2DED0E};{17D901593A7B3042084E2A0A0ACCEE36}} ;File_38={{[lineageenv.u];{8982D65168E1319770237EFC3D0FD4E4}} ;File_39={{[LineageMonster.u];{512232DBC8DF6D027363C9925D86D0CD}} ;File_40={{[LineageMonster2.u];{74BEC9C4E3384885CACA83590EF240CC}} ;File_41={{[LineageMonster3.u];;{2838C03A1D38A218F68B7101BD6A5B76}} ;File_42={{[lineagenpc.u];{A5DE036E6C69FFDDD386FB7F33BB699E}} ;File_43={{[lineagenpc2.u];{4D603979200EFCC17BE4DBF342358799}} ;File_44={{[lineagenpcev.u];{A569BA469C17DB6FE5DBD9E5B6170AF6}} ;File_45={{[LineageVehicle.u];{51764074182854077DB32528223E2678}} ;File_46={{[LineageWarrior.u];{CCF42641F30C4639ED8D316B9A4E1F42};{FA89E977FD204296FC0E9D59F0E9A272}} ;File_47={{[nwindow.u];{360DFAFDCD0509E48B09CD491242FD54}} ;File_48={{[udebugmenu.u];{8195778FB290CCD62C5DEF2F6671C11C}} ;File_49={{[UWindow.u];{5D7CAF94751BF1FCDEBB9B2BEF502B02}} ;File_50={{[L2.exe];{379A0AD30E300AD8BB5DD8A149EBC515}} ;File_33={{[interface.u];{014A36E6A55EE1A7F9C3D37B5B877613};{F191D538FCEA5E4B3038B428E04C7ECD};{1B4DD48DEC6F97B6C8D3255B1147E9EC}} ;File_51={{[interface.xdat];{078434CCE990486A1D7B41835E69FABB};{8B6090820C7B32204BE5AA9ABABDEFF3}} ;File_53={{[_Interface.u];{00000000000000000000000000000000}} ;File_54={{[CliExx.dll];{00000000000000000000000000000000}} ;File_55={{[l2ui.dll];{00000000000000000000000000000000}} ;File_56={{[npkscrypt.dll];{5908C3EE24B40F6F08F1500723B1A41D}} ;File_52={{[chatfilter.ini];{363E6F64AABB21A81C61E9C89737B84F}} ;File_53={{[Client.ini];{1906F536DB0890BA89AEB12A81A44876}} ;File_54={{[l2.ini];{F1C1441E187AC18A0473F8D6C7E3F90D}} ;File_55={{[Lineage2us.ini];{DF2166EAD1F750E22F8EBC18DC1FA14C}} ;File_56={{[Localization.ini];{FBA90399D006FF4A842D1EF832BFB5DF}} ;File_57={{[Option.ini];{626C690FF12E4AB1BA974FB2E4A3C1BD}} ;File_58={{[s_info.ini];{D34E9E0B34595812A72AABA13997F097}} ;File_59={{[ttfontinfo.ini];{CBEB6D54158002449958B24DFB13BFFD}} ;File_60={{[user.ini];{325704B1149A55CDA0B52B01329AC3F6}}   or generate new MD5 hash for your patch! 
    • no have autofarm system
    • Which part is a scam exactly? Please explain me. My project, my rules. I don't ask that much. I'm not some charity. And it's not my problem if the customer ruins his server pack by himself and refuses pay for updates. I don't work just for fun. The most important thing he had the only one problem that told me and it was about boss stat, because he felt it's wrong.... He did not have anything to compare, he just felt it's wrong. Smart? Yeah it's very smart...  More info here:  This guy doesn't understand how the server works and changed many things without understanding/knowledge what he is actually doing. He changed random configs, tried add stats by himself. He mixed files, server pack updates without the right server core. These customers like him are just a severe headache... However, I tried to help him every time and never disappeared, but he did many times. Now I see why. It's weird like people acts, one day he says thanks and in next, he calls me a scammer.  What he needed to do, just a get membership that costs 5GBP/week... Just 5GBP 😐  It's even ridiculously small. So, he needed just update his server pack up to the latest or ask me to do it and that's all, but no, he worked on his own and ruined the server. End of story. And now I'm a scammer? Why? I work my job and I'm not charity. If you can't pay just 5GBP then sorry, but server is not for you, because you won't be available to pay your bills for his own server's website, VDS, guard and so on. This screenshot also proves that I never disappeared until he did. 🙂   and this one about - he never talked to me about any other problem and when I asked about his friend comments here at this forum I didn't get any answer, but this post. Thanks a lot 🙂  You're like a rabid dog that needs to be put to sleep. Everywhere every time  where you see me or my project name you always finds what to say bad. Please don't forget visit your doctor, because something really wrong with you.
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock