aboutsummaryrefslogtreecommitdiff
path: root/gfsm/gfsm/src/libgfsm/tests/offsettest.c
diff options
context:
space:
mode:
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/tests/offsettest.c')
-rw-r--r--gfsm/gfsm/src/libgfsm/tests/offsettest.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/tests/offsettest.c b/gfsm/gfsm/src/libgfsm/tests/offsettest.c
new file mode 100644
index 0000000..bec8e8f
--- /dev/null
+++ b/gfsm/gfsm/src/libgfsm/tests/offsettest.c
@@ -0,0 +1,101 @@
+#include <gfsm.h>
+#include <glib.h>
+#include <stdio.h>
+
+static const gulong count_test
+//= 1048576UL //== 2^20
+//= 16777216UL //== 2^24
+//= 33554432UL //==2^25
+= 268435456UL //==2^28
+//= 4294967295UL //== 2^32-1
+;
+
+//======================================================================
+// Basic bench subs
+
+inline gfsmLabelId get_lower(gfsmArc *a) { return a->lower; }
+inline gfsmLabelId get_upper(gfsmArc *a) { return a->upper; }
+inline gfsmLabelId get_label_offset(gfsmArc *a, gint offset) {
+ return *((gfsmLabelId*)G_STRUCT_MEMBER_P(&a,offset));
+}
+
+//======================================================================
+// Bench: literal: lower
+
+double bench_literal_lower(gfsmArc *a) {
+ gfsmLabelId l;
+ GTimer *timer = g_timer_new();
+ gulong i;
+ double elapsed;
+ g_timer_start(timer);
+ for (i=0; i < count_test; i++) {
+ //-- BEGIN TEST CODE
+ l = get_lower(a);
+ //-- END TEST CODE
+ }
+ elapsed = g_timer_elapsed(timer,NULL);
+ g_timer_destroy(timer);
+ return elapsed;
+}
+
+//======================================================================
+// Bench: offset
+
+double bench_offset(gfsmArc *a, gint lab_offset) {
+ gfsmLabelId l;
+ GTimer *timer = g_timer_new();
+ gulong i;
+ double elapsed;
+ g_timer_start(timer);
+ for (i=0; i < count_test; i++) {
+ //-- BEGIN TEST CODE
+ l = get_label_offset(a,lab_offset);
+ //-- END TEST CODE
+ }
+ elapsed = g_timer_elapsed(timer,NULL);
+ g_timer_destroy(timer);
+ return elapsed;
+}
+
+//======================================================================
+// Bench: offset: lower
+
+#define bench_offset_lower(a) bench_offset((a),G_STRUCT_OFFSET(gfsmArc, lower))
+
+
+//======================================================================
+// MAIN
+int main(int argc, char **argv) {
+ gfsmArc a = {0,1,2,3,4.5};
+ double elapsed_literal, elapsed_offset, count_dbl=count_test;
+
+ printf("G_STRUCT_OFFSET(gfsmArc, lower)=%d: *()=%d\n",
+ G_STRUCT_OFFSET(gfsmArc, lower),
+ *((gfsmLabelId*)G_STRUCT_MEMBER_P(&a,G_STRUCT_OFFSET(gfsmArc, lower)))
+ );
+
+ printf("G_STRUCT_OFFSET(gfsmArc, upper)=%d: *()=%d\n",
+ G_STRUCT_OFFSET(gfsmArc, upper),
+ *((gfsmLabelId*)G_STRUCT_MEMBER_P(&a,G_STRUCT_OFFSET(gfsmArc, upper)))
+ );
+
+ printf("G_STRUCT_OFFSET(gfsmArc, weight)=%d: *()=%g\n",
+ G_STRUCT_OFFSET(gfsmArc, weight),
+ *((gfsmWeight*)G_STRUCT_MEMBER_P(&a,G_STRUCT_OFFSET(gfsmArc, weight)))
+ );
+
+ //-- bench
+ elapsed_literal = bench_literal_lower(&a);
+ elapsed_literal = bench_literal_lower(&a);
+ //
+ elapsed_offset = bench_offset_lower(&a);
+ elapsed_offset = bench_offset_lower(&a);
+ //
+ //
+ fprintf(stderr, "%16s: %.2f sec, %ld iters, %.2e iter/sec\n",
+ "literal", elapsed_literal, count_test, count_dbl/elapsed_literal);
+ fprintf(stderr, "%16s: %.2f sec, %ld iters, %.2e iter/sec\n",
+ "offset", elapsed_offset, count_test, count_dbl/elapsed_offset);
+
+ return 0;
+}