-
Notifications
You must be signed in to change notification settings - Fork 166
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
remove unnecessary re-renders to improve performance #160
Conversation
with shouldComponentUopdate false to avoid unecessary re-renders - test
+removed unused styling, commented out for now in case it's needed, eg in mobile view?
on how to prevent uncessary re-renders in React
about using console.log in render to measure performance
Trying out |
… performance tweak using react-visibility-sensor
To review this PR you need to run npm install as I’ve added
|
Something else to think about for a separate PR is the idea of pagination. Context: DraftJS use case at FB is for small comments areas and Facebook notes. So not sure it has been tested agains large quantities of text or Many paragraphs (link to issue) or that they will ever have a use case to optimise for that (?). Another option would be to reduce the amount of content in Draft at any given time, only to what is visible. Eg at a high level it could use a pagination approach, similar to what is described in this blog post (without Redux!) so that every time scrolling up or down, it moves/changes the paragraphs that are visible in the editor. Eg the wrapper component keeps an array of paragraphs, and a range of indexes to the once visible in draftJs, then some logic handles swapping the current paragraphs... etc.. Done in this way pagination would be hidden from the users UI/UX, eg it wouldn't look like paginated text, but it could provide a considerable performance boost. |
6f07327
to
96f6e6d
Compare
Hi @pietrop is the paginating issue is still pending ? Shall I give it a try with React hooks and context ? |
Hi @sshniro, I am not sure hooks and context would necessarily help with the specifics tho, as the solution might entail working around the draftJs component specific performance issues, what did you have in mind? |
Aw sry my bad, I thought of handling the entire state out of draft , now only read the linked article. Ill play around with draft js and get back, thanks ! 👍 |
Awesome! Looking forward to it! |
@@ -56,6 +46,64 @@ class TranscriptEditor extends React.Component { | |||
return null; | |||
} | |||
|
|||
// performance optimization |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In this block, we have every single part of the state accounted for and checked, plus also one Prop (mediaUrl).
I checked there weren't any other special cases, but no it's looking at every single state property. So!
Instead of doing all that, we could write:
shouldComponentUpdate = (nextProps, nextState) => {
if (nextProps.mediaUrl !== this.props.mediaUrl) return true;
return nextState !== this.state;
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't see any difference in performance or side-effects from that. If this is alright, I think we should do the same thing in the other places (as it's adding a lot of verbose and redundant code).
Thanks @jamesdools added most of the changes in #175. Going to do a separate PR for the should component update tweaks against the develop branch, to make those changes a little clearer and easier to review. Closing this for now, as Develop is up to date with it. |
addressed should component update in this standalone PR #182 |
* added support for docx - needs better integration altho it works * adding timecodes and speakers to plain text export * develop: Fix 159 performance problem (#171) * moved header into a component with shouldComponentUopdate false to avoid unecessary re-renders - test * moved Header component into separate file +removed unused styling, commented out for now in case it's needed, eg in mobile view? * moved playback_rates const into separate file * optimised re-render of playback rate * optimise re-render for VideoPlayer * added some notes - draft on how to prevent uncessary re-renders in React * Added some comments * small note in docs about using console.log in render to measure performance * ammend to notes * Update 2019-05-16-prevent-unnecessary-re-renders-in-react.md * notes update * notes fix * trying out why-did-you-update * updated MediaPlayer and subcomponents * made ToolTip 'how does this work' into it's own component * updated Demo app to reduce unecessary re-renders * added react-visibility-sensor * refactor settings * removed unecessary attributes from state of components + WrapperBlock performance tweak using react-visibility-sensor * develop: Update timestamps diff (#172) * Added timestamp update via diff tool * Added missing function * Commited intermediate state * Rewrote timestamp alignment and differ to be integrated in each other instead of doing a 2-step process. * Update Timestamps now works correctly. * Fixed errors from rebase, removed debug code * Moved UpdateTimestamp into its own folder. * added updateTimestampsSSTAlign which updates the timestamps with the sst-align code * Added documentation * Merged timer for updating the timestamps and local save. * Selection state is now kept across updates to timestamps * Fixed bug where words with punctuation always are considered as new words. Timestamp update function now also uses the alignWords function directly instead of alignJSONText, removing some overhead. * Fixed small bug which raised an error if an empty block was present during timestamp update * Changed time of timestamp-update. Now re-calculates the timestamps after 5 seconds if the transcript has been edited or if the user saves the transcript manually with the save button * Code cleanup * develop: Murezzda update timestamps diff (#173) * Added timestamp update via diff tool * Added missing function * Commited intermediate state * Rewrote timestamp alignment and differ to be integrated in each other instead of doing a 2-step process. * Update Timestamps now works correctly. * Fixed errors from rebase, removed debug code * Moved UpdateTimestamp into its own folder. * added updateTimestampsSSTAlign which updates the timestamps with the sst-align code * Added timestamp update via diff tool * Added missing function * Commited intermediate state * Rewrote timestamp alignment and differ to be integrated in each other instead of doing a 2-step process. * Update Timestamps now works correctly. * Fixed errors from rebase, removed debug code * Moved UpdateTimestamp into its own folder. * added updateTimestampsSSTAlign which updates the timestamps with the sst-align code * Added documentation * Merged timer for updating the timestamps and local save. * Selection state is now kept across updates to timestamps * Fixed bug where words with punctuation always are considered as new words. Timestamp update function now also uses the alignWords function directly instead of alignJSONText, removing some overhead. * Fixed small bug which raised an error if an empty block was present during timestamp update * Changed time of timestamp-update. Now re-calculates the timestamps after 5 seconds if the transcript has been edited or if the user saves the transcript manually with the save button * Code cleanup * some changes to show sudgestions for PR * added some of changes sudgested in PR * Update package.json * develop: Murezzda update timestamps diff dpe groups words by speaker (#174) * Added timestamp update via diff tool * Added missing function * Commited intermediate state * Rewrote timestamp alignment and differ to be integrated in each other instead of doing a 2-step process. * Update Timestamps now works correctly. * Fixed errors from rebase, removed debug code * Moved UpdateTimestamp into its own folder. * added updateTimestampsSSTAlign which updates the timestamps with the sst-align code * Added timestamp update via diff tool * Added missing function * Commited intermediate state * Rewrote timestamp alignment and differ to be integrated in each other instead of doing a 2-step process. * Update Timestamps now works correctly. * Fixed errors from rebase, removed debug code * Moved UpdateTimestamp into its own folder. * added updateTimestampsSSTAlign which updates the timestamps with the sst-align code * Added documentation * Merged timer for updating the timestamps and local save. * Selection state is now kept across updates to timestamps * Fixed bug where words with punctuation always are considered as new words. Timestamp update function now also uses the alignWords function directly instead of alignJSONText, removing some overhead. * Fixed small bug which raised an error if an empty block was present during timestamp update * Changed time of timestamp-update. Now re-calculates the timestamps after 5 seconds if the transcript has been edited or if the user saves the transcript manually with the save button * Code cleanup * some changes to show sudgestions for PR * added some of changes sudgested in PR * adjusted DPE adapter so that it preserves paragraphs break within contiguos speakers * fixed one test * commented out auto align left aligning as a step before save btn and before export function, rather then as a step that happens everytime autosave is triggered, as that might be unecessary, and add performance overhead, I also noticed the cursor position jumped after realignement, thought something was been put in place to preserve/avoid that? * updated package-lock * fixed vulneranilities * Getting ready to publish alpha * 1.0.4-alpha.0 * 1.0.4@alpha * fixed notes * changing speaker and timecodes to be unselectable * 1.0.4-alpha.1 * 1.0.4-alpha.1 unselectabel speakers and timecodes * fix speaker and timecodes at paragraph level after realignement * 1.0.4-alpha.2 * fixed docx integration * Subtitles export (#168) * added option to export srt files and layout to export other type of captions with auto segmentation of lines * added support for other subtitles formats * fixed npm audit * implemented export in UI * fixed test added sample files for adding tests for subtitle composer module at later stage * added optional analytics for export download options * updated CSS * 1.0.4-alpha.3 * fixed subtiles segmentation algo was picking the wrong words from the list * moved PR template in github folder * cleaned up code for subtitles parsing * 1.0.4-alpha.4 * fixed alignement algo after interpolation words time boundares where overlapping * fixed interpolation * fixed filename of word doc export * fixed TimeBox and playback rate not working * 1.0.4-alpha.5 * removed scroll sync (#181) fix #180 * refactor changes from James review #160 * Develop branch - should component update refactor (#182) * Refactor should component updatre for transcript editor * Refactor should component updatre for PlayerControls * Refactor should component updatre for TimeBox * Refactor should component update for ProgressBar * Refactor should component update for TimedTextEditor * Refactor should component update for Header * fix from PR review Fixed from James comments from #144 (review) * Update package.json * Update package.json
Is your Pull Request request related to another issue in this repository ?
This issue #159
Describe what the PR does
Moved
header
into a component withshouldComponentUopdate
false to test avoid unecessary re-renders - testState whether the PR is ready for review or whether it needs extra work
work in progress
Additional context