summaryrefslogtreecommitdiff
path: root/pjsip/src/test-pjsip/uri_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/test-pjsip/uri_test.c')
-rw-r--r--pjsip/src/test-pjsip/uri_test.c185
1 files changed, 146 insertions, 39 deletions
diff --git a/pjsip/src/test-pjsip/uri_test.c b/pjsip/src/test-pjsip/uri_test.c
index a221f4ca..916a30f4 100644
--- a/pjsip/src/test-pjsip/uri_test.c
+++ b/pjsip/src/test-pjsip/uri_test.c
@@ -32,12 +32,19 @@
#define PARAM_CHAR ALPHANUM MARK "[]/:&+$"
#define POOL_SIZE 8000
-#define LOOP_COUNT 10000
+#if defined(PJ_DEBUG) && PJ_DEBUG!=0
+# define LOOP_COUNT 10000
+#else
+# define LOOP_COUNT 40000
+#endif
#define AVERAGE_URL_LEN 80
#define THREAD_COUNT 4
-static pj_highprec_t parse_len, print_len, cmp_len;
-static pj_timestamp parse_time, print_time, cmp_time;
+static struct
+{
+ pj_highprec_t parse_len, print_len, cmp_len;
+ pj_timestamp parse_time, print_time, cmp_time;
+} var;
/* URI creator functions. */
@@ -686,7 +693,7 @@ static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
/* Parse URI text. */
pj_get_timestamp(&t1);
- parse_len = parse_len + entry->len;
+ var.parse_len = var.parse_len + entry->len;
parsed_uri = pjsip_parse_uri(pool, entry->str, entry->len, 0);
if (!parsed_uri) {
/* Parsing failed. If the entry says that this is expected, then
@@ -702,7 +709,7 @@ static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
}
pj_get_timestamp(&t2);
pj_sub_timestamp(&t2, &t1);
- pj_add_timestamp(&parse_time, &t2);
+ pj_add_timestamp(&var.parse_time, &t2);
/* Create the reference URI. */
ref_uri = entry->creator(pool);
@@ -720,10 +727,10 @@ static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
s1.ptr[len] = '\0';
s1.slen = len;
- print_len = print_len + len;
+ var.print_len = var.print_len + len;
pj_get_timestamp(&t2);
pj_sub_timestamp(&t2, &t1);
- pj_add_timestamp(&print_time, &t2);
+ pj_add_timestamp(&var.print_time, &t2);
len = pjsip_uri_print( PJSIP_URI_IN_OTHER, ref_uri, s2.ptr, PJSIP_MAX_URL_SIZE);
if (len < 1) {
@@ -755,10 +762,10 @@ static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
}
}
- cmp_len = cmp_len + len;
+ var.cmp_len = var.cmp_len + len;
pj_get_timestamp(&t2);
pj_sub_timestamp(&t2, &t1);
- pj_add_timestamp(&cmp_time, &t2);
+ pj_add_timestamp(&var.cmp_time, &t2);
/* Compare text. */
if (entry->printed) {
@@ -785,16 +792,12 @@ on_return:
return status;
}
-int uri_test()
+
+static int simple_uri_test(void)
{
- unsigned i, loop;
+ unsigned i;
pj_pool_t *pool;
pj_status_t status;
- pj_timestamp zero;
- pj_time_val elapsed;
- pj_highprec_t avg_parse, avg_print, avg_cmp, kbytes;
-
- zero.u32.hi = zero.u32.lo = 0;
PJ_LOG(3,(THIS_FILE, " simple test"));
pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
@@ -803,16 +806,31 @@ int uri_test()
if (status != PJ_SUCCESS) {
PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
status, i));
- goto on_return;
+ return status;
}
}
pjsip_endpt_release_pool(endpt, pool);
- PJ_LOG(3,(THIS_FILE, " benchmarking..."));
- parse_len = print_len = cmp_len = 0;
- parse_time.u32.hi = parse_time.u32.lo = 0;
- print_time.u32.hi = print_time.u32.lo = 0;
- cmp_time.u32.hi = cmp_time.u32.lo = 0;
+ return 0;
+}
+
+static int uri_benchmark(unsigned *p_parse, unsigned *p_print, unsigned *p_cmp)
+{
+ unsigned i, loop;
+ pj_pool_t *pool;
+ pj_status_t status;
+ pj_timestamp zero;
+ pj_time_val elapsed;
+ pj_highprec_t avg_parse, avg_print, avg_cmp, kbytes;
+
+ pj_memset(&var, 0, sizeof(var));
+
+ zero.u32.hi = zero.u32.lo = 0;
+
+ var.parse_len = var.print_len = var.cmp_len = 0;
+ var.parse_time.u32.hi = var.parse_time.u32.lo = 0;
+ var.print_time.u32.hi = var.print_time.u32.lo = 0;
+ var.cmp_time.u32.hi = var.cmp_time.u32.lo = 0;
for (loop=0; loop<LOOP_COUNT; ++loop) {
pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
@@ -827,55 +845,144 @@ int uri_test()
pjsip_endpt_release_pool(endpt, pool);
}
- kbytes = parse_len;
+ kbytes = var.parse_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
- elapsed = pj_elapsed_time(&zero, &parse_time);
- avg_parse = pj_elapsed_usec(&zero, &parse_time);
+ elapsed = pj_elapsed_time(&zero, &var.parse_time);
+ avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
pj_highprec_mul(avg_parse, AVERAGE_URL_LEN);
- pj_highprec_div(avg_parse, parse_len);
+ pj_highprec_div(avg_parse, var.parse_len);
avg_parse = 1000000 / avg_parse;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB of urls parsed in %d.%03ds (avg=%d urls/sec)",
- (unsigned)(parse_len/1000000), (unsigned)kbytes,
+ (unsigned)(var.parse_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_parse));
- kbytes = print_len;
+ *p_parse = (unsigned)avg_parse;
+
+ kbytes = var.print_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
- elapsed = pj_elapsed_time(&zero, &print_time);
- avg_print = pj_elapsed_usec(&zero, &print_time);
+ elapsed = pj_elapsed_time(&zero, &var.print_time);
+ avg_print = pj_elapsed_usec(&zero, &var.print_time);
pj_highprec_mul(avg_print, AVERAGE_URL_LEN);
- pj_highprec_div(avg_print, parse_len);
+ pj_highprec_div(avg_print, var.parse_len);
avg_print = 1000000 / avg_print;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB of urls printed in %d.%03ds (avg=%d urls/sec)",
- (unsigned)(print_len/1000000), (unsigned)kbytes,
+ (unsigned)(var.print_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_print));
- kbytes = cmp_len;
+ *p_print = (unsigned)avg_print;
+
+ kbytes = var.cmp_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
- elapsed = pj_elapsed_time(&zero, &cmp_time);
- avg_cmp = pj_elapsed_usec(&zero, &cmp_time);
+ elapsed = pj_elapsed_time(&zero, &var.cmp_time);
+ avg_cmp = pj_elapsed_usec(&zero, &var.cmp_time);
pj_highprec_mul(avg_cmp, AVERAGE_URL_LEN);
- pj_highprec_div(avg_cmp, cmp_len);
+ pj_highprec_div(avg_cmp, var.cmp_len);
avg_cmp = 1000000 / avg_cmp;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB of urls compared in %d.%03ds (avg=%d urls/sec)",
- (unsigned)(cmp_len/1000000), (unsigned)kbytes,
+ (unsigned)(var.cmp_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_cmp));
- PJ_LOG(3,(THIS_FILE, " multithreaded test"));
-
+ *p_cmp = (unsigned)avg_cmp;
on_return:
return status;
}
+
+/*****************************************************************************/
+
+int uri_test(void)
+{
+ enum { COUNT = 4, DETECT=0, PARSE=1, PRINT=2 };
+ struct {
+ unsigned parse;
+ unsigned print;
+ unsigned cmp;
+ } run[COUNT];
+ unsigned i, max, avg_len;
+ char desc[200];
+ pj_status_t status;
+
+ status = simple_uri_test();
+ if (status != PJ_SUCCESS)
+ return status;
+
+ for (i=0; i<COUNT; ++i) {
+ PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)...", i+1, COUNT));
+ status = uri_benchmark(&run[i].parse, &run[i].print, &run[i].cmp);
+ if (status != PJ_SUCCESS)
+ return status;
+ }
+
+ /* Calculate average URI length */
+ for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
+ avg_len += uri_test_array[i].len;
+ }
+ avg_len /= PJ_ARRAY_SIZE(uri_test_array);
+
+
+ /*
+ * Print maximum parse/sec
+ */
+ for (i=0, max=0; i<COUNT; ++i)
+ if (run[i].parse > max) max = run[i].parse;
+
+ PJ_LOG(3,("", " Maximum URI parse/sec=%u", max));
+
+ pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>parsed</B> with "
+ "<tt>pjsip_parse_uri()</tt> per second "
+ "(tested with %d URI set, with average length of "
+ "%d chars)",
+ PJ_ARRAY_SIZE(uri_test_array), avg_len);
+
+ report_ival("uri-parse-per-sec", max, "URI/sec", desc);
+
+ /* URI parsing bandwidth */
+ report_ival("uri-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec",
+ "URI parsing bandwidth in megabytes (number of megabytes "
+ "worth of URI that can be parsed per second)");
+
+
+ /* Print maximum print/sec */
+ for (i=0, max=0; i<COUNT; ++i)
+ if (run[i].print > max) max = run[i].print;
+
+ PJ_LOG(3,("", " Maximum URI print/sec=%u", max));
+
+ pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>printed</B> with "
+ "<tt>pjsip_uri_print()</tt> per second "
+ "(tested with %d URI set, with average length of "
+ "%d chars)",
+ PJ_ARRAY_SIZE(uri_test_array), avg_len);
+
+ report_ival("uri-print-per-sec", max, "URI/sec", desc);
+
+ /* Print maximum detect/sec */
+ for (i=0, max=0; i<COUNT; ++i)
+ if (run[i].cmp > max) max = run[i].cmp;
+
+ PJ_LOG(3,("", " Maximum URI comparison/sec=%u", max));
+
+ pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>compared</B> with "
+ "<tt>pjsip_uri_cmp()</tt> per second "
+ "(tested with %d URI set, with average length of "
+ "%d chars)",
+ PJ_ARRAY_SIZE(uri_test_array), avg_len);
+
+ report_ival("uri-cmp-per-sec", max, "URI/sec", desc);
+
+ return PJ_SUCCESS;
+}
+