Browse Source

[Minor] Add a simple received parser benchmark routine

tags/1.3.0
Vsevolod Stakhov 7 years ago
parent
commit
1c356c51a9
4 changed files with 108 additions and 3 deletions
  1. 2
    2
      FindRagel.cmake
  2. 2
    0
      src/CMakeLists.txt
  3. 14
    1
      utils/CMakeLists.txt
  4. 90
    0
      utils/received_parser_bench.c

+ 2
- 2
FindRagel.cmake View File

@@ -74,7 +74,7 @@ ${RAGEL_version_error}")
"INPUTS;DEPENDS;COMPILE_FLAGS" ${ARGN})
add_custom_command(OUTPUT ${RAGEL_OUTPUT}
COMMAND ${RAGEL_EXECUTABLE}
ARGS ${RAGEL_EXECUTABLE_opts} -o${RAGEL_OUTPUT} ${RAGEL_INPUTS}
ARGS ${RAGEL_COMPILE_FLAGS} -o${RAGEL_OUTPUT} ${RAGEL_INPUTS}
DEPENDS ${RAGEL_INPUTS} ${RAGEL_DEPENDS}
COMMENT
"[RAGEL][${Name}] Compiling state machine with Ragel ${RAGEL_VERSION}"
@@ -83,7 +83,7 @@ ${RAGEL_version_error}")
set(RAGEL_${Name}_DEFINED TRUE)
set(RAGEL_${Name}_OUTPUTS ${RAGEL_OUTPUT})
set(RAGEL_${Name}_INPUT ${RAGEL_INPUTS})
set(RAGEL_${Name}_COMPILE_FLAGS ${RAGEL_EXECUTABLE_opts})
set(RAGEL_${Name}_COMPILE_FLAGS ${RAGEL_COMPILE_FLAGS})
endmacro()

endif()

+ 2
- 0
src/CMakeLists.txt View File

@@ -110,10 +110,12 @@ SET(RAGEL_DEPENDS "${CMAKE_SOURCE_DIR}/src/ragel/smtp_address.rl"
RAGEL_TARGET(ragel_smtp_addr
INPUTS ragel/smtp_addr_parser.rl
DEPENDS ${RAGEL_DEPENDS}
COMPILE_FLAGS -T1
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_addr_parser.rl.c)
RAGEL_TARGET(ragel_smtp_received
INPUTS ragel/smtp_received_parser.rl
DEPENDS ${RAGEL_DEPENDS}
COMPILE_FLAGS -T1
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_received_parser.rl.c)
######################### LINK SECTION ###############################


+ 14
- 1
utils/CMakeLists.txt View File

@@ -1,5 +1,6 @@
SET(UTILSERVERSRC rspamd_http_server.c)
SET(UTILBENCHSRC rspamd_http_bench.c)
SET(RECVBENCHSRC received_parser_bench.c)

ADD_EXECUTABLE(rspamd-http-server ${UTILSERVERSRC})
SET_TARGET_PROPERTIES(rspamd-http-server PROPERTIES LINKER_LANGUAGE C)
@@ -9,13 +10,25 @@ TARGET_LINK_LIBRARIES(rspamd-http-server ${RSPAMD_REQUIRED_LIBRARIES})

ADD_EXECUTABLE(rspamd-http-bench ${UTILBENCHSRC})
SET_TARGET_PROPERTIES(rspamd-http-bench PROPERTIES LINKER_LANGUAGE C)
TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-server)
TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-http-parser)
TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-server)
TARGET_LINK_LIBRARIES(rspamd-http-bench ${RSPAMD_REQUIRED_LIBRARIES})

ADD_EXECUTABLE(rspamd-received-bench ${RECVBENCHSRC})
SET_TARGET_PROPERTIES(rspamd-received-bench PROPERTIES LINKER_LANGUAGE C)
TARGET_LINK_LIBRARIES(rspamd-received-bench rspamd-server)
IF (ENABLE_SNOWBALL MATCHES "ON")
TARGET_LINK_LIBRARIES(rspamd-received-bench stemmer)
ENDIF()
IF(ENABLE_HIREDIS MATCHES "ON")
TARGET_LINK_LIBRARIES(rspamd-received-bench rspamd-hiredis)
ENDIF()
TARGET_LINK_LIBRARIES(rspamd-received-bench ${RSPAMD_REQUIRED_LIBRARIES})

IF (ENABLE_HYPERSCAN MATCHES "ON")
SET_TARGET_PROPERTIES(rspamd-http-bench PROPERTIES LINKER_LANGUAGE CXX)
SET_TARGET_PROPERTIES(rspamd-http-server PROPERTIES LINKER_LANGUAGE CXX)
SET_TARGET_PROPERTIES(rspamd-received-bench PROPERTIES LINKER_LANGUAGE CXX)
ENDIF()

# Redirector

+ 90
- 0
utils/received_parser_bench.c View File

@@ -0,0 +1,90 @@
/*-
* Copyright 2016 Vsevolod Stakhov
*
* 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 "printf.h"
#include "message.h"
#include "smtp_parsers.h"

static gdouble total_time = 0;
static gint total_parsed = 0;

static void
rspamd_process_file (const gchar *fname)
{
struct rspamd_task *task;
GIOChannel *f;
GError *err = NULL;
GString *buf;
struct received_header rh;
gdouble t1, t2;

f = g_io_channel_new_file (fname, "r", &err);

if (!f) {
rspamd_fprintf (stderr, "cannot open %s: %e\n", fname, err);
g_error_free (err);

return;
}

g_io_channel_set_encoding (f, NULL, NULL);
buf = g_string_sized_new (8192);
task = g_malloc0 (sizeof (task));
task->task_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "test");

while (g_io_channel_read_line_string (f, buf, NULL, &err)
== G_IO_STATUS_NORMAL) {

while (buf->len > 0 && g_ascii_isspace (buf->str[buf->len - 1])) {
buf->len --;
}

t1 = rspamd_get_virtual_ticks ();
rspamd_smtp_recieved_parse (task, buf->str, buf->len, &rh);
t2 = rspamd_get_virtual_ticks ();

total_time += t2 - t1;
total_parsed ++;
}

if (err) {
rspamd_fprintf (stderr, "cannot read %s: %e\n", fname, err);
g_error_free (err);
}

g_io_channel_unref (f);
g_string_free (buf, TRUE);
rspamd_mempool_delete (task->task_pool);
g_free (task);
}

int
main (int argc, char **argv)
{
gint i;

for (i = 1; i < argc; i ++) {
if (argv[i]) {
rspamd_process_file (argv[i]);
}
}

rspamd_printf ("Parsed %d received headers in %.3f seconds\n",
total_parsed, total_time);

return 0;
}

Loading…
Cancel
Save