@@ -7,116 +7,81 @@ let theme = Themes.darkGold
77if ( urlParams . get ( 'theme' ) == 'light' )
88 theme = Themes . lightNew
99
10- let dataAmount = 1 * 1000 * 1000
10+ const dataAmountNumber = 5 * 1000 * 1000
11+ const dataAmountString = `${ dataAmountNumber / 10 ** 6 } M`
1112
12- // Generate random data using 'xydata' library.
13- let data : Point [ ]
14- const generateData = ( amount : number , after : ( ) => void ) => {
15- createProgressiveTraceGenerator ( )
16- . setNumberOfPoints ( amount + 1 )
17- . generate ( )
18- . toPromise ( )
19- . then ( ( generatedData ) => {
20- data = generatedData
21- after ( )
22- } )
23- }
24- generateData ( dataAmount , ( ) => {
25- measureRenderingSpeed ( )
26- } )
27-
28- const container = document . getElementById ( 'chart-container' ) as HTMLDivElement
29- // Create Chart.
3013const chart = lightningChart ( ) . ChartXY ( {
31- theme ,
32- container
14+ container : document . getElementById ( 'chart-container' ) as HTMLDivElement ,
15+ theme
3316} )
34- // Hide title.
3517 . setTitleFillStyle ( emptyFill )
36- // Minimize paddings.
37- . setPadding ( { left : 0 , bottom : 0 , right : 30 , top : 10 } )
38-
39- // Hide Chart with CSS until data is ready for rendering.
40- container . style . width = '0'
18+ . setPadding ( { right : 40 } )
4119
42- // Disable scrolling animations to view loaded data instantly.
4320const axisX = chart . getDefaultAxisX ( )
44- . setAnimationScroll ( undefined )
4521const axisY = chart . getDefaultAxisY ( )
46- . setAnimationScroll ( undefined )
4722
4823const series = chart . addLineSeries ( {
49- // Specifying progressive DataPattern enables some otherwise unusable optimizations.
5024 dataPattern : {
51- pattern : 'ProgressiveX'
25+ pattern : 'ProgressiveX' ,
26+ regularProgressiveStep : true ,
5227 }
5328} )
5429
55- const measureRenderingSpeed = ( ) => {
56- // Sync with next animation frame for correct time measurement.
57- requestAnimationFrame ( ( ) => {
58- // Show chart.
59- container . style . width = '100%'
60- indicatorRenderingSpeed . setText ( 'Rendering ...' )
61-
62- // Measure time required to render supplied data.
63- const tStart = window . performance . now ( )
30+ const uiLayout = chart . addUIElement ( UILayoutBuilders . Column , { x : axisX , y : axisY } )
31+ . setOrigin ( UIOrigins . LeftTop )
6432
65- series . add ( data )
33+ const positionUiLayout = ( ) => {
34+ uiLayout . setPosition ( {
35+ x : axisX . getInterval ( ) . start ,
36+ y : axisY . getInterval ( ) . end
37+ } )
38+ }
39+ positionUiLayout ( )
40+ axisX . onScaleChange ( positionUiLayout )
41+ axisY . onScaleChange ( positionUiLayout )
42+
43+ const labelGenerate = uiLayout . addElement ( UIElementBuilders . TextBox ) . setText ( `Generating ${ dataAmountString } data points...` )
44+ const labelGenerateResult = uiLayout . addElement ( UIElementBuilders . TextBox ) . setText ( `` ) . setTextFont ( ( font ) => font . setWeight ( 'bold' ) . setSize ( 12 ) )
45+ const labelAppend = uiLayout . addElement ( UIElementBuilders . TextBox ) . setText ( `` )
46+ const labelAppendResult = uiLayout . addElement ( UIElementBuilders . TextBox ) . setText ( `` ) . setTextFont ( ( font ) => font . setWeight ( 'bold' ) . setSize ( 12 ) )
47+ const labelRender = uiLayout . addElement ( UIElementBuilders . TextBox ) . setText ( `` )
48+ const labelRenderResult = uiLayout . addElement ( UIElementBuilders . TextBox ) . setText ( `` ) . setTextFont ( ( font ) => font . setWeight ( 'bold' ) . setSize ( 12 ) )
49+ const labelSubsequentRender = uiLayout . addElement ( UIElementBuilders . TextBox ) . setText ( `` )
50+ const labelSubsequentRenderResult = uiLayout . addElement ( UIElementBuilders . TextBox ) . setText ( `` ) . setTextFont ( ( font ) => font . setWeight ( 'bold' ) . setSize ( 12 ) )
51+
52+ const t0 = window . performance . now ( )
53+ createProgressiveTraceGenerator ( )
54+ . setNumberOfPoints ( dataAmountNumber )
55+ . generate ( )
56+ . toPromise ( )
57+ . then ( data => {
58+ const t1 = window . performance . now ( )
59+ const dGenerateData = t1 - t0
60+ labelGenerate . setText ( `Generate ${ dataAmountString } data points` )
61+ labelGenerateResult . setText ( `${ Math . round ( dGenerateData ) } ms` )
62+ labelAppend . setText ( `Append ${ dataAmountString } data points` )
63+ labelRender . setText ( `Render first frame with data` )
6664
67- // Subscribe to next animation frame to know how long it took to render.
6865 requestAnimationFrame ( ( ) => {
69- const tNow = window . performance . now ( )
70- const delay = tNow - tStart
71- // Display result using UI indicator.
72- indicatorRenderingSpeed . setText ( `${ ( delay / 1000 ) . toFixed ( 3 ) } seconds` )
66+ const t2 = window . performance . now ( )
67+ series . add ( data )
68+ axisX . fit ( false )
69+ axisY . fit ( false )
70+ const t3 = window . performance . now ( )
71+ const dAppendData = t3 - t2
72+ labelAppendResult . setText ( `${ Math . round ( dAppendData ) } ms` )
73+
74+ requestAnimationFrame ( ( ) => {
75+ const t4 = window . performance . now ( )
76+ const dRenderFrame = t4 - t3
77+ labelRenderResult . setText ( `${ Math . round ( dRenderFrame ) } ms` )
78+
79+ requestAnimationFrame ( ( ) => {
80+ const t5 = window . performance . now ( )
81+ const dRenderSubsequentFrame = t5 - t4
82+ labelSubsequentRender . setText ( `Render subsequent frame` )
83+ labelSubsequentRenderResult . setText ( `${ Math . round ( dRenderSubsequentFrame ) } ms` )
84+ } )
85+ } )
7386 } )
7487 } )
75- }
76-
77- // Create indicator for displaying rendering speed.
78- const indicatorLayout = chart . addUIElement < UIElementColumn < UIRectangle > > (
79- UILayoutBuilders . Column
80- . setBackground ( UIBackgrounds . Rectangle ) ,
81- // Position UIElement with Axis coordinates.
82- {
83- x : axisX ,
84- y : axisY
85- }
86- )
87- . setOrigin ( UIOrigins . LeftTop )
88- . setDraggingMode ( UIDraggingModes . notDraggable )
89-
90- // Reposition indicators whenever Axis scale is changed (to keep position static).
91- const repositionIndicator = ( ) =>
92- indicatorLayout . setPosition ( { x : axisX . getInterval ( ) . start , y : axisY . getInterval ( ) . end } )
93- repositionIndicator ( )
94- axisX . onScaleChange ( repositionIndicator )
95- axisY . onScaleChange ( repositionIndicator )
96-
97- indicatorLayout . addElement < UITextBox > ( UIElementBuilders . TextBox )
98- . setText ( `Rendering speed ${ ( dataAmount / ( 1 * 1000 * 1000 ) ) . toFixed ( 1 ) } million data points:` )
99-
100- // Rendering speed indicator.
101- const indicatorRenderingSpeed = indicatorLayout . addElement < UITextBox > ( UIElementBuilders . TextBox )
102- . setTextFont ( ( font ) => font
103- . setWeight ( 'bold' )
104- )
105-
106- // Create button for rendering and measuring again.
107- const reRender = ( ) => {
108- series
109- . clear ( )
110- indicatorRenderingSpeed
111- . setText ( 'Rendering ...' )
112-
113- measureRenderingSpeed ( )
114- }
115- const buttonRerender = indicatorLayout . addElement ( UIElementBuilders . ButtonBox )
116- . setText ( 'Render again' )
117- . setMargin ( { left : 10 } )
118- buttonRerender . onSwitch ( ( _ , state ) => {
119- if ( state ) {
120- reRender ( )
121- }
122- } )
0 commit comments