dvander@914: #include dvander@914: #include dvander@914: dvander@914: public Plugin:myinfo = dvander@914: { dvander@914: name = "Benchmarks", dvander@914: author = "AlliedModders LLC", dvander@914: description = "Basic benchmarks", dvander@914: version = "1.0.0.0", dvander@914: url = "http://www.sourcemod.net/" dvander@914: }; dvander@914: dvander@914: #define MATH_INT_LOOPS 2000 dvander@914: #define MATH_FLOAT_LOOPS 2000 dvander@914: #define STRING_OP_LOOPS 2000 dvander@914: #define STRING_FMT_LOOPS 2000 dvander@914: #define STRING_ML_LOOPS 2000 dvander@914: #define STRING_RPLC_LOOPS 2000 dvander@914: dvander@914: new Float:g_dict_time dvander@914: new Handle:g_Prof = INVALID_HANDLE dvander@914: dvander@914: public OnPluginStart() dvander@914: { dvander@914: RegServerCmd("bench", Benchmark); dvander@914: g_Prof = CreateProfiler(); dvander@914: StartProfiling(g_Prof); dvander@914: LoadTranslations("fakedict-sourcemod.cfg"); dvander@914: StopProfiling(g_Prof); dvander@914: g_dict_time = GetProfilerTime(g_Prof); dvander@914: } dvander@914: dvander@914: public Action:Benchmark(args) dvander@914: { dvander@914: PrintToServer("dictionary time: %f seconds", g_dict_time); dvander@914: StringBench(); dvander@914: MathBench(); dvander@914: return Plugin_Handled; dvander@914: } dvander@914: dvander@914: MathBench() dvander@914: { dvander@914: StartProfiling(g_Prof); dvander@914: new iter = MATH_INT_LOOPS; dvander@914: new a, b, c; dvander@914: while(iter--) dvander@914: { dvander@914: a = iter * 7; dvander@914: b = 5 + iter; dvander@914: c = 6 / (iter + 3); dvander@914: a = 6 * (iter); dvander@914: b = a * 185; dvander@914: a = b / 25; dvander@914: c = b - a + 3; dvander@914: b = b*b; dvander@914: a = (a + c) / (b - c); dvander@914: b = 6; dvander@914: c = 1; dvander@914: b = a * 128 - c; dvander@914: c = b * (a + 16) * b; dvander@914: if (!a) dvander@914: { dvander@914: a = 5; dvander@914: } dvander@914: a = c + (28/a) - c; dvander@914: } dvander@914: StopProfiling(g_Prof); dvander@914: PrintToServer("int benchmark: %f seconds", GetProfilerTime(g_Prof)); dvander@914: dvander@914: StartProfiling(g_Prof); dvander@914: new Float:fa, Float:fb, Float:fc dvander@914: new int1 dvander@914: iter = MATH_FLOAT_LOOPS; dvander@914: while (iter--) dvander@914: { dvander@914: fa = iter * 0.7; dvander@914: fb = 5.1 + iter; dvander@914: fc = 6.1 / (float(iter) + 2.5); dvander@914: fa = 6.1 * (iter); dvander@914: fb = fa * 185.26; dvander@914: fa = fb / 25.56; dvander@914: fc = fb - a + float(3); dvander@914: fb = fb*fb; dvander@914: fa = (fa + fc) / (fb - fc); dvander@914: fb = 6.2; dvander@914: fc = float(1); dvander@914: int1 = RoundToNearest(fa); dvander@914: fb = fa * float(128) - int1; dvander@914: fc = fb * (a + 16.85) * float(RoundToCeil(fb)); dvander@914: if (fa == 0.0) dvander@914: { dvander@914: fa = 5.0; dvander@914: } dvander@914: fa = fc + (float(28)/fa) - RoundToFloor(fc); dvander@914: } dvander@914: StopProfiling(g_Prof); dvander@914: PrintToServer("float benchmark: %f seconds", GetProfilerTime(g_Prof)); dvander@914: } dvander@914: dvander@914: #define KEY1 "LVWANBAGVXSXUGB" dvander@914: #define KEY2 "IDYCVNWEOWNND" dvander@914: #define KEY3 "UZWTRNHY" dvander@914: #define KEY4 "EPRHAFCIUOIG" dvander@914: #define KEY5 "RMZCVWIEY" dvander@914: #define KEY6 "ZHPU" dvander@914: dvander@914: StringBench() dvander@914: { dvander@914: new i = STRING_FMT_LOOPS; dvander@914: new String:buffer[255]; dvander@914: dvander@914: StartProfiling(g_Prof); dvander@914: new end dvander@914: while (i--) dvander@914: { dvander@914: end = 0; dvander@914: Format(buffer, sizeof(buffer), "%d", i); dvander@914: Format(buffer, sizeof(buffer), "%d %s %d %f %d %-3.4s %s", i, "gaben", 30, 10.0, 20, "hello", "What a gaben"); dvander@914: end = Format(buffer, sizeof(buffer), "Well, that's just %-17.18s!", "what. this isn't a valid string! wait it is"); dvander@914: end += Format(buffer[end], sizeof(buffer)-end, "There are %d in this %d", i, end); dvander@914: end += Format(buffer[end], sizeof(buffer)-end, "There are %d in this %d", i, end); dvander@914: } dvander@914: StopProfiling(g_Prof); dvander@914: PrintToServer("format() benchmark: %f seconds", GetProfilerTime(g_Prof)); dvander@914: dvander@914: StartProfiling(g_Prof); dvander@914: i = STRING_ML_LOOPS; dvander@914: new String:fmtbuf[2048]; /* don't change to decl, amxmodx doesn't use it */ dvander@914: while (i--) dvander@914: { dvander@914: Format(fmtbuf, 2047, "%T %T %d %s %f %T", KEY1, LANG_SERVER, KEY2, LANG_SERVER, 50, "what the", 50.0, KEY3, LANG_SERVER); dvander@914: Format(fmtbuf, 2047, "%s %T %s %T %T", "gaben", KEY4, LANG_SERVER, "what TIME is it", KEY5, LANG_SERVER, KEY6, LANG_SERVER); dvander@914: } dvander@914: StopProfiling(g_Prof); dvander@914: PrintToServer("ml benchmark: %f seconds", GetProfilerTime(g_Prof)); dvander@914: dvander@914: StartProfiling(g_Prof); dvander@914: i = STRING_OP_LOOPS; dvander@914: while (i--) dvander@914: { dvander@914: StringToInt(fmtbuf) dvander@914: } dvander@914: StopProfiling(g_Prof); dvander@914: PrintToServer("str benchmark: %f seconds", GetProfilerTime(g_Prof)); dvander@914: dvander@914: StartProfiling(g_Prof); dvander@914: i = STRING_RPLC_LOOPS; dvander@914: while (i--) dvander@914: { dvander@914: strcopy(fmtbuf, 2047, "This is a test string for you."); dvander@914: ReplaceString(fmtbuf, sizeof(fmtbuf), " ", "ASDF") dvander@914: ReplaceString(fmtbuf, sizeof(fmtbuf), "SDF", "") dvander@914: ReplaceString(fmtbuf, sizeof(fmtbuf), "string", "gnirts") dvander@914: } dvander@914: StopProfiling(g_Prof); dvander@914: PrintToServer("replace benchmark: %f seconds", GetProfilerTime(g_Prof)); dvander@914: }