Skip to content

Commit 1d76e9a

Browse files
authored
Add simple JS init performance trace (#31459)
Related to #23461, and help some cases like #31412 For developers, they could use browser's Performance tool to collect performance data, while this PR is also quite handy to optimize the `index.js`. For end users, this PR is simple enough and could figure out the slow function quickly. ![image](https://github.com/go-gitea/gitea/assets/2114189/a557b08e-6594-474b-81a3-03d5ac2bd68e)
1 parent 1a811c0 commit 1d76e9a

File tree

1 file changed

+129
-101
lines changed

1 file changed

+129
-101
lines changed

web_src/js/index.js

Lines changed: 129 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -94,110 +94,138 @@ import {
9494
import {initGlobalDropzone} from './features/dropzone.js';
9595
import {initGlobalEnterQuickSubmit, initGlobalFormDirtyLeaveConfirm} from './features/common-form.js';
9696

97-
// Init Gitea's Fomantic settings
9897
initGiteaFomantic();
9998
initDirAuto();
10099
initSubmitEventPolyfill();
101100

101+
function callInitFunctions(functions) {
102+
// Start performance trace by accessing a URL by "https://localhost/?_ui_performance_trace=1" or "https://localhost/?key=value&_ui_performance_trace=1"
103+
// It is a quick check, no side effect so no need to do slow URL parsing.
104+
const initStart = performance.now();
105+
if (window.location.search.includes('_ui_performance_trace=1')) {
106+
let results = [];
107+
for (const func of functions) {
108+
const start = performance.now();
109+
func();
110+
results.push({name: func.name, dur: performance.now() - start});
111+
}
112+
results = results.sort((a, b) => b.dur - a.dur);
113+
for (let i = 0; i < 20 && i < results.length; i++) {
114+
// eslint-disable-next-line no-console
115+
console.log(`performance trace: ${results[i].name} ${results[i].dur.toFixed(3)}`);
116+
}
117+
} else {
118+
for (const func of functions) {
119+
func();
120+
}
121+
}
122+
const initDur = performance.now() - initStart;
123+
if (initDur > 500) {
124+
console.error(`slow init functions took ${initDur.toFixed(3)}ms`);
125+
}
126+
}
127+
102128
onDomReady(() => {
103-
initGlobalDropdown();
104-
initGlobalTabularMenu();
105-
initGlobalShowModal();
106-
initGlobalFetchAction();
107-
initGlobalTooltips();
108-
initGlobalButtonClickOnEnter();
109-
initGlobalButtons();
110-
initGlobalCopyToClipboardListener();
111-
initGlobalDropzone();
112-
initGlobalEnterQuickSubmit();
113-
initGlobalFormDirtyLeaveConfirm();
114-
initGlobalDeleteButton();
115-
116-
initCommonOrganization();
117-
initCommonIssueListQuickGoto();
118-
119-
initCompSearchUserBox();
120-
initCompWebHookEditor();
121-
122-
initInstall();
123-
124-
initHeadNavbarContentToggle();
125-
initFootLanguageMenu();
126-
127-
initCommentContent();
128-
initContextPopups();
129-
initHeatmap();
130-
initImageDiff();
131-
initMarkupAnchors();
132-
initMarkupContent();
133-
initSshKeyFormParser();
134-
initStopwatch();
135-
initTableSort();
136-
initAutoFocusEnd();
137-
initFindFileInRepo();
138-
initCopyContent();
139-
140-
initAdminCommon();
141-
initAdminEmails();
142-
initAdminUserListSearchForm();
143-
initAdminConfigs();
144-
initAdminSelfCheck();
145-
146-
initDashboardRepoList();
147-
148-
initNotificationCount();
149-
initNotificationsTable();
150-
151-
initOrgTeamSearchRepoBox();
152-
initOrgTeamSettings();
153-
154-
initRepoActivityTopAuthorsChart();
155-
initRepoArchiveLinks();
156-
initRepoBranchButton();
157-
initRepoCodeView();
158-
initRepoCommentForm();
159-
initRepoEllipsisButton();
160-
initRepoDiffCommitBranchesAndTags();
161-
initRepoEditor();
162-
initRepoGraphGit();
163-
initRepoIssueContentHistory();
164-
initRepoIssueDue();
165-
initRepoIssueList();
166-
initRepoIssueSidebarList();
167-
initArchivedLabelHandler();
168-
initRepoIssueReferenceRepositorySearch();
169-
initRepoIssueTimeTracking();
170-
initRepoIssueWipTitle();
171-
initRepoMigration();
172-
initRepoMigrationStatusChecker();
173-
initRepoProject();
174-
initRepoPullRequestMergeInstruction();
175-
initRepoPullRequestAllowMaintainerEdit();
176-
initRepoPullRequestReview();
177-
initRepoRelease();
178-
initRepoReleaseNew();
179-
initRepoSettingGitHook();
180-
initRepoSettingSearchTeamBox();
181-
initRepoSettingsCollaboration();
182-
initRepoTemplateSearch();
183-
initRepoTopicBar();
184-
initRepoUncycloForm();
185-
initRepository();
186-
initRepositoryActionView();
187-
initRepositorySearch();
188-
initRepoContributors();
189-
initRepoCodeFrequency();
190-
initRepoRecentCommits();
191-
192-
initCommitStatuses();
193-
initCaptcha();
194-
195-
initUserAuthOauth2();
196-
initUserAuthWebAuthn();
197-
initUserAuthWebAuthnRegister();
198-
initUserSettings();
199-
initRepoDiffView();
200-
initPdfViewer();
201-
initScopedAccessTokenCategories();
202-
initColorPickers();
129+
callInitFunctions([
130+
initGlobalDropdown,
131+
initGlobalTabularMenu,
132+
initGlobalShowModal,
133+
initGlobalFetchAction,
134+
initGlobalTooltips,
135+
initGlobalButtonClickOnEnter,
136+
initGlobalButtons,
137+
initGlobalCopyToClipboardListener,
138+
initGlobalDropzone,
139+
initGlobalEnterQuickSubmit,
140+
initGlobalFormDirtyLeaveConfirm,
141+
initGlobalDeleteButton,
142+
143+
initCommonOrganization,
144+
initCommonIssueListQuickGoto,
145+
146+
initCompSearchUserBox,
147+
initCompWebHookEditor,
148+
149+
initInstall,
150+
151+
initHeadNavbarContentToggle,
152+
initFootLanguageMenu,
153+
154+
initCommentContent,
155+
initContextPopups,
156+
initHeatmap,
157+
initImageDiff,
158+
initMarkupAnchors,
159+
initMarkupContent,
160+
initSshKeyFormParser,
161+
initStopwatch,
162+
initTableSort,
163+
initAutoFocusEnd,
164+
initFindFileInRepo,
165+
initCopyContent,
166+
167+
initAdminCommon,
168+
initAdminEmails,
169+
initAdminUserListSearchForm,
170+
initAdminConfigs,
171+
initAdminSelfCheck,
172+
173+
initDashboardRepoList,
174+
175+
initNotificationCount,
176+
initNotificationsTable,
177+
178+
initOrgTeamSearchRepoBox,
179+
initOrgTeamSettings,
180+
181+
initRepoActivityTopAuthorsChart,
182+
initRepoArchiveLinks,
183+
initRepoBranchButton,
184+
initRepoCodeView,
185+
initRepoCommentForm,
186+
initRepoEllipsisButton,
187+
initRepoDiffCommitBranchesAndTags,
188+
initRepoEditor,
189+
initRepoGraphGit,
190+
initRepoIssueContentHistory,
191+
initRepoIssueDue,
192+
initRepoIssueList,
193+
initRepoIssueSidebarList,
194+
initArchivedLabelHandler,
195+
initRepoIssueReferenceRepositorySearch,
196+
initRepoIssueTimeTracking,
197+
initRepoIssueWipTitle,
198+
initRepoMigration,
199+
initRepoMigrationStatusChecker,
200+
initRepoProject,
201+
initRepoPullRequestMergeInstruction,
202+
initRepoPullRequestAllowMaintainerEdit,
203+
initRepoPullRequestReview,
204+
initRepoRelease,
205+
initRepoReleaseNew,
206+
initRepoSettingGitHook,
207+
initRepoSettingSearchTeamBox,
208+
initRepoSettingsCollaboration,
209+
initRepoTemplateSearch,
210+
initRepoTopicBar,
211+
initRepoUncycloForm,
212+
initRepository,
213+
initRepositoryActionView,
214+
initRepositorySearch,
215+
initRepoContributors,
216+
initRepoCodeFrequency,
217+
initRepoRecentCommits,
218+
219+
initCommitStatuses,
220+
initCaptcha,
221+
222+
initUserAuthOauth2,
223+
initUserAuthWebAuthn,
224+
initUserAuthWebAuthnRegister,
225+
initUserSettings,
226+
initRepoDiffView,
227+
initPdfViewer,
228+
initScopedAccessTokenCategories,
229+
initColorPickers,
230+
]);
203231
});

0 commit comments

Comments
 (0)