mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
feat: profiling setup
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { Button, EventData, Page, Switch, View, getViewById, Observable, Label, PropertyChangeData } from '@nativescript/core';
|
import { Button, EventData, Page, Switch, View, getViewById, Observable, Label, PropertyChangeData } from '@nativescript/core';
|
||||||
|
import { jamieProfiler } from '@nativescript/core/profiling/jamie';
|
||||||
|
|
||||||
export function navigatingTo(args: EventData) {
|
export function navigatingTo(args: EventData) {
|
||||||
const page = <Page>args.object;
|
const page = <Page>args.object;
|
||||||
@@ -47,11 +48,22 @@ export class DemoModel extends Observable {
|
|||||||
|
|
||||||
this.target.addEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
this.target.addEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
||||||
|
|
||||||
|
jamieProfiler.flush();
|
||||||
|
|
||||||
|
console.log('BEGIN PROFILE');
|
||||||
const time = profile(() => {
|
const time = profile(() => {
|
||||||
for (let i = 0; i < 1000000; i++) {
|
for (let i = 0; i < 1000000; i++) {
|
||||||
this.target.setProperty(propName, i);
|
this.target.setProperty(propName, i);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
console.log('END PROFILE');
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
jamieProfiler
|
||||||
|
.report(jamieProfiler.flush())
|
||||||
|
.map(([key, value]) => `${key}: ${value} ms`)
|
||||||
|
.join('\n')
|
||||||
|
);
|
||||||
|
|
||||||
this.target.removeEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
this.target.removeEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,43 @@
|
|||||||
import { Button, EventData, Page, Switch, View, getViewById, Observable, Label, PropertyChangeData } from '@nativescript/core';
|
import { Button, EventData, Page, Switch, View, getViewById, Observable, Label, PropertyChangeData } from '@nativescript/core';
|
||||||
|
|
||||||
|
class Profiler {
|
||||||
|
private map: Record<string, number> = {};
|
||||||
|
|
||||||
|
profile<T>(key: string, action: () => T) {
|
||||||
|
const start = global.isIOS ? (global as any).performance.now() : __time();
|
||||||
|
const returnValue = action();
|
||||||
|
const stop = global.isIOS ? (global as any).performance.now() : __time();
|
||||||
|
const period = stop - start;
|
||||||
|
|
||||||
|
this.map[key] = (this.map[key] || 0) + period;
|
||||||
|
|
||||||
|
// console.log(`[PROFILE] ${key}: ${stop - start} ms`);
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
flush() {
|
||||||
|
const map = this.map;
|
||||||
|
this.map = {};
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
get(key: string) {
|
||||||
|
return this.map[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
report(map: Record<string, number> = this.map) {
|
||||||
|
return Object.entries(map).sort(([, valueA], [, valueB]) => {
|
||||||
|
return sortDescending(valueA, valueB);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sortDescending(a: number, b: number): 1 | 0 | -1 {
|
||||||
|
return a < b ? 1 : a > b ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const jamieProfiler = new Profiler();
|
||||||
|
|
||||||
export function navigatingTo(args: EventData) {
|
export function navigatingTo(args: EventData) {
|
||||||
const page = <Page>args.object;
|
const page = <Page>args.object;
|
||||||
|
|
||||||
@@ -47,11 +85,22 @@ export class DemoModel extends Observable {
|
|||||||
|
|
||||||
this.target.addEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
this.target.addEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
||||||
|
|
||||||
|
jamieProfiler.flush();
|
||||||
|
|
||||||
|
console.log('BEGIN PROFILE');
|
||||||
const time = profile(() => {
|
const time = profile(() => {
|
||||||
for (let i = 0; i < 1000000; i++) {
|
for (let i = 0; i < 1000000; i++) {
|
||||||
this.target.setProperty(propName, i);
|
this.target.setProperty(propName, i);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
console.log('END PROFILE');
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
jamieProfiler
|
||||||
|
.report(jamieProfiler.flush())
|
||||||
|
.map(([key, value]) => `${key}: ${value} ms`)
|
||||||
|
.join('\n')
|
||||||
|
);
|
||||||
|
|
||||||
this.target.removeEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
this.target.removeEventListener(Observable.propertyChangeEvent, onPropertyChange, null);
|
||||||
|
|
||||||
|
|||||||
37
packages/core/profiling/jamie.ts
Normal file
37
packages/core/profiling/jamie.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
class Profiler {
|
||||||
|
private map: Record<string, number> = {};
|
||||||
|
|
||||||
|
profile<T>(key: string, action: () => T) {
|
||||||
|
const start = global.isIOS ? (global as any).performance.now() : __time();
|
||||||
|
const returnValue = action();
|
||||||
|
const stop = global.isIOS ? (global as any).performance.now() : __time();
|
||||||
|
const period = stop - start;
|
||||||
|
|
||||||
|
this.map[key] = (this.map[key] || 0) + period;
|
||||||
|
|
||||||
|
// console.log(`[PROFILE] ${key}: ${stop - start} ms`);
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
flush() {
|
||||||
|
const map = this.map;
|
||||||
|
this.map = {};
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
get(key: string) {
|
||||||
|
return this.map[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
report(map: Record<string, number> = this.map) {
|
||||||
|
return Object.entries(map).sort(([, valueA], [, valueB]) => {
|
||||||
|
return sortDescending(valueA, valueB);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sortDescending(a: number, b: number): 1 | 0 | -1 {
|
||||||
|
return a < b ? 1 : a > b ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const jamieProfiler = new Profiler();
|
||||||
Reference in New Issue
Block a user