1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-23 05:50:55 +01:00

Fix performance issue with large changesets in Differential

Summary:
Fixes T3151. Javelin treats a behavior without parameters as a global behavior and invokes it only once no matter how many times it is initialized (this is necessarily correct for any reasonable behavior, as the inputs do not vary). A recent patch changed `differential-dropdown-menus` from a zero-argument global behavior to an implicitly nonzero-argument behavior by adding `pht`.

Currently, we initialize the behavior next to dropdown menu creation, so this resulted in `O(N^2)` initializations of the menus. For large diffs, this locks browsers. Instead, initialize outside of the dropdown loop so we ginitialize each menu just once.

Test Plan: Viewed a 2,000 file diff without browser lock.

Reviewers: wez, vrana, btrahan

Reviewed By: wez

CC: aran

Maniphest Tasks: T3151

Differential Revision: https://secure.phabricator.com/D5885
This commit is contained in:
epriestley 2013-05-10 05:39:44 -07:00
parent 13464cc568
commit 7c502e3e4e

View file

@ -108,6 +108,9 @@ final class DifferentialChangesetListView extends AphrontView {
$changesets = $this->changesets; $changesets = $this->changesets;
Javelin::initBehavior('differential-toggle-files', array()); Javelin::initBehavior('differential-toggle-files', array());
Javelin::initBehavior(
'differential-dropdown-menus',
array());
$output = array(); $output = array();
$mapping = array(); $mapping = array();
@ -304,10 +307,6 @@ final class DifferentialChangesetListView extends AphrontView {
$meta['containerID'] = $detail->getID(); $meta['containerID'] = $detail->getID();
Javelin::initBehavior(
'differential-dropdown-menus',
array());
return javelin_tag( return javelin_tag(
'a', 'a',
array( array(