What should I do?
Use normal variables
100.00%
1
Use PVars/PP lists
0%
0
1 vote(s)
* You voted for this item. [Show Results]

  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Pawn] Opinion on PVars
#1
Hi everyone, I've gotten bored so I started writing a gamemode for fun, I want it to be a RolePlay gamemode with all of the stuff (like the NG-RP) but I want it to be smooth on bigger player base too..



I ran some tests and those were the results

Code:
Timing "PawnPlus list"...

      Mean = 480.00ns

      Mode = 475.00ns

    Median = 477.00ns

     Range = 5.00ns

Timing "Normal var"...

      Mean = 200.00ns

      Mode = 199.00ns

    Median = 200.00ns

     Range = 3.00ns

Timing "Pvar timings"...

      Mean = 483.00ns

      Mode = 481.00ns

    Median = 483.00ns

     Range = 4.00ns



The code I used:



Code:
new List:pp_list[1000];



enum E_PLAYER_DATA {

    E_PLAYER_SOME_VAR,

    E_PLAYER_SOME_VAR_2,

    E_PLAYER_SOME_VAR_3

};

new PlayerData[1000][E_PLAYER_DATA];



hook OnScriptInit()

{

    for(new i = 0; i < 1000; ) {

        pp_list[i] = list_new();

        list_resize_var(pp_list[i], 3, VAR_NULL);    

    }

    return Y_HOOKS_CONTINUE_RETURN_1;

}



public OnPlayerConnect(playerid)

{

    wait_ms(5000);

    print("A");

    RUN_TIMING("PawnPlus list")

    {

        list_set(pp_list[playerid], 0, 10000000);

        list_set(pp_list[playerid], 1, 10000000);

        list_set(pp_list[playerid], 2, 10000000);

    }

    RUN_TIMING("Normal var")

    {

        PlayerData[playerid][E_PLAYER_SOME_VAR] = 10000000;

        PlayerData[playerid][E_PLAYER_SOME_VAR_2] = 10000000;

        PlayerData[playerid][E_PLAYER_SOME_VAR_3] = 10000000;

    }

    RUN_TIMING("Pvar timings")

    {

        SetPVarInt(playerid, "key1", 10000000);

        SetPVarInt(playerid, "key2", 10000000);

        SetPVarInt(playerid, "key3", 10000000);

    }

    return 1;

}



So, is it worth it?

Should I use PVars/PP lists? Does it even matter that much when the diff is 200ns?
Using Pawn.CMD?

If you're doing so, this is the very first sign that you absolutely shouldn't utilize your all powerful P-Code knowledge in any of the scripting discussion topics.
  Reply
#2
The question is incomplete. Use X for what? All 3 features have other differences, and are suited for other things. PP lists are resizable; PVars are maps (so PP maps would be better in a comparison), plus their lookup is linear so the difference will only become apparent for a larger collection.



And the difference should be interpreted in another way. It doesn't matter at all what the absolute difference is for a single call, you should be looking at how it scales. So for 1000 calls it will be 200 ?s and so on. But I don't think it matters (for this specific use case) that much since twice slower is still more or less within the same order of magnitude.
  Reply
#3
Hmm, I want to store the user data so that's why I tested it this way..????
Using Pawn.CMD?

If you're doing so, this is the very first sign that you absolutely shouldn't utilize your all powerful P-Code knowledge in any of the scripting discussion topics.
  Reply
#4
He is just saying that your test isn't big enough. You're only testing 3 writes to three variables, you need more like 100.
  Reply


Forum Jump: