Re: Pawn.CMD - the fastest and most functional command processor -
Luicy. - 24.06.2016
I do have YSI 4.
So, how would I fix this?
Do you might think it's because the dot in Pawn
.CMD?
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 24.06.2016
Quote:
Originally Posted by Meller
I do have YSI 4.
So, how would I fix this?
Do you might think it's because the dot in Pawn.CMD?
|
Pawn.CMD.inc included exactly after others?
Re: Pawn.CMD - the fastest and most functional command processor -
Luicy. - 24.06.2016
This is copied right from the gm.
PHP код:
#include <a_samp>
#include <easy-mysql>
#include <YSI\y_hooks>
#include <Pawn.CMD>
So yes.
Do you think this is the problem:
http://pastebin.com/Ppnn9Xvh
I'm including the gamemode parts instead of directly in the gm.
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 24.06.2016
Pawn.CMD is not compatible with YSI because YSI changes public's ids at runtime.
Re: Pawn.CMD - the fastest and most functional command processor - justice96 - 24.06.2016
Quote:
Originally Posted by YourShadow
Pawn.CMD is not compatible with YSI because YSI changes public's ids at runtime.
|
Bad news, most of users on SA-MP forums is using YSI
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 24.06.2016
I will try to fix the incompatibility.
Re: Pawn.CMD - the fastest and most functional command processor -
Yashas - 24.06.2016
Do you still have the speed test code?
I am surprised to find iZCMD being slower than ZCMD.
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 24.06.2016
Quote:
Originally Posted by YourShadow
|
You can test.
Re: Pawn.CMD - the fastest and most functional command processor -
PrO.GameR - 24.06.2016
Welp, thats it, the benchmarks, flagging and registering aliases convinced me to switch from Y_cmd.
Although a couple questions, do we need to use PC_Init? and whats the difference between calling a CMD and emulating it? I imagine calling it is quite faster right?
Hope you keep updating this, so many great features, so much more potential.
Re: Pawn.CMD - the fastest and most functional command processor -
Konstantinos - 24.06.2016
Quote:
Originally Posted by PrO.GameR
Welp, thats it, the benchmarks, flagging and registering aliases convinced me to switch from Y_cmd.
Although a couple questions, do we need to use PC_Init? and whats the difference between calling a CMD and emulating it? I imagine calling it is quite faster right?
Hope you keep updating this, so many great features, so much more potential.
|
Yeah, I switched to this plugin too after the flags feature was added.
You don't need to use PC_Init at all, the include does that itself. If FILTERSCRIPT is defined, it sets it to false otherwise to true.
Both ways seem to call ProcessCommand.
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 24.06.2016
Quote:
Originally Posted by PrO.GameR
do we need to use PC_Init?
|
No.
Quote:
Originally Posted by PrO.GameR
whats the difference between calling a CMD and emulating it? I imagine calling it is quite faster right?
|
Example:
PHP код:
public OnPlayerText(playerid, text[])
{
if (text[0] == '!')
{
text[0] = '/';
PC_EmulateCommand(playerid, text);
return 0;
}
return 1;
}
Re: Pawn.CMD - the fastest and most functional command processor -
Yashas - 24.06.2016
Quote:
Originally Posted by YourShadow
You can test.
|
iZCMD = Optimized ZCMD
If iZCMD turns out to be slower than ZCMD then there is no point of using it.
Can I have a look at your gamemode/filterscript which you used for the testing?
When I benchmarked some of the PAWN based processors last year, I got the following:
Test Script:
http://pastebin.com/2KBBzcdz
Код:
y_commands took 1231ms on average
ZCMD took 1201ms on average
I-ZCMD (non-case-sensitive) took 547ms on average
I-ZCMD (case-sensitive) took 353ms on average
I-ZCMD (case-sensitive) is 3.40 times faster than ZCMD
I-ZCMD (case-sensitive) is 3.49 times faster than y_commands
I-ZCMD (non-case-sensitive) is 2.20 times faster than ZCMD
I-ZCMD (non-case-sensitive) is 2.25 times faster than y_commands
ZCMD is 1.02 times faster than y_commands
https://github.com/YashasSamaga/I-ZC...ginal-zcmd.inc
https://github.com/YashasSamaga/I-ZC...ster/izcmd.inc
In the default non-case-sensitive mode, ZCMD is almost pretty much same as iZCMD except that iZCMD does not use format rather uses one array assignment. For obvious reasons, iZCMD has to beat ZCMD.
How many different types of commands do you fake?
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 24.06.2016
Test script: (1K commands)
https://gist.github.com/urShadow/f33...dbc45ebcfd55d2
I called "/test500".
Results:
Pawn.CMD - 21 microseconds.
i-zcmd - 154 microseconds.
zcmd - 179 microseconds.
Re: Pawn.CMD - the fastest and most functional command processor -
Yashas - 24.06.2016
Quote:
Originally Posted by YourShadow
|
Don't use SendClientMessage inside the command. It invalidates the speed test.
Here is the reason.
Let's say ZCMD takes 10ms to process a command in OnPlayerCommandText and iZCMD takes 5ms to do the same.
An empty command takes 1ms to execute and a command with one SendClientMessage takes 20ms.
Now when you do the speed tests, you will find ZCMD to take 30ms and iZCMD to take 25ms. Now you obviously will say they are almost the same even though iZCMD processes commands twice as fast as ZCMD.
That is one flaw in your speed test.
Another one is all three of us (ZCMD, iZCMD, Pawn.CMD) do a binary search ultimately (CallLocalFunction does a binary search). So using test500 is not a good idea since it's the command which is in the middle in the public function table.
Try something similar to the following,
Код:
for(int i = 0; i < 1000000; i++)
{
call test0
call test10
call test50
call test 100
call test 200
call test 400
//calling test 900 is same as calling test100, calling test50 is same as calling test 950 and the idea follows
}
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 24.06.2016
Quote:
Originally Posted by Yashas
Don't use SendClientMessage inside the command. It invalidates the speed test.
|
No. It does not affect my speedtest, you wrote a bullshit.
Re: Pawn.CMD - the fastest and most functional command processor -
Yashas - 24.06.2016
Quote:
Originally Posted by YourShadow
No. It does not affect my speedtest, you wrote a bullshit.
|
Go through the reply again if you did not understand. I have told this 100 times to many people already. I can prove that DCMD is as fast as ZCMD if you allow me to add 100 SendClientMessage calls inside the command.
I don't know about how it affects your processor but it affects the ZCMD and iZCMD speed test for the reason I mentioned above because these processors don't stop OnPlayerCommandText until the "command finishes executing completely".
Does your speed test count the time the command takes for the speed test for PAWN.Cmd? If yes, the speed test is "unfair" for ZCMD, iZCMD, YCMD, basically every PAWN based processor because all of these use CallLocalFunction to call the public and the time the command takes to execute gets counted in the speed test.
If not, then there is no problem apart from the one I mentioned earlier. The test won't be fair for ZCMD and iZCMD.
EDIT: Maybe you called what I wrote bullshit after you tested without the SendClientMessage. You may not have noticed significant change because ZCMD/iZCMD takes awful lot of time in the command processing that the time taken by one function call becomes insignificant. However, you still need to understand that that having functions in the command is the wrong way to do the speed test.
Add 100 SendClientMessage calls in your command and you will see that YCMD/ZCMD/iZCMD all appear to be equally fast.
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 24.06.2016
You do not understand how working my speedtest. Why do you argue? Pawn.CMD anyway faster than zcmd or izcmd.
Re: Pawn.CMD - the fastest and most functional command processor -
Yashas - 24.06.2016
Quote:
Originally Posted by YourShadow
You do not understand how working my speedtest. Why do you argue? Pawn.CMD anyway faster than zcmd or izcmd.
|
I seriously had no clue how your speed test even worked. I have no idea from where you have picked "0x4928A0" from where you initialize the shared pointer so I simply stopped checking it. Anyway I just went through your test sample code once again and now I see that you do the CheckTime call in test500 only which caused the confusion. Till now I was under the impression that you were counting the time taken to execute the command as well. And magically CheckTime gets called after the command execution is over. I apologize for not checking the test sample properly.
It's hard to understand anyway who ever reads your test code. There is no hint of what urmem is btw...
Of course, it is impossible for ZCMD/iZCMD to beat PAWN.Cmd for obvious reasons. PAWN.Cmd is a plugin whereas the rest are PAWN based processors.
That wasn't the point of the discussion. I was aware of that fact all the time. When I saw the disparity in the speed measured by your test in the front page, I suspected a flaw to be present in the speed test which is why I asked if I could have a look at it.
Re: Pawn.CMD - the fastest and most functional command processor -
Crayder - 24.06.2016
OK, so now just two things before I decide to transit. Compatibility with YSI and some kind of system that we can use to loop through the commands (like in YCMD preferably). I imagine the loop to be able to iterate through specific flags too, like if I wanted to loop through admin commands I could supply the CMD_ADMIN flag.
In a system similar to YCMD that would look like this: PC_GetNextCMD(index, flags);
For this or anything similar there would need to be a command indexing system, each command would need a unique ID.
Another thing I'd like to see is a "bool:PC_HasFlag(cmdid, flag), "PC_GetID(name[])", and "bool:PC_IsValid(cmdid)". HasFlag would return whether or not a cmdid has a flag. GetID would be used to get the ID of a command by name, and return -1 if it doesn't exist. IsValid would return whether exists by ID.
Re: Pawn.CMD - the fastest and most functional command processor -
YourShadow - 25.06.2016
Quote:
Originally Posted by Crayder
OK, so now just two things before I decide to transit. Compatibility with YSI and some kind of system that we can use to loop through the commands (like in YCMD preferably). I imagine the loop to be able to iterate through specific flags too, like if I wanted to loop through admin commands I could supply the CMD_ADMIN flag.
In a system similar to YCMD that would look like this: PC_GetNextCMD(index, flags);
For this or anything similar there would need to be a command indexing system, each command would need a unique ID.
Another thing I'd like to see is a "bool:PC_HasFlag(cmdid, flag), "PC_GetID(name[])", and "bool:PC_IsValid(cmdid)". HasFlag would return whether or not a cmdid has a flag. GetID would be used to get the ID of a command by name, and return -1 if it doesn't exist. IsValid would return whether exists by ID.
|
I will try to implement this in the next update.