summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2014-07-30 12:09:01 +0200
committerAlexander Larsson <alexl@redhat.com>2014-07-30 12:10:30 +0200
commit2266f6b743a5a4e4d560238ebd085bf0e1ad8934 (patch)
tree8bc4b0407c495a6f6589cc98b0a8779b648a1f88
parent03b510fde17b130dd7273cee6a65e2d54ff85fff (diff)
tests/gobject/performance: Clean up and add refcount performance test
-rw-r--r--tests/gobject/performance.c129
1 files changed, 119 insertions, 10 deletions
diff --git a/tests/gobject/performance.c b/tests/gobject/performance.c
index e4cb736a0..cd4554323 100644
--- a/tests/gobject/performance.c
+++ b/tests/gobject/performance.c
@@ -27,7 +27,7 @@
* be large enough compared to the timer resolution, but small
* enought that the risk of any random slowness will miss the
* running window */
-#define TARGET_ROUND_TIME 0.004
+#define TARGET_ROUND_TIME 0.008
static gboolean verbose = FALSE;
static int test_length = DEFAULT_TEST_TIME;
@@ -65,7 +65,7 @@ run_test (PerformanceTest *test)
{
gpointer data = NULL;
guint64 i, num_rounds;
- double elapsed, min_elapsed, factor;
+ double elapsed, min_elapsed, max_elapsed, avg_elapsed, factor;
GTimer *timer;
g_print ("Running test %s\n", test->name);
@@ -77,6 +77,8 @@ run_test (PerformanceTest *test)
if (verbose)
g_print ("Warming up\n");
+ g_timer_start (timer);
+
/* Warm up the test by doing a few runs */
for (i = 0; i < WARM_UP_N_RUNS; i++)
{
@@ -85,8 +87,14 @@ run_test (PerformanceTest *test)
test->finish (test, data);
}
+ g_timer_stop (timer);
+ elapsed = g_timer_elapsed (timer, NULL);
+
if (verbose)
- g_print ("Estimating round time\n");
+ {
+ g_print ("Warm up time: %.2f secs\n", elapsed);
+ g_print ("Estimating round time\n");
+ }
/* Estimate time for one run by doing a few test rounds */
min_elapsed = 0;
@@ -108,7 +116,7 @@ run_test (PerformanceTest *test)
factor = TARGET_ROUND_TIME / min_elapsed;
if (verbose)
- g_print ("Uncorrected round time: %f.4 secs, correction factor %f.2\n", min_elapsed, factor);
+ g_print ("Uncorrected round time: %.4f msecs, correction factor %.2f\n", 1000*min_elapsed, factor);
/* Calculate number of rounds needed */
num_rounds = (test_length / TARGET_ROUND_TIME) + 1;
@@ -127,14 +135,23 @@ run_test (PerformanceTest *test)
elapsed = g_timer_elapsed (timer, NULL);
if (i == 0)
- min_elapsed = elapsed;
+ max_elapsed = min_elapsed = avg_elapsed = elapsed;
else
- min_elapsed = MIN (min_elapsed, elapsed);
+ {
+ min_elapsed = MIN (min_elapsed, elapsed);
+ max_elapsed = MAX (max_elapsed, elapsed);
+ avg_elapsed += elapsed;
+ }
}
- if (verbose)
- g_print ("Minimum corrected round time: %f secs\n", min_elapsed);
+ avg_elapsed = avg_elapsed / num_rounds;
+ if (verbose)
+ {
+ g_print ("Minimum corrected round time: %.2f msecs\n", min_elapsed * 1000);
+ g_print ("Maximum corrected round time: %.2f msecs\n", max_elapsed * 1000);
+ g_print ("Average corrected round time: %.2f msecs\n", avg_elapsed * 1000);
+ }
/* Print the results */
test->print_result (test, data, min_elapsed);
@@ -512,8 +529,8 @@ test_construction_print_result (PerformanceTest *test,
{
struct ConstructionTest *data = _data;
- g_print ("Number of constructed objects per second: %.0f\n",
- data->n_objects / time);
+ g_print ("Millions of constructed objects per second: %.3f\n",
+ data->n_objects / (time * 1000000));
}
/*************************************************************
@@ -768,6 +785,88 @@ test_emission_handled_teardown (PerformanceTest *test,
}
/*************************************************************
+ * Test object refcount performance
+ *************************************************************/
+
+#define NUM_KILO_REFS_PER_ROUND 100000
+
+struct RefcountTest {
+ GObject *object;
+ int n_checks;
+};
+
+static gpointer
+test_refcount_setup (PerformanceTest *test)
+{
+ struct RefcountTest *data;
+
+ data = g_new0 (struct RefcountTest, 1);
+ data->object = g_object_new (COMPLEX_TYPE_OBJECT, NULL);
+
+ return data;
+}
+
+static void
+test_refcount_init (PerformanceTest *test,
+ gpointer _data,
+ double factor)
+{
+ struct RefcountTest *data = _data;
+
+ data->n_checks = factor * NUM_KILO_REFS_PER_ROUND;
+}
+
+static void
+test_refcount_run (PerformanceTest *test,
+ gpointer _data)
+{
+ struct RefcountTest *data = _data;
+ GObject *object = data->object;
+ int i;
+
+ for (i = 0; i < data->n_checks; i++)
+ {
+ g_object_ref (object);
+ g_object_ref (object);
+ g_object_ref (object);
+ g_object_unref (object);
+ g_object_unref (object);
+
+ g_object_ref (object);
+ g_object_ref (object);
+ g_object_unref (object);
+ g_object_unref (object);
+ g_object_unref (object);
+ }
+}
+
+static void
+test_refcount_finish (PerformanceTest *test,
+ gpointer _data)
+{
+}
+
+static void
+test_refcount_print_result (PerformanceTest *test,
+ gpointer _data,
+ double time)
+{
+ struct RefcountTest *data = _data;
+ g_print ("Million refs+unref per second: %.2f\n",
+ data->n_checks * 5 / (time * 1000000 ));
+}
+
+static void
+test_refcount_teardown (PerformanceTest *test,
+ gpointer _data)
+{
+ struct RefcountTest *data = _data;
+
+ g_object_unref (data->object);
+ g_free (data);
+}
+
+/*************************************************************
* Main test code
*************************************************************/
@@ -901,6 +1000,16 @@ static PerformanceTest tests[] = {
test_emission_handled_finish,
test_emission_handled_teardown,
test_emission_handled_print_result
+ },
+ {
+ "refcount",
+ NULL,
+ test_refcount_setup,
+ test_refcount_init,
+ test_refcount_run,
+ test_refcount_finish,
+ test_refcount_teardown,
+ test_refcount_print_result
}
};