1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
#include "performance.h"
gint32
sum_gvariant (GVariant *v)
{
guint32 sum;
gint16 a;
gint32 b;
const char *c;
GVariant *list;
guchar d;
guint16 tuple_a;
guchar tuple_b;
gsize len, i;
gint32 list_a;
guint16 list_b;
g_variant_get (v, "(ni&s@a(iq)y(qy))",
&a, &b, &c, &list, &d, &tuple_a, &tuple_b);
sum = a + b + strlen(c) + d + tuple_a + tuple_b;
len = g_variant_n_children (list);
for (i = 0; i < len; i++)
{
g_variant_get_child (list, i, "(iq)", &list_a, &list_b);
sum += list_a + list_b;
}
return sum;
}
gint32
sum_generated (PerformanceContainerRef v)
{
guint32 sum;
PerformanceTupleRef tuple;
PerformanceListRef list;
PerformanceItemRef item;
gsize len, i;
tuple = performance_container_get_tuple (v);
sum = performance_container_get_a(v) +
performance_container_get_b(v) +
strlen(performance_container_get_c(v)) +
performance_container_get_d(v) +
performance_tuple_get_a (tuple) +
performance_tuple_get_b (tuple);
list = performance_container_get_list (v);
len = performance_list_get_length (list);
for (i = 0; i < len; i++)
{
item = performance_list_get_at (list, i);
sum += performance_item_get_a (item) + performance_item_get_b (item);
}
return sum;
}
int
main (int argc,
char *argv[])
{
GVariant *v;
gconstpointer serialized_data;
int i, count = 100000;
guint64 total;
GTimer *timer = g_timer_new ();
PerformanceContainerRef c;
#define DATA "(int16 17, 32, 'foobar', [(44, uint16 12), (48, uint16 14), (99, uint16 100)], byte 128, (uint16 4, byte 11))"
v = g_variant_new_parsed (DATA);
g_assert (g_variant_type_equal (g_variant_get_type (v), PERFORMANCE_CONTAINER_TYPEFORMAT));
/* Ensure data is serialized */
serialized_data = g_variant_get_data (v);
/* Warmup */
total = 0;
for (i = 0; i < 10; i++)
total += sum_gvariant (v);
g_assert (total == 10 * 515);
total = 0;
g_timer_start (timer);
for (i = 0; i < count; i++)
{
total += sum_gvariant (v);
total += sum_gvariant (v);
total += sum_gvariant (v);
total += sum_gvariant (v);
total += sum_gvariant (v);
}
g_timer_stop (timer);
g_assert (total == 5 * count * 515);
g_print ("GVariant performance: %.1f kiloiterations per second\n", (count/1000.0)/g_timer_elapsed (timer, NULL));
c = performance_container_from_gvariant (v);
/* Warmup */
total = 0;
for (i = 0; i < 10; i++)
total += sum_generated (c);
g_assert (total == 10 * 515);
g_timer_reset (timer);
total = 0;
g_timer_start (timer);
for (i = 0; i < count; i++)
{
total += sum_generated (c);
total += sum_generated (c);
total += sum_generated (c);
total += sum_generated (c);
total += sum_generated (c);
}
g_timer_stop (timer);
g_assert (total == 5 * count * 515);
g_print ("Generated performance: %.1f kiloiterations per second\n", (count/1000.0)/g_timer_elapsed (timer, NULL));
return 0;
}
|