2005-02-24 Andy Wingo <wingo@pobox.com>
+ * tests/bench-complexity.scm:
+ * tests/complexity.gnuplot: New files, good for running complexity
+ benchmarks.
+
* tests/Makefile.am:
* tests/complexity.c: New test, sets up N elements, at each level
teeing into M streams per element. Eeeenteresting.
--- /dev/null
+#!/bin/bash
+# -*- scheme -*-
+exec guile -s $0 "$@"
+!#
+
+;; Quick hack to make some data files that gnuplot can read from
+;; complexity. Guile 1.6.
+
+(use-modules (srfi srfi-13)
+ (srfi srfi-1)
+ (ice-9 optargs)
+ (ice-9 popen))
+
+(define *phases* '(create set run destroy))
+
+(define (read-lines port)
+ (let lp ((lines '()))
+ (let ((x (read-line port)))
+ (if (eof-object? x)
+ (begin
+ (close-port port)
+ (reverse! lines))
+ (lp (cons x lines))))))
+
+(define (parse-time str)
+ (and (char-numeric? (string-ref str 0))
+ (fold (lambda (x ret) (+ (* ret 60) x)) 0
+ (map (lambda (x) (with-input-from-string x read))
+ (string-split str #\:)))))
+
+(define (run-test program . args)
+ (format #t "; running test: ~a\n" (cons program args))
+ (map
+ cons
+ *phases*
+ (filter-map
+ parse-time
+ (read-lines
+ (open-input-pipe
+ (string-join (map object->string (cons program args)) " "))))))
+
+(define (seq start stop step)
+ (let lp ((n start) (out '()))
+ (if (> n stop)
+ (reverse! out)
+ (lp (+ n step) (cons n out)))))
+
+(define (run-tests n-elements)
+ (let lp ((x 1) (out '()))
+ (if (> x n-elements)
+ (reverse! out)
+ (lp (* x 2)
+ (acons x (run-test "./complexity" x n-elements) out)))))
+
+(define (output-results results)
+ (let ((p (open-output-file "complexity.data")))
+ (display "#complexity creation state-change run destroy\n" p)
+ (for-each
+ (lambda (line)
+ (display (car line) p)
+ (for-each
+ (lambda (t) (format p " ~a" t))
+ (map cdr (cdr line)))
+ (newline p))
+ results)
+ (close-port p)))
+
+(output-results
+ (apply run-tests (map string->number (cdr (program-arguments)))))
e = gst_element_factory_make ("fakesrc", NULL);
g_object_set (e, "num-buffers", BUFFER_COUNT, NULL);
+ g_object_set (e, "silent", TRUE, NULL);
gst_bin_add (GST_BIN (pipeline), e);
src_list = saved_src_list = g_slist_append (NULL, e);
for (i = 0, j = 0; i < n_elements; i++, j++) {
if (j >= max_this_level) {
g_slist_free (saved_src_list);
- saved_src_list = new_src_list;
+ saved_src_list = g_slist_reverse (new_src_list);
new_src_list = NULL;
j = 0;
all_srcs_linked = FALSE;
src = (GstElement *) src_list->data;
src_list = src_list->next;
- e = gst_element_factory_make ("tee", NULL);
+ if (i + max_this_level < n_elements)
+ e = gst_element_factory_make ("tee", NULL);
+ else
+ e = gst_element_factory_make ("fakesink", NULL);
+ g_object_set (e, "silent", TRUE, NULL);
new_src_list = g_slist_prepend (new_src_list, e);
gst_bin_add (GST_BIN (pipeline), e);
g_assert_not_reached ();
}
- if (all_srcs_linked)
- src_list = new_src_list;
- else
- src_list = g_slist_concat (new_src_list, g_slist_copy (src_list));
-
- g_slist_free (saved_src_list);
- saved_src_list = src_list;
- while (src_list) {
- src = (GstElement *) src_list->data;
- src_list = src_list->next;
-
- e = gst_element_factory_make ("fakesink", NULL);
- gst_bin_add (GST_BIN (pipeline), e);
- if (gst_element_link (src, e) != GST_PAD_LINK_OK)
- g_assert_not_reached ();
- }
g_slist_free (saved_src_list);
+ g_slist_free (new_src_list);
end = gst_get_current_time ();
- g_print ("%" GST_TIME_FORMAT " - creating and linking %d tee elements\n",
+ g_print ("%" GST_TIME_FORMAT " - creating and linking %d elements\n",
GST_TIME_ARGS (end - start), i);
start = gst_get_current_time ();
--- /dev/null
+set terminal postscript landscape monochrome dashed "Helvetica" 14
+set xlabel "Number of Forks Per Tee"
+set ylabel "Seconds"
+set logscale x
+set title "Complex Pipeline Performance: N Forks per Tee, 1024 Elements"
+plot "complexity.data" using 1:2 title "Element creation", \
+ "complexity.data" using 1:3 title "State change", \
+ "complexity.data" using 1:4 title "Processing 1000 buffers", \
+ "complexity.data" using 1:5 title "Element destruction"
--- /dev/null
+#!/bin/bash
+# -*- scheme -*-
+exec guile -s $0 "$@"
+!#
+
+;; Quick hack to make some data files that gnuplot can read from
+;; complexity. Guile 1.6.
+
+(use-modules (srfi srfi-13)
+ (srfi srfi-1)
+ (ice-9 optargs)
+ (ice-9 popen))
+
+(define *phases* '(create set run destroy))
+
+(define (read-lines port)
+ (let lp ((lines '()))
+ (let ((x (read-line port)))
+ (if (eof-object? x)
+ (begin
+ (close-port port)
+ (reverse! lines))
+ (lp (cons x lines))))))
+
+(define (parse-time str)
+ (and (char-numeric? (string-ref str 0))
+ (fold (lambda (x ret) (+ (* ret 60) x)) 0
+ (map (lambda (x) (with-input-from-string x read))
+ (string-split str #\:)))))
+
+(define (run-test program . args)
+ (format #t "; running test: ~a\n" (cons program args))
+ (map
+ cons
+ *phases*
+ (filter-map
+ parse-time
+ (read-lines
+ (open-input-pipe
+ (string-join (map object->string (cons program args)) " "))))))
+
+(define (seq start stop step)
+ (let lp ((n start) (out '()))
+ (if (> n stop)
+ (reverse! out)
+ (lp (+ n step) (cons n out)))))
+
+(define (run-tests n-elements)
+ (let lp ((x 1) (out '()))
+ (if (> x n-elements)
+ (reverse! out)
+ (lp (* x 2)
+ (acons x (run-test "./complexity" x n-elements) out)))))
+
+(define (output-results results)
+ (let ((p (open-output-file "complexity.data")))
+ (display "#complexity creation state-change run destroy\n" p)
+ (for-each
+ (lambda (line)
+ (display (car line) p)
+ (for-each
+ (lambda (t) (format p " ~a" t))
+ (map cdr (cdr line)))
+ (newline p))
+ results)
+ (close-port p)))
+
+(output-results
+ (apply run-tests (map string->number (cdr (program-arguments)))))
e = gst_element_factory_make ("fakesrc", NULL);
g_object_set (e, "num-buffers", BUFFER_COUNT, NULL);
+ g_object_set (e, "silent", TRUE, NULL);
gst_bin_add (GST_BIN (pipeline), e);
src_list = saved_src_list = g_slist_append (NULL, e);
for (i = 0, j = 0; i < n_elements; i++, j++) {
if (j >= max_this_level) {
g_slist_free (saved_src_list);
- saved_src_list = new_src_list;
+ saved_src_list = g_slist_reverse (new_src_list);
new_src_list = NULL;
j = 0;
all_srcs_linked = FALSE;
src = (GstElement *) src_list->data;
src_list = src_list->next;
- e = gst_element_factory_make ("tee", NULL);
+ if (i + max_this_level < n_elements)
+ e = gst_element_factory_make ("tee", NULL);
+ else
+ e = gst_element_factory_make ("fakesink", NULL);
+ g_object_set (e, "silent", TRUE, NULL);
new_src_list = g_slist_prepend (new_src_list, e);
gst_bin_add (GST_BIN (pipeline), e);
g_assert_not_reached ();
}
- if (all_srcs_linked)
- src_list = new_src_list;
- else
- src_list = g_slist_concat (new_src_list, g_slist_copy (src_list));
-
- g_slist_free (saved_src_list);
- saved_src_list = src_list;
- while (src_list) {
- src = (GstElement *) src_list->data;
- src_list = src_list->next;
-
- e = gst_element_factory_make ("fakesink", NULL);
- gst_bin_add (GST_BIN (pipeline), e);
- if (gst_element_link (src, e) != GST_PAD_LINK_OK)
- g_assert_not_reached ();
- }
g_slist_free (saved_src_list);
+ g_slist_free (new_src_list);
end = gst_get_current_time ();
- g_print ("%" GST_TIME_FORMAT " - creating and linking %d tee elements\n",
+ g_print ("%" GST_TIME_FORMAT " - creating and linking %d elements\n",
GST_TIME_ARGS (end - start), i);
start = gst_get_current_time ();
--- /dev/null
+set terminal postscript landscape monochrome dashed "Helvetica" 14
+set xlabel "Number of Forks Per Tee"
+set ylabel "Seconds"
+set logscale x
+set title "Complex Pipeline Performance: N Forks per Tee, 1024 Elements"
+plot "complexity.data" using 1:2 title "Element creation", \
+ "complexity.data" using 1:3 title "State change", \
+ "complexity.data" using 1:4 title "Processing 1000 buffers", \
+ "complexity.data" using 1:5 title "Element destruction"