gstvalue: Speed up gst_value_intersect/_subtract
authorEdward Hervey <edward@collabora.com>
Tue, 17 Jun 2014 05:31:48 +0000 (07:31 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Tue, 17 Jun 2014 14:27:07 +0000 (16:27 +0200)
commitb0b20b44e5b9800a440252a135f09b67667fa88f
tree790599470bfd36b2d396735a38eb3ddd0bbfb016
parent5c62bce85c3d34dabe17af6d0ab2670c75bdd1f0
gstvalue: Speed up gst_value_intersect/_subtract

Both gst_value_intersect and gst_value_subtract will call
gst_value_compare if one of their arguments isn't a list.

gst_value_compare will then re-do a check to see if one of
the arguments is a list (for the special case of comparing a unitary
value with a list of length 1).

The problem is that the various G_VALUE_HOLDS represent an expensive
amount of calling gst_value_compare (almost half of it) to see if
the provided arguments are list. These checks can be done without
when we know that the arguments aren't lists.

* Create a new "nolist" gst_value_compare which avoids that special
  case comparision

Benchmarks:
 valgrind/callgrind: average speedup in instruction calls for
 gst_value_intersect and gst_value_subtract is around 56% (Makes 63%
 of the calls it used to take previously)

 tests/benchmarks/capsnego: With default settings (depth 4, children 3
 607 elements), time taken for transition from READY to PAUSED:
   Before : 00.391519153
   After  : 00.220397492
    56% of the time previously used, +77% speedup

https://bugzilla.gnome.org/show_bug.cgi?id=731756
gst/gstvalue.c