Skip to content

Commit 82604e5

Browse files
committed
Change data amount to 5M and improve displayed stats
1 parent 36808d8 commit 82604e5

File tree

1 file changed

+60
-95
lines changed

1 file changed

+60
-95
lines changed

src/app.ts

Lines changed: 60 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -7,116 +7,81 @@ let theme = Themes.darkGold
77
if (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.
3013
const 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.
4320
const axisX = chart.getDefaultAxisX()
44-
.setAnimationScroll(undefined)
4521
const axisY = chart.getDefaultAxisY()
46-
.setAnimationScroll(undefined)
4722

4823
const 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

Comments
 (0)