aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Galanin <mgalanin@mimecast.com>2018-08-20 10:27:12 +0100
committerMikhail Galanin <mgalanin@mimecast.com>2018-08-20 10:27:12 +0100
commit5dd0a6b7fb33537a0a80c250502b692175d71581 (patch)
tree7a105dc7ff307883b792971c930a4b5ce4c3e871
parent3b5ba9b74e772d9de998350c03e10fb621dc7a3e (diff)
downloadrspamd-5dd0a6b7fb33537a0a80c250502b692175d71581.tar.gz
rspamd-5dd0a6b7fb33537a0a80c250502b692175d71581.zip
[Minor] Benchmark for lua calls
-rw-r--r--test/CMakeLists.txt1
-rw-r--r--test/lua/pcall_test.lua45
-rw-r--r--test/rspamd_lua_pcall_vs_resume_test.c139
-rw-r--r--test/rspamd_test_suite.c3
-rw-r--r--test/tests.h2
5 files changed, 189 insertions, 1 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index f2d846525..226db80ef 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -9,6 +9,7 @@ SET(TESTSRC rspamd_mem_pool_test.c
rspamd_shingles_test.c
rspamd_upstream_test.c
rspamd_http_test.c
+ rspamd_lua_pcall_vs_resume_test.c
rspamd_lua_test.c
rspamd_cryptobox_test.c
rspamd_heap_test.c
diff --git a/test/lua/pcall_test.lua b/test/lua/pcall_test.lua
new file mode 100644
index 000000000..26f3ae466
--- /dev/null
+++ b/test/lua/pcall_test.lua
@@ -0,0 +1,45 @@
+--[[ https://en.wikipedia.org/wiki/Normal_distribution ]]
+
+-- The Box–Muller method
+local function gaussian(mean, variance)
+ local U = math.random()
+ local V = math.random()
+ return math.sqrt(-2.0 * variance * math.log(U)) *
+ math.cos(2.0 * math.pi * V) + mean
+end
+
+local function mean(t)
+ local sum = 0
+ local count = #t
+ for i = 1, count do
+ sum = sum + t[i]
+ end
+ return sum / count
+end
+
+local function std(t, mean)
+ local squares = 0.0
+ for i = 1, #t do
+ local deviation = math.abs(mean - t[i])
+ squares = squares + deviation * deviation
+ end
+ local variance = squares / #t
+ return math.sqrt(variance)
+end
+
+local function do_the_call()
+ local t = {}
+ local mu = 34.0
+ local sigma = 10.0
+
+ for i = 1, 5 do
+ table.insert(t, gaussian(mu, sigma))
+ end
+
+ return string.format("Got mean: %1.5f, mu: %1.5f\nstd deviance:%1.5f, expected: %1.5f",
+ mean(t), mu,
+ std(t, mu), math.sqrt(sigma))
+end
+
+math.randomseed(os.time())
+return do_the_call
diff --git a/test/rspamd_lua_pcall_vs_resume_test.c b/test/rspamd_lua_pcall_vs_resume_test.c
new file mode 100644
index 000000000..03f1d86c1
--- /dev/null
+++ b/test/rspamd_lua_pcall_vs_resume_test.c
@@ -0,0 +1,139 @@
+/*-
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include "rspamd.h"
+#include "util.h"
+#include "lua/lua_common.h"
+#include "lua/lua_thread_pool.h"
+#include "unix-std.h"
+
+static const char *lua_src = BUILDROOT "/test/lua/pcall_test.lua";
+
+extern struct rspamd_main *rspamd_main;
+
+const int N = 20000;
+
+
+static gdouble
+test_pcall(lua_State *L, gint function_call)
+{
+ gdouble t1, t2;
+ gint i;
+ t1 = rspamd_get_virtual_ticks ();
+
+ for (i = 0; i < N; i ++) {
+ lua_rawgeti (L, LUA_REGISTRYINDEX, function_call);
+ lua_pcall (L, 0, 1, 0);
+ lua_pop (L, 1);
+ }
+
+ t2 = rspamd_get_virtual_ticks ();
+
+ return t2 - t1;
+}
+
+static gdouble
+test_resume(lua_State *L, gint function_call)
+{
+ gdouble t1, t2;
+ gint i;
+ t1 = rspamd_get_virtual_ticks ();
+
+ for (i = 0; i < N; i ++) {
+ lua_rawgeti (L, LUA_REGISTRYINDEX, function_call);
+ lua_resume (L, 0);
+ lua_pop (L, 1);
+ }
+
+ t2 = rspamd_get_virtual_ticks ();
+
+ return t2 - t1;
+}
+
+static gdouble
+test_resume_get_thread(gint function_call)
+{
+ gdouble t1, t2;
+ gint i;
+ struct thread_entry *ent;
+
+ t1 = rspamd_get_virtual_ticks ();
+
+ for (i = 0; i < N; i ++) {
+ ent = lua_thread_pool_get (rspamd_main->cfg->lua_thread_pool);
+
+ lua_rawgeti (ent->lua_state, LUA_REGISTRYINDEX, function_call);
+ lua_resume (ent->lua_state, 0);
+ lua_pop (ent->lua_state, 1);
+
+ lua_thread_pool_return (rspamd_main->cfg->lua_thread_pool, ent);
+ }
+
+ t2 = rspamd_get_virtual_ticks ();
+
+ return t2 - t1;
+}
+
+static gdouble
+test_resume_get_new_thread(gint function_call)
+{
+ gdouble t1, t2;
+ gint i;
+ struct thread_entry *ent;
+
+ t1 = rspamd_get_virtual_ticks ();
+
+ for (i = 0; i < N; i ++) {
+ ent = lua_thread_pool_get (rspamd_main->cfg->lua_thread_pool);
+
+ lua_rawgeti (ent->lua_state, LUA_REGISTRYINDEX, function_call);
+ lua_resume (ent->lua_state, 0);
+ lua_pop (ent->lua_state, 1);
+
+ /* lua_thread_pool_return (rspamd_main->cfg->lua_thread_pool, ent); */
+ }
+
+ t2 = rspamd_get_virtual_ticks ();
+
+ return t2 - t1;
+}
+
+void
+rspamd_lua_lua_pcall_vs_resume_test_func (void)
+{
+ lua_State *L = rspamd_main->cfg->lua_state;
+ gdouble t1, reference;
+
+ if (luaL_dofile (L, lua_src) != 0) {
+ msg_err ("failed to load test file: %s ", lua_tostring (L, -1));
+ g_assert (0);
+ }
+
+ gint function_call = luaL_ref (L, LUA_REGISTRYINDEX);
+
+ msg_info ("calling");
+
+ reference = t1 = test_pcall(L, function_call);
+ msg_notice ("pcall stat: ts: %1.5f, avg:%1.5f, slow=%1.2f", t1, t1/(gdouble)N, t1 / reference);
+
+ t1 = test_resume (L, function_call);
+ msg_notice ("resume stat: ts: %1.5f, avg:%1.5f, slow=%1.2f", t1, t1/(gdouble)N, t1 / reference);
+
+ t1 = test_resume_get_thread (function_call);
+ msg_notice ("resume+get thread stat: ts: %1.5f, avg:%1.5f, slow=%1.2f", t1, t1/(gdouble)N, t1 / reference);
+
+ t1 = test_resume_get_new_thread (function_call);
+ msg_notice ("resume+get [new] thread stat: ts: %1.5f, avg:%1.5f, slow=%1.2f", t1, t1/(gdouble)N, t1 / reference);
+} \ No newline at end of file
diff --git a/test/rspamd_test_suite.c b/test/rspamd_test_suite.c
index 2f8e893de..2ea73eff3 100644
--- a/test/rspamd_test_suite.c
+++ b/test/rspamd_test_suite.c
@@ -10,7 +10,7 @@ worker_t *workers[] = { NULL };
int
main (int argc, char **argv)
{
- struct rspamd_config *cfg;
+ struct rspamd_config *cfg;
rspamd_main = (struct rspamd_main *)g_malloc (sizeof (struct rspamd_main));
memset (rspamd_main, 0, sizeof (struct rspamd_main));
@@ -52,6 +52,7 @@ main (int argc, char **argv)
g_test_add_func ("/rspamd/lua", rspamd_lua_test_func);
g_test_add_func ("/rspamd/cryptobox", rspamd_cryptobox_test_func);
g_test_add_func ("/rspamd/heap", rspamd_heap_test_func);
+ g_test_add_func ("/rspamd/lua_pcall", rspamd_lua_lua_pcall_vs_resume_test_func);
#if 0
g_test_add_func ("/rspamd/url", rspamd_url_test_func);
diff --git a/test/tests.h b/test/tests.h
index 0ba03da8d..9a70d8d5d 100644
--- a/test/tests.h
+++ b/test/tests.h
@@ -41,4 +41,6 @@ void rspamd_cryptobox_test_func (void);
void rspamd_heap_test_func (void);
+void rspamd_lua_lua_pcall_vs_resume_test_func(void);
+
#endif