I was curious, so I did some profiling:
PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <fakemeta_util>
#define PLUGIN "Benchmark"
#define VERSION "0.1"
#define AUTHOR "Sonic Son'edit"
//////////////////////////////////////////
//You can literally say it's fm util stuff.
#define EXTRAOFFSET 5
#define EXTRAOFFSET_WEAPONS 4
#define ACTUAL_EXTRA_OFFSET 20
// "weapon_*" offsets
#define OFFSET_WEAPONID 43
#define OFFSET_WEAPONCLIP 52
#define OFFSET_SILENCER_FIREMODE 74
// "player" offsets
#define OFFSET_ARMORTYPE 112
#define OFFSET_TEAM 114
#define OFFSET_MONEY 115
#define OFFSET_PRIMWEAPON 116
#define OFFSET_LASTACTIVITY 124
#define OFFSET_INTERALMODEL 126
#define OFFSET_NVGOGGLES 129
#define OFFSET_BOMB_DEFUSE 193
#define OFFSET_ISVIP 209
#define OFFSET_TKED 216
#define OFFSET_HOSTAGEKILLS 217
#define OFFSET_MAPZONE 235
#define OFFSET_DRIVING 350
#define OFFSET_STATIONARY 362
enum
{
OFFSET_AMMO_AWP = 377,
OFFSET_AMMO_SCOUT, // AK47, G3SG1
OFFSET_AMMO_M249,
OFFSET_AMMO_M4A1, // FAMAS, AUG, SG550, GALIL, SG552
OFFSET_AMMO_M3, // XM1014
OFFSET_AMMO_USP, // UMP45, MAC10
OFFSET_AMMO_FIVESEVEN, // P90
OFFSET_AMMO_DEAGLE,
OFFSET_AMMO_P228,
OFFSET_AMMO_GLOCK18, // MP5NAVY, TMP, ELITE
OFFSET_AMMO_FLASHBANG,
OFFSET_AMMO_HEGRENADE,
OFFSET_AMMO_SMOKEGRENADE,
OFFSET_AMMO_C4
};
#define OFFSET_SHIELD 510
#define OFFSET_DEATHS 555
// "hostage_entity" offsets
#define OFFSET_HOSTAGEFOLLOW 86
#define OFFSET_HOSTAGENEXTUSE 100
#define OFFSET_HOSTAGELASTUSE 483
#define OFFSET_HOSTAGEID 487
// "armoury_entity" offsets
#define OFFSET_CSATYPE 34
// C4 offsets
#define OFFSET_C4_EXPLODETIME 100
#define OFFSET_C4_DEFUSING 0x181
#define HAS_DEFUSE_KIT (1<<16)
/////////////////////////////////////////////
new g_maxplayers
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_srvcmd("benchmark_set_team", "srvcmd_benchmark_set_team")
g_maxplayers=get_maxplayers()
}
public srvcmd_benchmark_set_team()
{
server_print("[Benchmark] benchmark_set_team begin")
benchmark_set_team_cstrike()
benchmark_set_team_fakemeta()
benchmark_set_team_fm_util()
server_print("[Benchmark] benchmark_set_team end")
}
benchmark_set_team_cstrike()
{
for (new id=1;id<=g_maxplayers;id++)
if (is_user_connected(id))
if (cs_get_user_team(id)==CS_TEAM_CT)
cs_set_user_team(id, CS_TEAM_T)
else if (cs_get_user_team(id)==CS_TEAM_T)
cs_set_user_team(id, CS_TEAM_CT)
}
benchmark_set_team_fakemeta()
{
for (new id=1;id<=g_maxplayers;id++)
if (is_user_connected(id))
if (get_pdata_int(id, 114, 5)==1)
set_pdata_int(id, 114, 2, 5)
else if (get_pdata_int(id, 114, 5)==2)
set_pdata_int(id, 114, 1, 5)
}
benchmark_set_team_fm_util()
{
for (new id=1;id<=g_maxplayers;id++)
if (is_user_connected(id))
if (fm_cs_get_user_team(id)==CS_TEAM_CT)
fm_cs_set_user_team(id, CS_TEAM_T)
else if (fm_cs_get_user_team(id)==CS_TEAM_T)
fm_cs_set_user_team(id, CS_TEAM_CT)
}
stock CsTeams:fm_cs_get_user_team(client, &{CsInternalModel,_}:model=CS_DONTCHANGE)
{
model = CsInternalModel:get_pdata_int(client, OFFSET_INTERALMODEL, EXTRAOFFSET);
return CsTeams:get_pdata_int(client, OFFSET_TEAM, EXTRAOFFSET);
}
stock fm_cs_set_user_team(client, {CsTeams,_}:team, {CsInternalModel,_}:model=CS_DONTCHANGE)
{
new CsTeams:oldteam = fm_cs_get_user_team(client);
if( oldteam != team )
{
switch( oldteam )
{
case CS_TEAM_T:
{
if( is_user_alive(client) && (pev(client, pev_weapons) & (1<<CSW_C4)) )
{
engclient_cmd(client, "drop", "weapon_c4");
}
}
case CS_TEAM_CT:
{
fm_cs_set_user_defuse(client, 0);
}
}
}
set_pdata_int(client, OFFSET_TEAM, _:team, EXTRAOFFSET);
if( model != CS_DONTCHANGE )
{
set_pdata_int(client, OFFSET_INTERALMODEL, _:model, EXTRAOFFSET);
}
dllfunc(DLLFunc_ClientUserInfoChanged, client, engfunc(EngFunc_GetInfoKeyBuffer, client));
static const team_names[CsTeams][] =
{
"UNASSIGNED",
"TERRORIST",
"CT",
"SPECTATOR"
};
static TeamInfo;
if( TeamInfo || (TeamInfo = get_user_msgid("TeamInfo")) )
{
emessage_begin(MSG_BROADCAST, TeamInfo);
ewrite_byte(client);
ewrite_string(team_names[team]);
emessage_end();
}
}
stock fm_cs_set_user_defuse(client, defusekit=1, r=0, g=160, b=0, icon[]="defuser", flash=0)
{
static StatusIcon;
new kit = get_pdata_int(client, OFFSET_BOMB_DEFUSE, EXTRAOFFSET);
if( defusekit && !(kit & HAS_DEFUSE_KIT) )
{
set_pev(client, pev_body, 1);
set_pdata_int(client, OFFSET_BOMB_DEFUSE, (kit | HAS_DEFUSE_KIT), EXTRAOFFSET);
if( StatusIcon || (StatusIcon = get_user_msgid("StatusIcon")) )
{
emessage_begin(MSG_ONE_UNRELIABLE, StatusIcon, _, client);
ewrite_byte((flash == 1) ? 2 : 1);
ewrite_string(icon);
ewrite_byte(r);
ewrite_byte(g);
ewrite_byte(b);
emessage_end();
}
}
else if( !defusekit && (kit & HAS_DEFUSE_KIT) )
{
set_pev(client, pev_body, 0);
set_pdata_int(client, OFFSET_BOMB_DEFUSE, (kit & ~HAS_DEFUSE_KIT), EXTRAOFFSET);
if( StatusIcon || (StatusIcon = get_user_msgid("StatusIcon")) )
{
emessage_begin(MSG_ONE_UNRELIABLE, StatusIcon, _, client);
ewrite_byte(0);
ewrite_string("defuser");
emessage_end();
}
}
}
Code:
date: Mon May 09 22:35:11 2011 map: de_dust2
type | name | calls | time / min / max
-------------------------------------------------------------------
n | register_plugin | 1 | 0.000006 / 0.000006 / 0.000006
n | register_srvcmd | 1 | 0.000201 / 0.000201 / 0.000201
n | get_maxplayers | 1 | 0.000003 / 0.000003 / 0.000003
n | server_print | 2 | 0.027384 / 0.000358 / 0.027027
n | is_user_connected | 96 | 0.000143 / 0.000001 / 0.000003
n | cs_get_user_team | 24 | 0.000049 / 0.000001 / 0.000005
n | cs_set_user_team | 16 | 0.000479 / 0.000023 / 0.000079
n | get_pdata_int | 112 | 0.000172 / 0.000001 / 0.000004
n | set_pdata_int | 34 | 0.000051 / 0.000001 / 0.000004
n | is_user_alive | 8 | 0.000015 / 0.000001 / 0.000003
n | pev | 8 | 0.000018 / 0.000002 / 0.000004
n | engclient_cmd | 1 | 0.005554 / 0.005554 / 0.005554
n | engfunc | 16 | 0.000045 / 0.000002 / 0.000004
n | dllfunc | 16 | 0.000290 / 0.000015 / 0.000028
n | get_user_msgid | 2 | 0.000010 / 0.000004 / 0.000006
n | emessage_begin | 18 | 0.000165 / 0.000004 / 0.000021
n | ewrite_byte | 18 | 0.000052 / 0.000002 / 0.000007
n | ewrite_string | 18 | 0.000087 / 0.000003 / 0.000011
n | emessage_end | 18 | 0.000080 / 0.000002 / 0.000008
n | set_pev | 2 | 0.000005 / 0.000002 / 0.000003
p | plugin_init | 1 | 0.000009 / 0.000009 / 0.000009
p | srvcmd_benchmark_set_team | 1 | 0.000017 / 0.000017 / 0.000017
f | benchmark_set_team_cstrike | 1 | 0.000113 / 0.000113 / 0.000113
f | benchmark_set_team_fakemeta | 1 | 0.000102 / 0.000102 / 0.000102
f | benchmark_set_team_fm_util | 1 | 0.000106 / 0.000106 / 0.000106
f | fm_cs_get_user_team | 40 | 0.000165 / 0.000004 / 0.000004
f | fm_cs_set_user_team | 16 | 0.000263 / 0.000014 / 0.000025
f | fm_cs_set_user_defuse | 8 | 0.000044 / 0.000003 / 0.000014
0 natives, 0 public callbacks, 2 function calls were not executed.
16/32 slots (POD bots)
get team:
cstrike module: 0.000049
pure fakemeta: 0.000037
fm utils/stocks: 0.000239
set team:
cstrike module: 0.000479
pure fakemeta: 0.000024
fm utils/stocks: 0.001003 (+0.005554 = 0.006557 if count engclient_cmd)
change team:
cstrike module: 0.000528
pure fakemeta: 0.000061
fm utils/stocks: 0.001242 (+0.005554 = 0.006796 if count engclient_cmd)
So fm is fastest in the end, if you don't need any junk code. On other hand, if you want to change team "properly" cstrike module is actually better.
The fm get/set team stocks were borrowed from
Cstrike Module to Fakemeta [+Ham] by
Exolent[jNr]. Stocks in fakemeta_util.inc will probably give about same result if we compare them with other modules natives. Thank god I never used FM stocks. And never will be.
P.S.
Correct me, if I miscalculated total execution time.
__________________