[buddypress-trac] [BuddyPress Trac] #6864: `bp_sort_by_key()` is slow
buddypress-trac
noreply at wordpress.org
Tue Feb 2 03:38:12 UTC 2016
#6864: `bp_sort_by_key()` is slow
--------------------------+-------------------------
Reporter: boonebgorges | Owner:
Type: defect (bug) | Status: new
Priority: normal | Milestone: 2.5
Component: API | Version:
Severity: normal | Keywords: 2nd-opinion
--------------------------+-------------------------
`bp_sort_by_key()` uses `create_function()` to create a `usort()`
callback. This process is very slow, especially when called hundreds of
times on a pageload.
See, eg, when pulling up large numbers of activity items ->
`bp_activity_generate_action_string()` -> `bp_activity_get_actions()`. In
my specific case, 70 activity items are being pulled up, which results in
`bp_activity_get_actions()` being called 70 times. Each time the latter
function is called, it causes each component's actions to be sorted
(another performance issue - I'll open a separate ticket). With 12
components, this results in `bp_sort_by_key()` being called 840 times.
In the above situation, with the current `create_function()`
implementation, the total wall time for `bp_sort_by_key()` is about
1,101,000 microseconds - more than 1 second.
Switching to an anonymous function brings the wall time down to about
27,000 microseconds, an improvement of over 400x. But anonymous functions
are only available in PHP 5.3. So I'd like to suggest one of the
following:
1. We use anonymous functions when available (eg, `if ( class_exists(
'Closure' ) )`)
2. We break the callback out into its own named function. But then we'll
need to put the `$key` and `$type` values into a global variable so
they're accessible in that function.
3. We fake PHP 5.3 callbacks using a technique like the last one on this
page http://codeblow.com/questions/pass-extra-parameters-to-usort-
callback/
Item 1 seems the most straightforward, but seeing as we don't do this
anywhere else in BP, I want to be sure that no one has a problem with the
approach.
--
Ticket URL: <https://buddypress.trac.wordpress.org/ticket/6864>
BuddyPress Trac <http://buddypress.org/>
BuddyPress Trac
More information about the buddypress-trac
mailing list