mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
chore: add apps for profiling
This commit is contained in:
75
apps/new/src/plugin-demos/properties.ts
Normal file
75
apps/new/src/plugin-demos/properties.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { Button, EventData, Page, Switch, View, getViewById, Observable, Label, PropertyChangeData } from '@nativescript/core';
|
||||
|
||||
export function navigatingTo(args: EventData) {
|
||||
const page = <Page>args.object;
|
||||
|
||||
page.bindingContext = new DemoModel(page);
|
||||
}
|
||||
|
||||
export class DemoModel extends Observable {
|
||||
private readonly manualProfiling: Switch;
|
||||
private readonly automatedProfiling: Button;
|
||||
private readonly target: Label;
|
||||
|
||||
private automatedProfilingInProgress = false;
|
||||
|
||||
constructor(container: View) {
|
||||
super();
|
||||
|
||||
this.manualProfiling = getViewById(container, 'manual-profiling') as Switch;
|
||||
this.automatedProfiling = getViewById(container, 'automated-profiling') as Button;
|
||||
this.target = getViewById(container, 'target') as Label;
|
||||
}
|
||||
|
||||
toggleManualProfiling({ value }: PropertyChangeData): void {
|
||||
console.log(`toggleManualProfiling changed to ${value}. manualProfiling:`, this.manualProfiling);
|
||||
this.updateAutomatedProfilingEnabled();
|
||||
}
|
||||
|
||||
runAutomatedProfiling(): void {
|
||||
if (this.automatedProfilingInProgress) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`runAutomatedProfiling. automatedProfiling:`, this.automatedProfiling);
|
||||
this.automatedProfilingInProgress = true;
|
||||
this.updateAutomatedProfilingEnabled();
|
||||
|
||||
const propName = 'arbitrary-prop';
|
||||
|
||||
// Initialise the target property so that the first property-setting action
|
||||
// doesn't produce an outlier result due to taking a one-off code branch.
|
||||
this.target.setProperty(propName, -1);
|
||||
|
||||
const onPropertyChange = () => {
|
||||
// No-op
|
||||
};
|
||||
|
||||
this.target.addEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
||||
|
||||
const time = profile(() => {
|
||||
for (let i = 0; i < 1000000; i++) {
|
||||
this.target.setProperty(propName, i);
|
||||
}
|
||||
});
|
||||
|
||||
this.target.removeEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
||||
|
||||
console.log(`1,000,000 runs of setProperty() took ${time} ms`);
|
||||
|
||||
this.automatedProfilingInProgress = false;
|
||||
this.updateAutomatedProfilingEnabled();
|
||||
}
|
||||
|
||||
private updateAutomatedProfilingEnabled(): void {
|
||||
this.automatedProfiling.isEnabled = !this.automatedProfilingInProgress && !this.manualProfiling.checked;
|
||||
}
|
||||
}
|
||||
|
||||
function profile(action: () => void) {
|
||||
const start = global.isIOS ? (global as any).performance.now() : __time();
|
||||
action();
|
||||
const stop = global.isIOS ? (global as any).performance.now() : __time();
|
||||
|
||||
return stop - start;
|
||||
}
|
||||
Reference in New Issue
Block a user