├── public ├── robots.txt ├── favicon.ico ├── logo192.png ├── logo512.png ├── manifest.json └── index.html ├── src ├── types │ ├── flame-graph.ts │ └── js-self-profiling.ts ├── index.tsx ├── index.css ├── plugins │ └── MyPlugin.ts ├── utils │ └── samples.ts ├── core │ └── flame-graph-adaptor │ │ ├── index.ts │ │ ├── transfromSamplesToStack.ts │ │ └── transformStackToFlameChart.ts ├── components │ ├── chart-detail │ │ └── index.tsx │ ├── samples │ │ └── index.tsx │ ├── drag-bar │ │ └── index.tsx │ ├── flame-chart │ │ └── index.tsx │ └── header │ │ └── index.tsx ├── App.tsx └── test-data │ ├── pauseFunc.json │ ├── profiling-2025-07-20T06-35-22.json │ └── edit-three.json ├── index.html ├── .gitignore ├── tsconfig.json ├── package.json ├── README.md ├── 使用说明.md ├── server.js └── js-self-profiling-demo.html /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangmingyuan666/js-self-profiling-frame-graph/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangmingyuan666/js-self-profiling-frame-graph/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangmingyuan666/js-self-profiling-frame-graph/HEAD/public/logo512.png -------------------------------------------------------------------------------- /src/types/flame-graph.ts: -------------------------------------------------------------------------------- 1 | export interface IFlameGraphData { 2 | name?: string, 3 | start?: number, 4 | duration?: number, 5 | children?: IFlameGraphData[] 6 | } 7 | 8 | export interface IFlameGraphDataRoot { 9 | children?: IFlameGraphData[] 10 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | const root = ReactDOM.createRoot( 7 | document.getElementById('root') as HTMLElement 8 | ); 9 | root.render( 10 | // 11 | 12 | // 13 | ); 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /src/plugins/MyPlugin.ts: -------------------------------------------------------------------------------- 1 | import {UIPlugin} from 'flame-chart-js'; 2 | 3 | export class MyPlugin extends UIPlugin { 4 | constructor({name = 'myOwnPlugin'}) { 5 | super(name); 6 | } 7 | 8 | height = 100; // height of the plugin in pixels 9 | 10 | // this method will be called on each render 11 | override render() { 12 | // do something 13 | console.log(this); 14 | this.renderEngine.addRectToRenderQueue('red', 100, 0, 10); 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/samples.ts: -------------------------------------------------------------------------------- 1 | import {nanoid} from 'nanoid'; 2 | export function samplesFactory(name: string, data: any) { 3 | return { 4 | name, 5 | data, 6 | key: nanoid(), 7 | }; 8 | } 9 | 10 | export function initJSONSamples(json: any[]) { 11 | return json.map((jsonData: any, index: number) => { 12 | return samplesFactory(`test${index}`, jsonData); 13 | }); 14 | } 15 | 16 | export function getNumberWithToFixed(fixedNumber: number = 3) { 17 | return Number(fixedNumber.toFixed(3)); 18 | } 19 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "module": "esnext", 17 | "moduleResolution": "node", 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "noEmit": true, 21 | "jsx": "react-jsx" 22 | }, 23 | "include": [ 24 | "src" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /src/core/flame-graph-adaptor/index.ts: -------------------------------------------------------------------------------- 1 | import {IJsSelfProfilingJSON} from '../../types/js-self-profiling'; 2 | import {transformSamplesToFlameJsAdaptor} from './transformStackToFlameChart'; 3 | import {transfromSamplesToStack} from './transfromSamplesToStack'; 4 | 5 | export default function flameGraphAdaptor(sourceData: IJsSelfProfilingJSON) { 6 | // 做一层深拷贝,因为没有复杂数据,所以直接用这个方法进行 7 | sourceData = JSON.parse(JSON.stringify(sourceData)); 8 | const {samples: sourceDataWithStack} = transfromSamplesToStack(sourceData); 9 | // console.log(sourceDataWithStack); 10 | 11 | const ans = transformSamplesToFlameJsAdaptor(sourceDataWithStack); 12 | // console.log(ans); 13 | return ans; 14 | } 15 | -------------------------------------------------------------------------------- /src/types/js-self-profiling.ts: -------------------------------------------------------------------------------- 1 | export interface IFrame { 2 | column?: number; 3 | line?: number; 4 | name: string; 5 | resourceId?: number; 6 | } 7 | 8 | export interface IStack { 9 | frameId: number; 10 | parentId?: number; 11 | } 12 | 13 | export interface ISample { 14 | timestamp: number; 15 | index?: number; 16 | stackId?: number; 17 | stack?: IFrameRecordData[]; 18 | } 19 | 20 | export interface ISampleAfterTransformStack extends ISample { 21 | index: number; 22 | stackId: number; 23 | stack: IFrameRecordData[]; 24 | } 25 | 26 | export interface IJsSelfProfilingJSON { 27 | frames: IFrame[]; 28 | resources: string[]; 29 | samples: ISample[]; 30 | stacks: IStack[]; 31 | } 32 | 33 | export interface IFrameRecordData extends IFrame { 34 | name: string; 35 | resourceURI: string; 36 | } 37 | -------------------------------------------------------------------------------- /src/components/chart-detail/index.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import {Card, Empty, Descriptions} from 'antd' 3 | 4 | const ChartDetail: React.FC = ({ 5 | data 6 | }) => { 7 | const { 8 | info, 9 | duration, 10 | start, 11 | } = data || {} 12 | const { 13 | column, line, name, resourceURI 14 | } = info || {} 15 | 16 | return 17 | {data ? 19 | {column} 20 | {line} 21 | {resourceURI} 22 | {name} 23 | {duration} 24 | {start} 25 | 26 | : } 27 | 28 | } 29 | 30 | export default ChartDetail 31 | 32 | const ChartDetailContainer = styled.div` 33 | height: 100%; 34 | .descContainer { 35 | margin-left: 10px; 36 | } 37 | ` -------------------------------------------------------------------------------- /src/components/samples/index.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import {Divider, Tag, Space} from 'antd' 3 | interface ISamples { 4 | list: any 5 | onSetListIndex: any 6 | currentIndex: number 7 | } 8 | 9 | const Samples: React.FC = ({ 10 | onSetListIndex, 11 | currentIndex, 12 | list 13 | }) => { 14 | const onSelect = (index: number) => { 15 | onSetListIndex(index) 16 | } 17 | 18 | return 19 | DataList 20 | 21 | { 22 | list.map((item: any, index: number) => { 23 | return onSelect(index)} 27 | className="tags" 28 | > 29 | {item.name} 30 | 31 | }) 32 | } 33 | 34 | 35 | } 36 | 37 | export default Samples 38 | 39 | const SamplesContainer = styled.div` 40 | display: flex; 41 | flex-direction: column; 42 | 43 | .tags { 44 | display: flex; 45 | align-items: center; 46 | justify-content: center; 47 | height: 40px 48 | } 49 | ` -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import FlameGraph from './components/flame-chart'; 2 | import Header from './components/header' 3 | import Samples from './components/samples' 4 | import styled from 'styled-components' 5 | import {useEffect, useState} from 'react'; 6 | import EditorTest from './test-data/editorTest.json' 7 | import PauseFunc from './test-data/pauseFunc.json' 8 | import EditFoo from './test-data/edit-foo.json' 9 | import EditTwo from './test-data/edit-two.json' 10 | import EditThree from './test-data/edit-three.json' 11 | import {initJSONSamples} from './utils/samples'; 12 | function App() { 13 | const [JSONSamples, setJSONSamples] = useState([]) 14 | const [currentIndex, setCurrentIndex] = useState(0) 15 | 16 | useEffect(() => { 17 | const ans: any = initJSONSamples([PauseFunc, EditorTest, EditFoo, EditTwo, EditThree]) 18 | setJSONSamples(ans) 19 | }, []) 20 | 21 | return ( 22 | 23 |
24 | 25 | { 26 | JSONSamples.length && 27 | } 28 | 29 | ); 30 | } 31 | 32 | export default App; 33 | 34 | const AppContainer = styled.div` 35 | min-width: 400px; 36 | padding: 0 20px; 37 | margin: 0 auto; 38 | ` 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-self-profiling-frame-graph", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.16.5", 7 | "@testing-library/react": "^13.4.0", 8 | "@testing-library/user-event": "^13.5.0", 9 | "@types/jest": "^27.5.2", 10 | "@types/node": "^16.18.18", 11 | "@types/react": "^18.0.28", 12 | "@types/react-dom": "^18.0.11", 13 | "antd": "^5.3.3", 14 | "flame-chart-js": "^2.3.1", 15 | "nanoid": "^4.0.2", 16 | "react": "^18.2.0", 17 | "react-dom": "^18.2.0", 18 | "react-scripts": "5.0.1", 19 | "styled-components": "^5.3.9", 20 | "typescript": "^4.9.5", 21 | "use-resize-observer": "^9.1.0", 22 | "web-vitals": "^2.1.4" 23 | }, 24 | "scripts": { 25 | "start": "react-scripts start", 26 | "build": "react-scripts build", 27 | "test": "react-scripts test", 28 | "eject": "react-scripts eject" 29 | }, 30 | "eslintConfig": { 31 | "extends": [ 32 | "react-app", 33 | "react-app/jest" 34 | ] 35 | }, 36 | "browserslist": { 37 | "production": [ 38 | ">0.2%", 39 | "not dead", 40 | "not op_mini all" 41 | ], 42 | "development": [ 43 | "last 1 chrome version", 44 | "last 1 firefox version", 45 | "last 1 safari version" 46 | ] 47 | }, 48 | "devDependencies": { 49 | "@types/styled-components": "^5.1.26" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # js-self-profiling-frame-chart 2 | 3 | A frame chart which display js-self-profiling json data 4 | 5 | 用于将`js-self-profiling` 导出的`json`数据转化为火焰图 6 | 7 | ![img](https://img.shields.io/badge/npm-6.14.11-green.svg) 8 | ![img](https://img.shields.io/badge/node-14.16.0-green.svg) 9 | 10 | # 效果概览 11 | 12 | 查看预览效果(vercel) 13 | 14 | 您可以上传您的js-self-profiling json数据到如上vercel站点中 15 | 16 | 17 | 18 | # 如何使用 19 | 20 | 1. `npm i` 21 | 2. `npm start` 22 | 23 | # 如何加载数据? 24 | 25 | 需要导入js-self-profiling的数据 26 | 27 | 将它在`src/components/flame-chart.ts`中引入,或者拖拽放入主项目即可即可 28 | 29 | ## Example 30 | 31 | ```tsx 32 | import EditorTest from '../../test-data/editorTest.json' 33 | 34 | const chartData = flameGraphAdaptor(EditorTest) 35 | ``` 36 | 37 | ## 如何获取到`js-self-profiling` 数据 38 | 39 | ### 让Chrome有使用`js-self-profiling`的权限 40 | 41 | 对于新兴API,在Chrome中默认禁止使用,而如果您想要开启这个功能,请在你项目的html响应的请求头中添加 42 | 43 | `Document-Policy: js-profiling` 44 | 45 | 如下静态代码即最小demo,您可以 46 | 47 | ```js 48 | // 当前文件路径dirname 49 | const folderPath = path.resolve(__dirname, "./static"); 50 | 51 | const server = http.createServer((req, res) => { 52 | // 收到 127.0.0.1:3000/index.html 我们返回index.html资源 53 | try { 54 | // 获取路径后缀 index.html 55 | const info = url.parse(req.url); 56 | 57 | // 文件夹路径 + 需要获取的资源路径 58 | const filePath = path.resolve(folderPath, "./" + info.path); 59 | 60 | // 流读取 61 | const fileStream = fs.createReadStream(filePath); 62 | 63 | // 设置响应头,以让chorme允许您采用js-self-profiling规范 64 | res.setHeader('Document-Policy', 'js-profiling') 65 | fileStream.pipe(res); 66 | } catch (err) { 67 | console.log('err'); 68 | } 69 | }); 70 | ``` 71 | 72 | 总而言之,只要想办法让您的项目中的html文件的网络响应具有此响应头,就可以使用`js-self-profiling` API 73 | 74 | ### 如何获取`js-self-profiling`数据 75 | 76 | ```tsx 77 | // start 78 | const profiler = new Profiler({ sampleInterval: 10, maxBufferSize: 10000 }); 79 | 80 | setTimeout(async () => { 81 | // select 82 | const trace = await profiler.stop(); 83 | const traceJson = JSON.stringify(trace); 84 | console.log(traceJson); 85 | }, 5000); 86 | ``` 87 | 88 | 此时`traceJson` 数据就是我们期望的`js-self-profiling`数据 89 | 90 | 将`traceJson`数据放入此项目中,即可实现基本的数据分析 91 | 92 | # 如果出现分析错误或存疑 93 | 94 | 联系 Email:`2369558390@qq.com` 95 | 96 | -------------------------------------------------------------------------------- /src/components/drag-bar/index.tsx: -------------------------------------------------------------------------------- 1 | import {useEffect, useRef, useState} from 'react' 2 | import styled from 'styled-components' 3 | 4 | enum STATUS { 5 | idle = 'idle', 6 | dragging = 'dragging' 7 | } 8 | 9 | interface IDragBar { 10 | containerRef: any 11 | setDragBar: any 12 | } 13 | 14 | const minLeft = 30; 15 | const minRight = 80; 16 | 17 | export const DragBar: React.FC = ({ 18 | containerRef, 19 | setDragBar 20 | }) => { 21 | const dragBarRef = useRef() 22 | const statusRef = useRef(STATUS.idle) 23 | const [, forceUpdate] = useState({}) 24 | 25 | useEffect(() => { 26 | if (containerRef.current) { 27 | containerRef.current.addEventListener('mousemove', (e: React.MouseEvent) => { 28 | e.preventDefault() 29 | if (statusRef.current === STATUS.dragging && containerRef.current) { 30 | const {x = 0, width = 0} = containerRef.current?.getBoundingClientRect() || {} 31 | const offsetWithPercentage = Math.floor((e.clientX - x) / width * 100) 32 | 33 | if (offsetWithPercentage < minLeft) { 34 | setDragBar(minLeft) 35 | return 36 | } 37 | if (offsetWithPercentage > minRight) { 38 | setDragBar(minRight) 39 | return 40 | } 41 | setDragBar(offsetWithPercentage) 42 | } 43 | }) 44 | 45 | containerRef.current.addEventListener('mouseup', (e: React.MouseEvent) => { 46 | e.preventDefault() 47 | statusRef.current = STATUS.idle; 48 | forceUpdate({}) 49 | }) 50 | } 51 | }, []) 52 | 53 | const onMouseDown = (e: React.MouseEvent) => { 54 | e.preventDefault() 55 | statusRef.current = STATUS.dragging 56 | } 57 | 58 | const onMouseUp = (e: React.MouseEvent) => { 59 | e.preventDefault() 60 | statusRef.current = STATUS.idle 61 | } 62 | 63 | return 67 |
68 | 69 |
70 |
71 | } 72 | 73 | export default DragBar 74 | 75 | const DragBarContainer = styled.div` 76 | width: 10px; 77 | transition: all 0.15s; 78 | 79 | .dragBar { 80 | height: 100%; 81 | display: flex; 82 | background: #ccc; 83 | flex-direction: column; 84 | transition: 0.5s all; 85 | 86 | &:hover { 87 | background: #000; 88 | } 89 | } 90 | 91 | .dragBar-active { 92 | background: #000; 93 | } 94 | ` 95 | 96 | -------------------------------------------------------------------------------- /src/core/flame-graph-adaptor/transfromSamplesToStack.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @author zhangmingyuan01 3 | * @description 提供将js-self-profiling的json数据转换为有stack属性的调用栈数据结构的数据结构 4 | * stack: [{fun1}, {fun2}, {fun3}] 呈现出调用栈 5 | */ 6 | 7 | import {getNumberWithToFixed} from '../../utils/samples'; 8 | import {IFrameRecordData, IJsSelfProfilingJSON, ISample} from '../../types/js-self-profiling'; 9 | 10 | /** 11 | * @description 入口函数,用于进行上述转换 12 | * @param sourceData js-self-profiling 导出的数据 13 | * @returns sourceData中的samples数组中,如果存在函数调用栈,那么都被添加上当前时间戳对应的所有函数调用栈(key: stack) 14 | */ 15 | export function transfromSamplesToStack(sourceData: IJsSelfProfilingJSON) { 16 | const { 17 | samples, // samples[i]函数执行时间下标,升序 18 | // resources, // resources[i]资源uri 19 | // frames, // frames[i] i下表下的函数对象,包含函数名和函数的line和col 20 | // stacks, // stacks[i] 调用栈记录 21 | } = sourceData; 22 | 23 | // 遍历samples,为存在stackId的sample添加stack数据结构 24 | samples.forEach((sample: ISample, i: number) => { 25 | const {stackId, timestamp} = sample; 26 | sample.timestamp = getNumberWithToFixed(timestamp); 27 | 28 | // 只有有函数调用栈的才需要被处理 29 | if (stackId) { 30 | handleStack(stackId, sample, sourceData, i); 31 | } 32 | }); 33 | 34 | // 因为需要把绝对时间转换为相对时间,所以必须加入一个虚拟的时间作为结尾,这个时间为10ms 35 | addLastSample(samples); 36 | 37 | return sourceData; 38 | } 39 | 40 | /** 41 | * @description 用于为每个samples依据自己的顶层stackId而计算出所有的调用栈,收集在stack数据结构里(dfs) 42 | * @param stackId 标识当前调用栈顶的id 43 | * @param sample js-self-profiling的samples数据,此时已经有了 44 | * @param sourceData js-self-profiling的全部数据 45 | * @param i 标识当前stack中的是在大samples哪个index中,日后方便查询,进行相对时间的计算(持续时间: t2-t1) 46 | */ 47 | function handleStack(stackId: number, sample: ISample, sourceData: IJsSelfProfilingJSON, i: number) { 48 | // frameId是当前stack中frame的下标;parentId是父亲的stack的下标 49 | const {frameId, parentId} = sourceData.stacks[stackId]; 50 | // 当前栈顶函数对应的frame 51 | const frame = sourceData.frames[frameId]; 52 | 53 | // 标识当前函数调用栈对应的资源 54 | let {resourceId} = frame; 55 | resourceId = resourceId ?? -1; 56 | const resource = resourceId >= 0 ? sourceData.resources[resourceId] : ''; // 当前地址 57 | 58 | // 记录当前数据,如果没有函数名视为是匿名函数 59 | const recordData: IFrameRecordData = { 60 | ...frame, 61 | name: frame.name || '(anonymous)', 62 | resourceURI: resource, 63 | }; 64 | 65 | // 为什么需要给他index? 后续需要将绝对时间转化为相对时间的计算,必要情况下需要进行index之间的时间记录 66 | sample.index = i; 67 | 68 | // 把每个函数调用栈中函数的对应信息记录在stack数组里 69 | sample.stack = sample.stack || []; 70 | sample.stack.unshift(recordData); 71 | 72 | // 如果有父调用栈,递归处理 73 | if (parentId) { 74 | handleStack(parentId, sample, sourceData, i); 75 | } 76 | } 77 | 78 | /** 79 | * @description 因为需要把绝对时间转换为相对时间,所以必须加入一个虚拟的时间作为结尾,这个时间为10ms 80 | * @param samples 81 | */ 82 | function addLastSample(samples: ISample[]) { 83 | const lastSample = samples[samples.length - 1]; 84 | const lastTimeStamp: ISample = { 85 | // 为最后一个 86 | timestamp: lastSample.timestamp + 10, 87 | }; 88 | 89 | samples.push(lastTimeStamp); 90 | } 91 | 92 | -------------------------------------------------------------------------------- /使用说明.md: -------------------------------------------------------------------------------- 1 | # JS Self Profiling 数据生成工具使用说明 2 | 3 | ## 概述 4 | 5 | 这个工具包含一个 HTML 页面和一个 HTTP 服务器,用于生成符合 `js-self-profiling` 规范的性能分析数据。生成的 JSON 数据可以直接导入到您的火焰图项目中进行分析。 6 | 7 | ## 文件说明 8 | 9 | - `js-self-profiling-demo.html` - 主要的演示页面,包含性能分析功能 10 | - `server.js` - HTTP 服务器,提供正确的响应头支持 11 | - `使用说明.md` - 本说明文档 12 | 13 | ## 使用步骤 14 | 15 | ### 1. 启动服务器 16 | 17 | ```bash 18 | node server.js 19 | ``` 20 | 21 | 服务器将在 `http://localhost:3000` 启动。 22 | 23 | ### 2. 访问演示页面 24 | 25 | 在 Chrome 浏览器中打开: 26 | 27 | ``` 28 | http://localhost:3000/js-self-profiling-demo.html 29 | ``` 30 | 31 | ### 3. 使用性能分析工具 32 | 33 | 1. **开始分析**:点击"开始分析"按钮启动性能分析器 34 | 2. **生成数据**:在分析期间执行以下操作: 35 | - 点击"执行计算任务"按钮 36 | - 在页面上进行交互 37 | - 滚动页面 38 | - 执行其他 JavaScript 操作 39 | 3. **停止分析**:点击"停止分析"按钮结束分析 40 | 4. **保存数据**: 41 | - 点击"下载数据"按钮保存 JSON 文件到本地 42 | - 点击"保存到项目"按钮将数据直接保存到项目的 `src/test-data` 目录 43 | 44 | ## 重要注意事项 45 | 46 | ### 浏览器要求 47 | 48 | - **必须使用 Chrome 浏览器**(js-self-profiling API 目前只在 Chrome 中实现) 49 | - 建议使用 Chrome 94 或更高版本 50 | 51 | ### 访问方式 52 | 53 | - **必须通过 HTTP 服务器访问**,不能直接打开 HTML 文件(file://协议) 54 | - 服务器会自动设置 `Document-Policy: js-profiling` 响应头 55 | 56 | ### API 支持检查 57 | 58 | 页面会自动检查浏览器是否支持 js-self-profiling API,如果不支持会显示错误信息。 59 | 60 | ## 生成的数据格式 61 | 62 | 下载的 JSON 文件包含以下主要字段: 63 | 64 | ```json 65 | { 66 | "samples": [...], // 性能样本数据 67 | "resources": [...], // 资源信息 68 | "frames": [...], // 函数帧信息 69 | "stacks": [...] // 调用栈信息 70 | } 71 | ``` 72 | 73 | ## 数据导入到火焰图项目 74 | 75 | ### 方式一:手动导入(下载数据) 76 | 77 | 1. 将下载的 JSON 文件复制到您的火焰图项目中 78 | 2. 在 `src/components/flame-chart.ts` 中导入数据: 79 | 80 | ```tsx 81 | import YourProfilingData from '../../path/to/your-data.json'; 82 | 83 | const chartData = flameGraphAdaptor(YourProfilingData); 84 | ``` 85 | 86 | ### 方式二:自动保存到项目(推荐) 87 | 88 | 1. 点击"保存到项目"按钮,数据会自动保存到 `src/test-data` 目录 89 | 2. 保存成功后,页面会显示导入代码示例 90 | 3. 直接复制显示的代码到您的项目中使用 91 | 92 | ## 故障排除 93 | 94 | ### 问题:API 不可用 95 | 96 | **解决方案**: 97 | 98 | 1. 确保使用 Chrome 浏览器 99 | 2. 确保通过 HTTP 服务器访问(http://localhost:3000) 100 | 3. 检查 Chrome 版本是否支持 js-self-profiling 101 | 102 | ### 问题:服务器启动失败 103 | 104 | **解决方案**: 105 | 106 | 1. 确保端口 3000 未被占用 107 | 2. 检查 Node.js 是否正确安装 108 | 3. 尝试使用其他端口(修改 server.js 中的 PORT 变量) 109 | 110 | ### 问题:下载的数据为空 111 | 112 | **解决方案**: 113 | 114 | 1. 确保在分析期间执行了足够的操作 115 | 2. 检查浏览器控制台是否有错误信息 116 | 3. 尝试延长分析时间 117 | 118 | ### 问题:保存到项目失败 119 | 120 | **解决方案**: 121 | 122 | 1. 确保服务器正在运行 123 | 2. 检查 `src/test-data` 目录是否存在且有写入权限 124 | 3. 查看浏览器控制台是否有网络错误 125 | 4. 确保数据已成功生成(先完成分析再保存) 126 | 127 | ## 技术细节 128 | 129 | ### 性能分析器配置 130 | 131 | ```javascript 132 | new Profiler({ 133 | sampleInterval: 10, // 采样间隔(毫秒) 134 | maxBufferSize: 10000, // 最大缓冲区大小 135 | }); 136 | ``` 137 | 138 | ### 响应头设置 139 | 140 | 服务器自动设置以下响应头: 141 | 142 | ``` 143 | Document-Policy: js-profiling 144 | ``` 145 | 146 | 这允许 Chrome 浏览器启用 js-self-profiling API。 147 | 148 | ### API 端点 149 | 150 | 服务器提供以下 API 端点: 151 | 152 | - `POST /api/save-data` - 保存性能分析数据到 `src/test-data` 目录 153 | - `GET /api/list-test-data` - 获取 `src/test-data` 目录中的文件列表 154 | 155 | ## 联系支持 156 | 157 | 如果遇到问题,请联系:`2369558390@qq.com` 158 | -------------------------------------------------------------------------------- /src/components/flame-chart/index.tsx: -------------------------------------------------------------------------------- 1 | import {FlameChart, FlameChartContainer, FlameChartPlugin, TimeGridPlugin} from 'flame-chart-js'; 2 | import {useCallback, useEffect, useRef, useState} from 'react'; 3 | import flameGraphAdaptor from '../../core/flame-graph-adaptor'; 4 | import {MyPlugin} from '../../plugins/MyPlugin'; 5 | import EditorTest from '../../test-data/editorTest.json' 6 | import PauseFunc from '../../test-data/pauseFunc.json' 7 | import useResizeObserver from 'use-resize-observer'; 8 | import ChartDetail from '../chart-detail'; 9 | import styled from 'styled-components' 10 | import {Divider, message} from 'antd' 11 | import DragBar from '../drag-bar'; 12 | 13 | interface IFlameGraph { 14 | currentSamples: any, 15 | currentIndex: number 16 | } 17 | 18 | const DEFAULT_OFFSET = 70; 19 | const WIDTH_OF_DRAGBAR = 10; 20 | 21 | const FlameGraph: React.FC = ({ 22 | currentSamples, 23 | currentIndex 24 | }) => { 25 | const chartRef = useRef(); //拿到canvas容器 26 | const boxRef = useRef(); // 拿到container容器 27 | const chartShadowRef = useRef(); 28 | const detailBoxRef = useRef(); 29 | const containerRef = useRef() 30 | const [selectInfo, setSelectInfo] = useState(null) 31 | const {data} = currentSamples 32 | 33 | const [offset, setOffset] = useState(DEFAULT_OFFSET); 34 | 35 | const leftCalc = `calc(${offset}% - ${WIDTH_OF_DRAGBAR}px)` 36 | const rightCalc = `calc(100% - ${offset}% - ${WIDTH_OF_DRAGBAR}px)` 37 | 38 | const initialize = useCallback(() => { 39 | try { 40 | if (chartRef.current && boxRef.current) { 41 | const {width = 0, height = 0} = boxRef.current.getBoundingClientRect(); 42 | 43 | chartRef.current.width = width; 44 | chartRef.current.height = height - 3; 45 | 46 | const chartData = flameGraphAdaptor(data) 47 | const canvas = chartRef.current 48 | 49 | const flameChart = new FlameChart({ 50 | canvas, // mandatory 51 | //timeseries: [/* ... */], 52 | timeframeTimeseries: [/* ... */], 53 | data: [ 54 | chartData as any, 55 | ], 56 | settings: { 57 | options: { 58 | timeUnits: 'ms', 59 | }, 60 | }, 61 | }); 62 | flameChart.on('select', (element: any) => { 63 | const {node} = element || {} 64 | if (node) { 65 | const {source} = node 66 | if (source) { 67 | setSelectInfo(source) 68 | } 69 | } 70 | }); 71 | chartShadowRef.current = flameChart 72 | } 73 | } catch (err) { 74 | message.error("Please upload data in json-self-profiling format") 75 | } 76 | }, [data, chartRef]); 77 | 78 | useEffect(() => { 79 | initialize() 80 | }, [initialize]) 81 | 82 | useResizeObserver({ 83 | ref: boxRef, 84 | onResize: ({width = 0, height = 0}) => { 85 | chartShadowRef.current?.resize(width, height - 3) 86 | }, 87 | }); 88 | 89 | 90 | return 91 | Chart 92 |
93 |
96 | 97 |
98 | 99 |
102 | 103 |
104 |
105 |
106 | } 107 | 108 | export default FlameGraph 109 | 110 | const ChartContainer = styled.div` 111 | .board { 112 | height: 600px; 113 | display: flex; 114 | .boxContainer { 115 | height: 100%; 116 | } 117 | 118 | .detailBox { 119 | height: 100%; 120 | } 121 | } 122 | 123 | ` -------------------------------------------------------------------------------- /src/components/header/index.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import {Button, message} from 'antd' 3 | import React, {useRef, useState} from 'react'; 4 | import {samplesFactory} from '../../utils/samples'; 5 | 6 | interface IHeader { 7 | setList: any 8 | list: any[] 9 | } 10 | const Header: React.FC = ({setList, list}) => { 11 | function App() { 12 | const [isDragging, setIsDragging] = useState(false); 13 | const uploadFileRef = useRef() 14 | 15 | function handleDragEnter(event: React.DragEvent) { 16 | event.preventDefault(); 17 | setIsDragging(true); 18 | } 19 | 20 | function handleDragLeave(event: React.DragEvent) { 21 | event.preventDefault(); 22 | setIsDragging(false); 23 | } 24 | 25 | function handleDrop(event: React.DragEvent) { 26 | event.preventDefault(); 27 | setIsDragging(false); 28 | const files = event.dataTransfer.files; 29 | handleFiles(files); 30 | } 31 | 32 | function onchange(event: any) { 33 | if (uploadFileRef.current) { 34 | handleFiles(uploadFileRef.current.files) 35 | } 36 | } 37 | 38 | function handleFiles(files: any) { 39 | for (const file of files) { 40 | // 在这里处理文件内容 41 | const {name, type} = file 42 | if (type !== "application/json") { 43 | message.error("Please upload data in json-self-profiling format") 44 | continue 45 | } 46 | const reader = new FileReader(); 47 | reader.onload = () => { 48 | const data = JSON.parse(reader.result as string); 49 | const sample = samplesFactory(name, data) 50 | setList((prev: any) => { 51 | return [...prev, sample] 52 | }) 53 | }; 54 | reader.readAsText(file); 55 | } 56 | } 57 | 58 | return ( 59 | 76 | ); 77 | } 78 | 79 | 80 | return 81 |
82 |
js-self-profiling-frame-graph
83 |
A framework that parses the JSON exported by js-self-profiling-api into a flame graph
84 |
85 |
86 | 87 |
88 |
89 | } 90 | 91 | const HeaderContainer = styled.div` 92 | display:flex; 93 | justify-content: space-between; 94 | align-items: center; 95 | height: 60px; 96 | margin-bottom: 10px; 97 | border-bottom: 1px solid #ccc; 98 | 99 | .header-logo { 100 | .header-title { 101 | font-size: 16px; 102 | } 103 | 104 | .header-desc { 105 | font-size: 12px; 106 | color: rgb(113 105 105); 107 | } 108 | } 109 | 110 | /* 隐藏默认的文件选择按钮 */ 111 | input[type="file"] { 112 | display: none; 113 | } 114 | 115 | /* 自定义文件选择按钮 */ 116 | .upload-btn { 117 | display: inline-block; 118 | width: 100%; 119 | height: 100%; 120 | cursor: pointer; 121 | } 122 | 123 | 124 | /* 将自定义按钮与文件名称组合在一起 */ 125 | .upload-container { 126 | position: relative; 127 | display: inline-block; 128 | width: 100%; 129 | height: 100%; 130 | } 131 | 132 | .upload-container input[type="file"] { 133 | position: absolute; 134 | left: 0; 135 | top: 0; 136 | opacity: 0; 137 | cursor: pointer; 138 | width: 100%; 139 | height: 100%; 140 | } 141 | ` 142 | 143 | export default Header -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const http = require('http'); 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | const url = require('url'); 5 | 6 | const PORT = 3000; 7 | const TEST_DATA_DIR = path.join(__dirname, 'src', 'test-data'); 8 | 9 | // 创建HTTP服务器 10 | const server = http.createServer((req, res) => { 11 | try { 12 | // 解析请求URL 13 | const parsedUrl = url.parse(req.url); 14 | let filePath = parsedUrl.pathname; 15 | 16 | // 处理保存数据的API请求 17 | if (filePath === '/api/save-data' && req.method === 'POST') { 18 | handleSaveData(req, res); 19 | return; 20 | } 21 | 22 | // 处理获取test-data目录文件列表的API请求 23 | if (filePath === '/api/list-test-data' && req.method === 'GET') { 24 | handleListTestData(req, res); 25 | return; 26 | } 27 | 28 | // 默认提供HTML文件 29 | if (filePath === '/') { 30 | filePath = '/js-self-profiling-demo.html'; 31 | } 32 | 33 | // 构建完整的文件路径 34 | const fullPath = path.join(__dirname, filePath); 35 | 36 | // 检查文件是否存在 37 | if (!fs.existsSync(fullPath)) { 38 | res.writeHead(404, { 'Content-Type': 'text/plain' }); 39 | res.end('文件未找到'); 40 | return; 41 | } 42 | 43 | // 读取文件 44 | const fileStream = fs.createReadStream(fullPath); 45 | 46 | // 设置响应头 47 | // 关键:设置Document-Policy响应头以允许js-self-profiling API 48 | res.setHeader('Document-Policy', 'js-profiling'); 49 | 50 | // 根据文件扩展名设置Content-Type 51 | const ext = path.extname(fullPath); 52 | let contentType = 'text/plain'; 53 | 54 | switch (ext) { 55 | case '.html': 56 | contentType = 'text/html'; 57 | break; 58 | case '.js': 59 | contentType = 'application/javascript'; 60 | break; 61 | case '.css': 62 | contentType = 'text/css'; 63 | break; 64 | case '.json': 65 | contentType = 'application/json'; 66 | break; 67 | } 68 | 69 | res.setHeader('Content-Type', contentType); 70 | 71 | // 流式传输文件内容 72 | fileStream.pipe(res); 73 | 74 | } catch (err) { 75 | console.error('服务器错误:', err); 76 | res.writeHead(500, { 'Content-Type': 'text/plain' }); 77 | res.end('服务器内部错误'); 78 | } 79 | }); 80 | 81 | // 处理保存数据的API 82 | function handleSaveData(req, res) { 83 | let body = ''; 84 | 85 | req.on('data', chunk => { 86 | body += chunk.toString(); 87 | }); 88 | 89 | req.on('end', () => { 90 | try { 91 | const data = JSON.parse(body); 92 | const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-'); 93 | const filename = `profiling-${timestamp}.json`; 94 | const filepath = path.join(TEST_DATA_DIR, filename); 95 | 96 | // 确保test-data目录存在 97 | if (!fs.existsSync(TEST_DATA_DIR)) { 98 | fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); 99 | } 100 | 101 | // 写入文件 102 | fs.writeFileSync(filepath, JSON.stringify(data, null, 2)); 103 | 104 | res.writeHead(200, { 105 | 'Content-Type': 'application/json', 106 | 'Access-Control-Allow-Origin': '*', 107 | 'Access-Control-Allow-Methods': 'POST, OPTIONS', 108 | 'Access-Control-Allow-Headers': 'Content-Type' 109 | }); 110 | res.end(JSON.stringify({ 111 | success: true, 112 | message: '数据保存成功', 113 | filename: filename, 114 | filepath: filepath 115 | })); 116 | 117 | console.log(`✅ 数据已保存到: ${filepath}`); 118 | 119 | } catch (error) { 120 | console.error('保存数据时出错:', error); 121 | res.writeHead(500, { 122 | 'Content-Type': 'application/json', 123 | 'Access-Control-Allow-Origin': '*' 124 | }); 125 | res.end(JSON.stringify({ 126 | success: false, 127 | message: '保存数据失败: ' + error.message 128 | })); 129 | } 130 | }); 131 | } 132 | 133 | // 处理获取test-data目录文件列表的API 134 | function handleListTestData(req, res) { 135 | try { 136 | if (!fs.existsSync(TEST_DATA_DIR)) { 137 | res.writeHead(200, { 138 | 'Content-Type': 'application/json', 139 | 'Access-Control-Allow-Origin': '*' 140 | }); 141 | res.end(JSON.stringify({ files: [] })); 142 | return; 143 | } 144 | 145 | const files = fs.readdirSync(TEST_DATA_DIR) 146 | .filter(file => file.endsWith('.json')) 147 | .map(file => ({ 148 | name: file, 149 | path: `src/test-data/${file}`, 150 | size: fs.statSync(path.join(TEST_DATA_DIR, file)).size, 151 | modified: fs.statSync(path.join(TEST_DATA_DIR, file)).mtime 152 | })); 153 | 154 | res.writeHead(200, { 155 | 'Content-Type': 'application/json', 156 | 'Access-Control-Allow-Origin': '*' 157 | }); 158 | res.end(JSON.stringify({ files })); 159 | 160 | } catch (error) { 161 | console.error('获取文件列表时出错:', error); 162 | res.writeHead(500, { 163 | 'Content-Type': 'application/json', 164 | 'Access-Control-Allow-Origin': '*' 165 | }); 166 | res.end(JSON.stringify({ 167 | success: false, 168 | message: '获取文件列表失败: ' + error.message 169 | })); 170 | } 171 | } 172 | 173 | // 启动服务器 174 | server.listen(PORT, () => { 175 | console.log(`🚀 服务器已启动在 http://localhost:${PORT}`); 176 | console.log(`📄 访问 js-self-profiling 演示页面: http://localhost:${PORT}/js-self-profiling-demo.html`); 177 | console.log(`⚠️ 重要提示:`); 178 | console.log(` 1. 确保使用 Chrome 浏览器访问`); 179 | console.log(` 2. 服务器已设置 Document-Policy: js-profiling 响应头`); 180 | console.log(` 3. 如果API不可用,请检查Chrome版本是否支持js-self-profiling`); 181 | console.log(`\n按 Ctrl+C 停止服务器`); 182 | }); 183 | 184 | // 优雅关闭 185 | process.on('SIGINT', () => { 186 | console.log('\n🛑 正在关闭服务器...'); 187 | server.close(() => { 188 | console.log('✅ 服务器已关闭'); 189 | process.exit(0); 190 | }); 191 | }); -------------------------------------------------------------------------------- /src/core/flame-graph-adaptor/transformStackToFlameChart.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @author zhangmingyuan01 3 | * @description 将已经带着stack的samples们转化成火焰图的数据结构 4 | * 关键 -> stack的纵向结构转化为横向的数据结构 5 | */ 6 | 7 | import {getNumberWithToFixed} from '../../utils/samples'; 8 | import {IFlameGraphData, IFlameGraphDataRoot} from '../../types/flame-graph'; 9 | import {ISample, ISampleAfterTransformStack} from '../../types/js-self-profiling'; 10 | 11 | /** 12 | * @description 入口函数,主要做了两件事情 13 | * 1. 明确有持续函数调用的区间,分而治之(快慢指针) 14 | * 2. 将有持续函数调用的区间通过处理(回溯算法+快慢指针),将纵向的stack数据结构转化为横向的火焰图数据结构 15 | * @param samples 已经有stack数据结构的samples 16 | * @returns 返回横向的火焰图数据结构 17 | */ 18 | export function transformSamplesToFlameJsAdaptor(samples: ISample[]) { 19 | const n = samples.length; 20 | const duplicateSamples: ISampleAfterTransformStack[][] = []; 21 | 22 | // 1. 明确有持续函数调用的区间,分而治之(快慢指针) 23 | duplicateSamplesAction(0, n, samples, duplicateSamples); 24 | 25 | const ans: IFlameGraphDataRoot = { 26 | children: [], 27 | }; 28 | 29 | for (let i = 0; i < duplicateSamples.length; i++) { 30 | // 此部分区间的samples,我们需要单独进行组装 31 | const partialSamples = duplicateSamples[i]; 32 | const childrenData: IFlameGraphData = {}; 33 | handleChildrenOfEachLevel(0, partialSamples.length, partialSamples, childrenData, 0, samples); 34 | if (childrenData.children) { 35 | ans.children!.push(childrenData.children[0]); 36 | } 37 | } 38 | 39 | return ans; 40 | } 41 | 42 | /** 43 | * 44 | * @param slow 慢指针 45 | * @param n 总样本量 46 | * @param samples 待有stack的samples 47 | * @param ans 收集结果的数组 ISampleAfterTransformStack[][] 此数据结构的每个元素都具有stack 可以确定有调用栈持续 48 | * @param currentStackIndex 当前深度,由于我们只有对于函数是否存在的需求,所以只需要知道有没有stack就行,我们拿0即可(代表第一层) 49 | */ 50 | function duplicateSamplesAction(slow: number, n: number, 51 | samples: ISample[], ans: ISampleAfterTransformStack[][], currentStackIndex: number = 0) { 52 | while (slow < n) { 53 | // 获取当前慢指针所对应的stack 54 | const currentSample = samples[slow]; 55 | const currentStack = currentSample.stack; 56 | 57 | // 如果当前函数没有调用栈,那么不需要进行标记 58 | if (!currentStack) { 59 | slow++; 60 | continue; 61 | } 62 | 63 | // 获取当前stack的 currentStackIndex:深度 的函数名 64 | const currentStackName = currentStack[currentStackIndex].name; 65 | 66 | // 收集连续区间的数组 67 | const partialStack: ISampleAfterTransformStack[] = []; 68 | 69 | for (let fast = slow; fast < n; fast++) { 70 | // 获取快指针所对应的sample 71 | const currentTargetSample = samples[fast]; 72 | const {stack: currentTargetSampleStack} = currentTargetSample; 73 | 74 | /** 75 | * 如果快指针所对应的samples出现以下情况 76 | * 1. 没有stack了 77 | * 2. 函数名改变了(或者是其他指标改变了) 78 | * 反正可以证明当前函数终止 79 | * 那么此时说明,当前底层函数调用阻塞(火焰图的底层调用栈)结束 80 | * 1. 终止本次循环 81 | * 2. 把慢指针放到快指针的位置,如下同理 82 | */ 83 | if (!currentTargetSampleStack || 84 | currentTargetSampleStack[currentStackIndex].name !== currentStackName) { 85 | slow = fast; 86 | break; 87 | } 88 | 89 | // 如果可以走到这一步,那么可以证明当前这个区间是有函数执行区间的,所以可以用 ISampleAfterTransformStack 类型进行标识 90 | // 将当前栈和当前栈的对应信息放入当前区间 91 | partialStack.push(currentTargetSample as ISampleAfterTransformStack); 92 | 93 | // 此时fast快指针已经到了最后一个元素,查看是否可以通过下方检测 94 | if (fast === n - 1) { 95 | slow = fast; 96 | break; 97 | } 98 | } 99 | 100 | // 收集当前区间,并放入ans中,然后继续计算下一个区间 101 | ans.push(partialStack); 102 | slow++; 103 | } 104 | } 105 | 106 | /** 107 | * @description 核心函数:将有函数调用栈的samples区间转化为火焰图的数据结构 108 | * 首先进行本层遍历,直到出现函数名改变或者空调用栈,此时进行DFS收集数据 109 | * 随后收集至没有子调用栈了,回到本层继续遍历,继续手机 110 | * @param slow 慢指针 111 | * @param n 当前区间的总长度 112 | * @param samples 具有stack的所有samples 113 | * @param flameResultData 当前这一层的数据结构(最为最终数据结构的一个子数据结构) 114 | * @param depth 当前深度 115 | * @param allSamples 所有samples 116 | */ 117 | function handleChildrenOfEachLevel(slow: number, n: number, samples: ISampleAfterTransformStack[], 118 | flameResultData: IFlameGraphData, depth = 0, allSamples: ISample[] 119 | ) { 120 | while (slow < n) { 121 | // 此时慢指针对应的的sample一定有stack,但是stack数组的currentStackIndex深度中不保证有调用栈 122 | let currentSample = samples[slow]; 123 | let currentStack = currentSample.stack; 124 | 125 | // 如果currentStackIndex深度下没有调用栈了,那么推进慢指针,拦截处理 126 | if (!currentStack[depth]) { 127 | slow++; 128 | continue; 129 | } 130 | 131 | // 如果currentStackIndex深度下没有调用栈了,那么推进慢指针,拦截处理 132 | for (let fast = slow; fast < n; fast++) { 133 | // 推进当前快指针 134 | const currentTargetSample = samples[fast]; 135 | const currentTargetSampleStack = currentTargetSample.stack; 136 | // 如果j出现了空,那么进行dfs 137 | /** 138 | * 如果快指针所对应的samples出现以下情况 139 | * 1. 没有stack了 140 | * 2. 函数名改变了(或者是其他指标改变了) 141 | * 反正可以证明当前函数终止 142 | * 那么此时说明,当前底层函数调用阻塞(火焰图的底层调用栈)结束 143 | * 1. 终止本次循环 144 | * 2. 把慢指针放到快指针的位置,如下同理 145 | */ 146 | if (!currentTargetSampleStack[depth] 147 | || currentTargetSampleStack[depth].name !== currentSample.stack[depth].name) { 148 | 149 | // 记录当前区间的数据到最终数据结构里 150 | const currentFlameResultData = handleCurrentStackToFlameChildren( 151 | currentSample, 152 | samples[fast - 1], 153 | allSamples, 154 | depth, 155 | flameResultData 156 | ); 157 | 158 | // 递归继续处理子调用栈 159 | handleChildrenOfEachLevel(slow, fast, 160 | samples, currentFlameResultData, depth + 1, allSamples); 161 | 162 | // DFS的完后回到本层,需要保持本层的状态,因此需要将慢指针继续推进至有调用栈,如下 163 | slow = fast; 164 | while (slow < n && !samples[slow].stack[depth]) { 165 | slow++; 166 | } 167 | 168 | currentSample = samples[slow] || {}; 169 | currentStack = currentSample.stack || []; 170 | fast = slow; 171 | continue; 172 | } 173 | 174 | if (fast === n - 1) { 175 | // 此时j已经到了最后一个元素,仍然可以通过上方监测 176 | // 记录当前区间的数据到最终数据结构里 177 | const currentFlameResultData = handleCurrentStackToFlameChildren( 178 | currentSample, 179 | samples[fast], 180 | allSamples, 181 | depth, 182 | flameResultData 183 | ); 184 | 185 | // 递归继续处理子调用栈 186 | handleChildrenOfEachLevel(slow, fast + 1, 187 | samples, currentFlameResultData, depth + 1, allSamples); 188 | 189 | slow = fast; 190 | continue; 191 | } 192 | } 193 | 194 | slow++; 195 | } 196 | } 197 | 198 | /** 199 | * @description 用于计算相对时间(t2-t1),封装当前调用栈信息,放入flameResultData容器中,作为children(子火焰图) 200 | * @param startSample 起始sample 201 | * @param endSample 结束sample 202 | * @param allSamples 所有samples 203 | * @param depth 当前深度 204 | * @param flameResultData 本层火焰图数据结构容器 205 | * @returns 206 | */ 207 | function handleCurrentStackToFlameChildren( 208 | startSample: ISampleAfterTransformStack, 209 | endSample: ISampleAfterTransformStack, 210 | allSamples: ISample[], 211 | depth: number, 212 | flameResultData: IFlameGraphData 213 | ) { 214 | 215 | flameResultData.children = flameResultData.children || []; 216 | // 获取前后时间戳 217 | const {timestamp: startTime} = startSample; 218 | const {timestamp: endTime} = allSamples[endSample.index + 1]; 219 | const diffTime = getNumberWithToFixed(endTime - startTime); 220 | 221 | // 获取当前stack的深度中,到底函数的信息 222 | const currentFunctionInfo = startSample.stack[depth]; 223 | const {name} = currentFunctionInfo; 224 | 225 | const remarkData = { 226 | name, 227 | info: currentFunctionInfo, 228 | type: name, 229 | start: startTime, 230 | duration: diffTime, 231 | children: [], 232 | }; 233 | flameResultData.children.push(remarkData); 234 | 235 | return remarkData; 236 | } 237 | -------------------------------------------------------------------------------- /js-self-profiling-demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | JS Self Profiling Demo 8 | 141 | 142 | 143 | 144 |
145 |

JS Self Profiling 性能分析工具

146 | 147 |
148 | 状态: 准备就绪 - 点击"开始分析"按钮开始性能分析 149 |
150 | 151 |
152 | 153 | 154 | 155 | 156 |
157 | 158 |
159 |

模拟工作负载

160 |

在分析期间,您可以执行以下操作来生成性能数据:

161 |
    162 |
  • 点击"执行计算任务"按钮
  • 163 |
  • 在页面上进行交互
  • 164 |
  • 滚动页面
  • 165 |
166 | 167 |
168 |
169 |
170 |
171 | 172 |
173 |

分析结果

174 |
等待开始分析...
175 |
176 |
177 | 178 | 423 | 424 | 425 | -------------------------------------------------------------------------------- /src/test-data/pauseFunc.json: -------------------------------------------------------------------------------- 1 | { 2 | "frames": [ 3 | { 4 | "column": 24, 5 | "line": 14, 6 | "name": "init", 7 | "resourceId": 0 8 | }, 9 | { 10 | "column": 11, 11 | "line": 11, 12 | "name": "", 13 | "resourceId": 0 14 | }, 15 | { 16 | "column": 14, 17 | "line": 3287, 18 | "name": "LRUCache", 19 | "resourceId": 1 20 | }, 21 | { 22 | "column": 16, 23 | "line": 1906, 24 | "name": "3", 25 | "resourceId": 1 26 | }, 27 | { 28 | "column": 39, 29 | "line": 6, 30 | "name": "__webpack_require__", 31 | "resourceId": 1 32 | }, 33 | { 34 | "column": 16, 35 | "line": 498, 36 | "name": "12", 37 | "resourceId": 1 38 | }, 39 | { 40 | "column": 16, 41 | "line": 11322, 42 | "name": "9", 43 | "resourceId": 1 44 | }, 45 | { 46 | "column": 37, 47 | "line": 2837, 48 | "name": "", 49 | "resourceId": 1 50 | }, 51 | { 52 | "column": 16, 53 | "line": 2834, 54 | "name": "38", 55 | "resourceId": 1 56 | }, 57 | { 58 | "column": 16, 59 | "line": 1352, 60 | "name": "208", 61 | "resourceId": 1 62 | }, 63 | { 64 | "column": 19, 65 | "line": 1, 66 | "name": "", 67 | "resourceId": 1 68 | }, 69 | { 70 | "column": 1, 71 | "line": 1, 72 | "name": "", 73 | "resourceId": 1 74 | }, 75 | { 76 | "column": 42300, 77 | "line": 1, 78 | "name": "r", 79 | "resourceId": 2 80 | }, 81 | { 82 | "column": 41371, 83 | "line": 1, 84 | "name": "", 85 | "resourceId": 2 86 | }, 87 | { 88 | "column": 2, 89 | "line": 1, 90 | "name": "", 91 | "resourceId": 2 92 | }, 93 | { 94 | "column": 1, 95 | "line": 1, 96 | "name": "", 97 | "resourceId": 2 98 | }, 99 | { 100 | "name": "setTimeout" 101 | }, 102 | { 103 | "column": 17, 104 | "line": 1, 105 | "name": "i", 106 | "resourceId": 3 107 | }, 108 | { 109 | "column": 2, 110 | "line": 1, 111 | "name": "", 112 | "resourceId": 3 113 | }, 114 | { 115 | "column": 1, 116 | "line": 1, 117 | "name": "", 118 | "resourceId": 3 119 | }, 120 | { 121 | "column": 23, 122 | "line": 34, 123 | "name": "pausecomp", 124 | "resourceId": 0 125 | }, 126 | { 127 | "column": 26, 128 | "line": 27, 129 | "name": "myfunc", 130 | "resourceId": 0 131 | }, 132 | { 133 | "column": 44, 134 | "line": 9, 135 | "name": "", 136 | "resourceId": 0 137 | } 138 | ], 139 | "resources": [ 140 | "http://localhost:8888/index.html", 141 | "chrome-extension://fmkadmapgofadopljbjfkapdkoienihi/build/installHook.js", 142 | "chrome-extension://nhdogjmejiglipccpnnnanhbledajbpd/build/detector.js", 143 | "chrome-extension://ienfalfjdbdpebioblfackkekamfmbnh/app/detect_angular_for_extension_icon_bundle.js" 144 | ], 145 | "samples": [ 146 | { 147 | "stackId": 1, 148 | "timestamp": 54.84000000357628 149 | }, 150 | { 151 | "timestamp": 54.91999998688698 152 | }, 153 | { 154 | "timestamp": 55.34000000357628 155 | }, 156 | { 157 | "timestamp": 55.34000000357628 158 | }, 159 | { 160 | "timestamp": 55.37999999523163 161 | }, 162 | { 163 | "timestamp": 55.41999998688698 164 | }, 165 | { 166 | "timestamp": 55.54999998211861 167 | }, 168 | { 169 | "timestamp": 55.75499999523163 170 | }, 171 | { 172 | "timestamp": 61.34000000357628 173 | }, 174 | { 175 | "timestamp": 61.54499998688698 176 | }, 177 | { 178 | "timestamp": 61.87999999523163 179 | }, 180 | { 181 | "stackId": 15, 182 | "timestamp": 67.12999999523163 183 | }, 184 | { 185 | "timestamp": 67.59000000357628 186 | }, 187 | { 188 | "timestamp": 70.25499999523163 189 | }, 190 | { 191 | "timestamp": 78.4249999821186 192 | }, 193 | { 194 | "timestamp": 78.84000000357628 195 | }, 196 | { 197 | "timestamp": 78.96000000834465 198 | }, 199 | { 200 | "timestamp": 78.96000000834465 201 | }, 202 | { 203 | "timestamp": 79.16999998688698 204 | }, 205 | { 206 | "stackId": 19, 207 | "timestamp": 82.41999998688698 208 | }, 209 | { 210 | "stackId": 19, 211 | "timestamp": 82.50499999523163 212 | }, 213 | { 214 | "stackId": 19, 215 | "timestamp": 82.54499998688698 216 | }, 217 | { 218 | "timestamp": 87.54499998688698 219 | }, 220 | { 221 | "timestamp": 87.54499998688698 222 | }, 223 | { 224 | "timestamp": 90.34000000357628 225 | }, 226 | { 227 | "timestamp": 90.9249999821186 228 | }, 229 | { 230 | "stackId": 23, 231 | "timestamp": 91.12999999523163 232 | }, 233 | { 234 | "timestamp": 91.16999998688698 235 | }, 236 | { 237 | "timestamp": 91.59000000357628 238 | }, 239 | { 240 | "timestamp": 91.59000000357628 241 | }, 242 | { 243 | "timestamp": 91.59000000357628 244 | }, 245 | { 246 | "timestamp": 93.62999999523163 247 | }, 248 | { 249 | "timestamp": 101.63499999046326 250 | }, 251 | { 252 | "timestamp": 105.84000000357628 253 | }, 254 | { 255 | "timestamp": 115.25499999523163 256 | }, 257 | { 258 | "timestamp": 114.08500000834465 259 | }, 260 | { 261 | "timestamp": 126.62999999523163 262 | }, 263 | { 264 | "timestamp": 128.7999999821186 265 | }, 266 | { 267 | "timestamp": 137.2999999821186 268 | }, 269 | { 270 | "timestamp": 141.46500000357628 271 | }, 272 | { 273 | "timestamp": 154.71500000357628 274 | }, 275 | { 276 | "timestamp": 149.2999999821186 277 | }, 278 | { 279 | "timestamp": 168.50499999523163 280 | }, 281 | { 282 | "timestamp": 160.75499999523163 283 | }, 284 | { 285 | "timestamp": 170.7999999821186 286 | }, 287 | { 288 | "timestamp": 182.12999999523163 289 | }, 290 | { 291 | "timestamp": 180.96500000357628 292 | }, 293 | { 294 | "timestamp": 184.66999998688698 295 | }, 296 | { 297 | "timestamp": 192.4249999821186 298 | }, 299 | { 300 | "timestamp": 194.4249999821186 301 | }, 302 | { 303 | "timestamp": 194.4249999821186 304 | }, 305 | { 306 | "timestamp": 194.4249999821186 307 | }, 308 | { 309 | "timestamp": 209.21000000834465 310 | }, 311 | { 312 | "timestamp": 204.87999999523163 313 | }, 314 | { 315 | "timestamp": 222.21500000357628 316 | }, 317 | { 318 | "timestamp": 217.21500000357628 319 | }, 320 | { 321 | "timestamp": 229.5499999821186 322 | }, 323 | { 324 | "timestamp": 235.1749999821186 325 | }, 326 | { 327 | "timestamp": 248.96000000834465 328 | }, 329 | { 330 | "timestamp": 242.09000000357628 331 | }, 332 | { 333 | "timestamp": 252.16999998688698 334 | }, 335 | { 336 | "timestamp": 262.669999986887 337 | }, 338 | { 339 | "timestamp": 274.3400000035763 340 | }, 341 | { 342 | "timestamp": 286.8799999952316 343 | }, 344 | { 345 | "timestamp": 296.9249999821186 346 | }, 347 | { 348 | "timestamp": 309.5049999952316 349 | }, 350 | { 351 | "timestamp": 321.1299999952316 352 | }, 353 | { 354 | "timestamp": 331.2549999952316 355 | }, 356 | { 357 | "timestamp": 341.5049999952316 358 | }, 359 | { 360 | "timestamp": 354.0049999952316 361 | }, 362 | { 363 | "timestamp": 366.5049999952316 364 | }, 365 | { 366 | "timestamp": 378.1749999821186 367 | }, 368 | { 369 | "timestamp": 390.6299999952316 370 | }, 371 | { 372 | "timestamp": 403.1299999952316 373 | }, 374 | { 375 | "timestamp": 422.919999986887 376 | }, 377 | { 378 | "timestamp": 413.2999999821186 379 | }, 380 | { 381 | "timestamp": 435.2999999821186 382 | }, 383 | { 384 | "timestamp": 424.169999986887 385 | }, 386 | { 387 | "timestamp": 435.8799999952316 388 | }, 389 | { 390 | "timestamp": 448.13499999046326 391 | }, 392 | { 393 | "timestamp": 446.5499999821186 394 | }, 395 | { 396 | "timestamp": 459.08500000834465 397 | }, 398 | { 399 | "timestamp": 462.2999999821186 400 | }, 401 | { 402 | "timestamp": 469.4249999821186 403 | }, 404 | { 405 | "timestamp": 475.50999999046326 406 | }, 407 | { 408 | "timestamp": 488.6749999821186 409 | }, 410 | { 411 | "timestamp": 481.2999999821186 412 | }, 413 | { 414 | "timestamp": 501.7150000035763 415 | }, 416 | { 417 | "timestamp": 491.3799999952316 418 | }, 419 | { 420 | "timestamp": 501.9249999821186 421 | }, 422 | { 423 | "timestamp": 516.0049999952316 424 | }, 425 | { 426 | "timestamp": 511.9650000035763 427 | }, 428 | { 429 | "timestamp": 524.4650000035763 430 | }, 431 | { 432 | "timestamp": 528.419999986887 433 | }, 434 | { 435 | "timestamp": 528.419999986887 436 | }, 437 | { 438 | "timestamp": 528.419999986887 439 | }, 440 | { 441 | "timestamp": 537.0049999952316 442 | }, 443 | { 444 | "timestamp": 541.8350000083447 445 | }, 446 | { 447 | "timestamp": 555.8849999904633 448 | }, 449 | { 450 | "timestamp": 549.4650000035763 451 | }, 452 | { 453 | "timestamp": 569.0900000035763 454 | }, 455 | { 456 | "timestamp": 559.5099999904633 457 | }, 458 | { 459 | "timestamp": 569.6349999904633 460 | }, 461 | { 462 | "timestamp": 579.7150000035763 463 | }, 464 | { 465 | "timestamp": 591.3350000083447 466 | }, 467 | { 468 | "timestamp": 601.5049999952316 469 | }, 470 | { 471 | "timestamp": 611.544999986887 472 | }, 473 | { 474 | "timestamp": 621.5900000035763 475 | }, 476 | { 477 | "timestamp": 632.7999999821186 478 | }, 479 | { 480 | "timestamp": 645.3400000035763 481 | }, 482 | { 483 | "timestamp": 657.8799999952316 484 | }, 485 | { 486 | "timestamp": 670.419999986887 487 | }, 488 | { 489 | "timestamp": 684.4650000035763 490 | }, 491 | { 492 | "timestamp": 680.4650000035763 493 | }, 494 | { 495 | "timestamp": 693.419999986887 496 | }, 497 | { 498 | "timestamp": 693.419999986887 499 | }, 500 | { 501 | "timestamp": 693.419999986887 502 | }, 503 | { 504 | "timestamp": 693.5049999952316 505 | }, 506 | { 507 | "timestamp": 693.6299999952316 508 | }, 509 | { 510 | "timestamp": 690.5900000035763 511 | }, 512 | { 513 | "timestamp": 701.1299999952316 514 | }, 515 | { 516 | "timestamp": 701.5499999821186 517 | }, 518 | { 519 | "timestamp": 715.9249999821186 520 | }, 521 | { 522 | "timestamp": 711.5499999821186 523 | }, 524 | { 525 | "timestamp": 728.2599999904633 526 | }, 527 | { 528 | "timestamp": 722.5049999952316 529 | }, 530 | { 531 | "timestamp": 733.9249999821186 532 | }, 533 | { 534 | "timestamp": 742.419999986887 535 | }, 536 | { 537 | "timestamp": 746.5049999952316 538 | }, 539 | { 540 | "timestamp": 754.6749999821186 541 | }, 542 | { 543 | "timestamp": 756.6749999821186 544 | }, 545 | { 546 | "timestamp": 770.8400000035763 547 | }, 548 | { 549 | "timestamp": 769.2100000083447 550 | }, 551 | { 552 | "timestamp": 781.2150000035763 553 | }, 554 | { 555 | "timestamp": 779.2549999952316 556 | }, 557 | { 558 | "timestamp": 791.7999999821186 559 | }, 560 | { 561 | "timestamp": 799.2549999952316 562 | }, 563 | { 564 | "timestamp": 799.2999999821186 565 | }, 566 | { 567 | "timestamp": 800.0049999952316 568 | }, 569 | { 570 | "timestamp": 800.2150000035763 571 | }, 572 | { 573 | "timestamp": 800.2150000035763 574 | }, 575 | { 576 | "timestamp": 800.2150000035763 577 | }, 578 | { 579 | "timestamp": 800.2150000035763 580 | }, 581 | { 582 | "timestamp": 800.2150000035763 583 | }, 584 | { 585 | "timestamp": 802.0049999952316 586 | }, 587 | { 588 | "timestamp": 808.2150000035763 589 | }, 590 | { 591 | "timestamp": 808.2549999952316 592 | }, 593 | { 594 | "timestamp": 814.5049999952316 595 | }, 596 | { 597 | "timestamp": 824.6749999821186 598 | }, 599 | { 600 | "timestamp": 834.794999986887 601 | }, 602 | { 603 | "timestamp": 847.2999999821186 604 | }, 605 | { 606 | "timestamp": 857.419999986887 607 | }, 608 | { 609 | "timestamp": 869.9650000035763 610 | }, 611 | { 612 | "timestamp": 885.419999986887 613 | }, 614 | { 615 | "timestamp": 885.4650000035763 616 | }, 617 | { 618 | "timestamp": 881.1299999952316 619 | }, 620 | { 621 | "timestamp": 885.7549999952316 622 | }, 623 | { 624 | "timestamp": 885.794999986887 625 | }, 626 | { 627 | "stackId": 26, 628 | "timestamp": 893.169999986887 629 | }, 630 | { 631 | "stackId": 26, 632 | "timestamp": 905.7150000035763 633 | }, 634 | { 635 | "stackId": 26, 636 | "timestamp": 918.294999986887 637 | }, 638 | { 639 | "stackId": 26, 640 | "timestamp": 930.794999986887 641 | }, 642 | { 643 | "stackId": 26, 644 | "timestamp": 941.669999986887 645 | }, 646 | { 647 | "stackId": 26, 648 | "timestamp": 951.7549999952316 649 | }, 650 | { 651 | "stackId": 26, 652 | "timestamp": 964.2549999952316 653 | }, 654 | { 655 | "stackId": 26, 656 | "timestamp": 974.2999999821186 657 | }, 658 | { 659 | "stackId": 26, 660 | "timestamp": 984.5900000035763 661 | }, 662 | { 663 | "stackId": 26, 664 | "timestamp": 996.4650000035763 665 | }, 666 | { 667 | "stackId": 26, 668 | "timestamp": 1009.0049999952316 669 | }, 670 | { 671 | "stackId": 26, 672 | "timestamp": 1019.169999986887 673 | }, 674 | { 675 | "stackId": 26, 676 | "timestamp": 1029.294999986887 677 | }, 678 | { 679 | "stackId": 25, 680 | "timestamp": 1035.9600000083447 681 | } 682 | ], 683 | "stacks": [ 684 | { 685 | "frameId": 1 686 | }, 687 | { 688 | "frameId": 0, 689 | "parentId": 0 690 | }, 691 | { 692 | "frameId": 11 693 | }, 694 | { 695 | "frameId": 10, 696 | "parentId": 2 697 | }, 698 | { 699 | "frameId": 4, 700 | "parentId": 3 701 | }, 702 | { 703 | "frameId": 9, 704 | "parentId": 4 705 | }, 706 | { 707 | "frameId": 4, 708 | "parentId": 5 709 | }, 710 | { 711 | "frameId": 8, 712 | "parentId": 6 713 | }, 714 | { 715 | "frameId": 7, 716 | "parentId": 7 717 | }, 718 | { 719 | "frameId": 4, 720 | "parentId": 8 721 | }, 722 | { 723 | "frameId": 6, 724 | "parentId": 9 725 | }, 726 | { 727 | "frameId": 4, 728 | "parentId": 10 729 | }, 730 | { 731 | "frameId": 5, 732 | "parentId": 11 733 | }, 734 | { 735 | "frameId": 4, 736 | "parentId": 12 737 | }, 738 | { 739 | "frameId": 3, 740 | "parentId": 13 741 | }, 742 | { 743 | "frameId": 2, 744 | "parentId": 14 745 | }, 746 | { 747 | "frameId": 15 748 | }, 749 | { 750 | "frameId": 14, 751 | "parentId": 16 752 | }, 753 | { 754 | "frameId": 13, 755 | "parentId": 17 756 | }, 757 | { 758 | "frameId": 12, 759 | "parentId": 18 760 | }, 761 | { 762 | "frameId": 19 763 | }, 764 | { 765 | "frameId": 18, 766 | "parentId": 20 767 | }, 768 | { 769 | "frameId": 17, 770 | "parentId": 21 771 | }, 772 | { 773 | "frameId": 16, 774 | "parentId": 22 775 | }, 776 | { 777 | "frameId": 22 778 | }, 779 | { 780 | "frameId": 21, 781 | "parentId": 24 782 | }, 783 | { 784 | "frameId": 20, 785 | "parentId": 25 786 | } 787 | ] 788 | } -------------------------------------------------------------------------------- /src/test-data/profiling-2025-07-20T06-35-22.json: -------------------------------------------------------------------------------- 1 | { 2 | "frames": [ 3 | { 4 | "name": "Profiler" 5 | }, 6 | { 7 | "column": 38, 8 | "line": 214, 9 | "name": "startProfiling", 10 | "resourceId": 0 11 | }, 12 | { 13 | "column": 28, 14 | "line": 347, 15 | "name": "main", 16 | "resourceId": 0 17 | }, 18 | { 19 | "column": 33, 20 | "line": 398, 21 | "name": "executeWorkload", 22 | "resourceId": 0 23 | }, 24 | { 25 | "column": 32, 26 | "line": 348, 27 | "name": "beforeTask", 28 | "resourceId": 0 29 | }, 30 | { 31 | "column": 31, 32 | "line": 354, 33 | "name": "afterTask", 34 | "resourceId": 0 35 | }, 36 | { 37 | "column": 28, 38 | "line": 385, 39 | "name": "afterTask1", 40 | "resourceId": 0 41 | }, 42 | { 43 | "column": 28, 44 | "line": 391, 45 | "name": "afterTask2", 46 | "resourceId": 0 47 | }, 48 | { 49 | "column": 37, 50 | "line": 341, 51 | "name": "taskInAsyncFunction", 52 | "resourceId": 0 53 | }, 54 | { 55 | "column": 33, 56 | "line": 361, 57 | "name": "task2", 58 | "resourceId": 0 59 | } 60 | ], 61 | "resources": [ 62 | "http://localhost:3000/" 63 | ], 64 | "samples": [ 65 | { 66 | "stackId": 1, 67 | "timestamp": 462.7600000053644 68 | }, 69 | { 70 | "timestamp": 475.0949999988079 71 | }, 72 | { 73 | "timestamp": 484.8449999988079 74 | }, 75 | { 76 | "timestamp": 487.64000000059605 77 | }, 78 | { 79 | "timestamp": 500.18000000715256 80 | }, 81 | { 82 | "timestamp": 512.6750000119209 83 | }, 84 | { 85 | "timestamp": 525.0949999988079 86 | }, 87 | { 88 | "timestamp": 537.5900000035763 89 | }, 90 | { 91 | "timestamp": 550.0949999988079 92 | }, 93 | { 94 | "timestamp": 560.3850000053644 95 | }, 96 | { 97 | "timestamp": 562.765000000596 98 | }, 99 | { 100 | "timestamp": 572.8850000053644 101 | }, 102 | { 103 | "timestamp": 583.9650000035763 104 | }, 105 | { 106 | "timestamp": 596.5100000053644 107 | }, 108 | { 109 | "timestamp": 597.3850000053644 110 | }, 111 | { 112 | "timestamp": 609.0500000119209 113 | }, 114 | { 115 | "timestamp": 621.9250000119209 116 | }, 117 | { 118 | "timestamp": 634.4250000119209 119 | }, 120 | { 121 | "timestamp": 646.4650000035763 122 | }, 123 | { 124 | "timestamp": 659.0100000053644 125 | }, 126 | { 127 | "timestamp": 671.4250000119209 128 | }, 129 | { 130 | "timestamp": 683.4250000119209 131 | }, 132 | { 133 | "timestamp": 693.6800000071526 134 | }, 135 | { 136 | "timestamp": 704.3050000071526 137 | }, 138 | { 139 | "timestamp": 716.7199999988079 140 | }, 141 | { 142 | "timestamp": 729.2600000053644 143 | }, 144 | { 145 | "timestamp": 741.7199999988079 146 | }, 147 | { 148 | "timestamp": 754.2199999988079 149 | }, 150 | { 151 | "timestamp": 766.7199999988079 152 | }, 153 | { 154 | "timestamp": 779.2600000053644 155 | }, 156 | { 157 | "timestamp": 791.8050000071526 158 | }, 159 | { 160 | "timestamp": 804.3000000119209 161 | }, 162 | { 163 | "timestamp": 816.8449999988079 164 | }, 165 | { 166 | "timestamp": 829.3449999988079 167 | }, 168 | { 169 | "timestamp": 841.8850000053644 170 | }, 171 | { 172 | "timestamp": 854.3449999988079 173 | }, 174 | { 175 | "timestamp": 866.8850000053644 176 | }, 177 | { 178 | "timestamp": 879.4250000119209 179 | }, 180 | { 181 | "timestamp": 892.0100000053644 182 | }, 183 | { 184 | "timestamp": 904.5550000071526 185 | }, 186 | { 187 | "timestamp": 917.0949999988079 188 | }, 189 | { 190 | "timestamp": 929.2600000053644 191 | }, 192 | { 193 | "timestamp": 941.7600000053644 194 | }, 195 | { 196 | "timestamp": 954.2600000053644 197 | }, 198 | { 199 | "timestamp": 966.7600000053644 200 | }, 201 | { 202 | "timestamp": 979.3449999988079 203 | }, 204 | { 205 | "timestamp": 991.8850000053644 206 | }, 207 | { 208 | "timestamp": 1004.3449999988079 209 | }, 210 | { 211 | "timestamp": 1016.8850000053644 212 | }, 213 | { 214 | "timestamp": 1029.3400000035763 215 | }, 216 | { 217 | "timestamp": 1041.969999998808 218 | }, 219 | { 220 | "timestamp": 1054.3050000071526 221 | }, 222 | { 223 | "timestamp": 1066.8050000071526 224 | }, 225 | { 226 | "timestamp": 1079.2600000053644 227 | }, 228 | { 229 | "timestamp": 1091.844999998808 230 | }, 231 | { 232 | "timestamp": 1104.3850000053644 233 | }, 234 | { 235 | "timestamp": 1116.9300000071526 236 | }, 237 | { 238 | "timestamp": 1129.5100000053644 239 | }, 240 | { 241 | "timestamp": 1141.800000011921 242 | }, 243 | { 244 | "timestamp": 1154.300000011921 245 | }, 246 | { 247 | "timestamp": 1166.8850000053644 248 | }, 249 | { 250 | "timestamp": 1179.469999998808 251 | }, 252 | { 253 | "timestamp": 1192.0100000053644 254 | }, 255 | { 256 | "timestamp": 1204.469999998808 257 | }, 258 | { 259 | "timestamp": 1217.050000011921 260 | }, 261 | { 262 | "timestamp": 1229.5550000071526 263 | }, 264 | { 265 | "timestamp": 1242.050000011921 266 | }, 267 | { 268 | "timestamp": 1254.594999998808 269 | }, 270 | { 271 | "timestamp": 1267.1350000053644 272 | }, 273 | { 274 | "timestamp": 1279.6350000053644 275 | }, 276 | { 277 | "timestamp": 1292.1800000071526 278 | }, 279 | { 280 | "timestamp": 1304.765000000596 281 | }, 282 | { 283 | "timestamp": 1316.8050000071526 284 | }, 285 | { 286 | "timestamp": 1329.344999998808 287 | }, 288 | { 289 | "timestamp": 1341.8850000053644 290 | }, 291 | { 292 | "timestamp": 1354.2600000053644 293 | }, 294 | { 295 | "timestamp": 1366.7150000035763 296 | }, 297 | { 298 | "timestamp": 1377.219999998808 299 | }, 300 | { 301 | "timestamp": 1389.719999998808 302 | }, 303 | { 304 | "timestamp": 1402.050000011921 305 | }, 306 | { 307 | "timestamp": 1412.5900000035763 308 | }, 309 | { 310 | "timestamp": 1425.1350000053644 311 | }, 312 | { 313 | "timestamp": 1435.5100000053644 314 | }, 315 | { 316 | "timestamp": 1447.300000011921 317 | }, 318 | { 319 | "timestamp": 1459.3850000053644 320 | }, 321 | { 322 | "timestamp": 1471.844999998808 323 | }, 324 | { 325 | "timestamp": 1484.425000011921 326 | }, 327 | { 328 | "timestamp": 1496.925000011921 329 | }, 330 | { 331 | "timestamp": 1509.469999998808 332 | }, 333 | { 334 | "timestamp": 1521.9650000035763 335 | }, 336 | { 337 | "timestamp": 1534.5100000053644 338 | }, 339 | { 340 | "timestamp": 1547.0100000053644 341 | }, 342 | { 343 | "timestamp": 1559.5900000035763 344 | }, 345 | { 346 | "timestamp": 1571.469999998808 347 | }, 348 | { 349 | "timestamp": 1583.344999998808 350 | }, 351 | { 352 | "timestamp": 1593.9650000035763 353 | }, 354 | { 355 | "timestamp": 1604.2600000053644 356 | }, 357 | { 358 | "timestamp": 1616.765000000596 359 | }, 360 | { 361 | "timestamp": 1629.550000011921 362 | }, 363 | { 364 | "timestamp": 1641.6350000053644 365 | }, 366 | { 367 | "timestamp": 1654.2150000035763 368 | }, 369 | { 370 | "timestamp": 1665.594999998808 371 | }, 372 | { 373 | "timestamp": 1677.3850000053644 374 | }, 375 | { 376 | "timestamp": 1689.844999998808 377 | }, 378 | { 379 | "timestamp": 1701.219999998808 380 | }, 381 | { 382 | "stackId": 3, 383 | "timestamp": 1715.719999998808 384 | }, 385 | { 386 | "stackId": 4, 387 | "timestamp": 1717.469999998808 388 | }, 389 | { 390 | "stackId": 4, 391 | "timestamp": 1728.2600000053644 392 | }, 393 | { 394 | "stackId": 4, 395 | "timestamp": 1740.800000011921 396 | }, 397 | { 398 | "stackId": 4, 399 | "timestamp": 1752.050000011921 400 | }, 401 | { 402 | "stackId": 4, 403 | "timestamp": 1764.550000011921 404 | }, 405 | { 406 | "stackId": 4, 407 | "timestamp": 1776.0100000053644 408 | }, 409 | { 410 | "stackId": 4, 411 | "timestamp": 1788.5550000071526 412 | }, 413 | { 414 | "stackId": 4, 415 | "timestamp": 1801.0550000071526 416 | }, 417 | { 418 | "stackId": 4, 419 | "timestamp": 1813.550000011921 420 | }, 421 | { 422 | "stackId": 4, 423 | "timestamp": 1826.0900000035763 424 | }, 425 | { 426 | "stackId": 4, 427 | "timestamp": 1838.6350000053644 428 | }, 429 | { 430 | "stackId": 4, 431 | "timestamp": 1851.0100000053644 432 | }, 433 | { 434 | "stackId": 4, 435 | "timestamp": 1863.5550000071526 436 | }, 437 | { 438 | "stackId": 4, 439 | "timestamp": 1876.0550000071526 440 | }, 441 | { 442 | "stackId": 4, 443 | "timestamp": 1888.594999998808 444 | }, 445 | { 446 | "stackId": 4, 447 | "timestamp": 1901.015000000596 448 | }, 449 | { 450 | "stackId": 4, 451 | "timestamp": 1913.5550000071526 452 | }, 453 | { 454 | "stackId": 4, 455 | "timestamp": 1926.094999998808 456 | }, 457 | { 458 | "stackId": 4, 459 | "timestamp": 1938.594999998808 460 | }, 461 | { 462 | "stackId": 4, 463 | "timestamp": 1951.0100000053644 464 | }, 465 | { 466 | "stackId": 4, 467 | "timestamp": 1961.719999998808 468 | }, 469 | { 470 | "stackId": 4, 471 | "timestamp": 1974.265000000596 472 | }, 473 | { 474 | "stackId": 4, 475 | "timestamp": 1985.4300000071526 476 | }, 477 | { 478 | "stackId": 4, 479 | "timestamp": 1997.969999998808 480 | }, 481 | { 482 | "stackId": 4, 483 | "timestamp": 2010.2600000053644 484 | }, 485 | { 486 | "stackId": 4, 487 | "timestamp": 2022.800000011921 488 | }, 489 | { 490 | "stackId": 4, 491 | "timestamp": 2034.344999998808 492 | }, 493 | { 494 | "stackId": 4, 495 | "timestamp": 2046.8850000053644 496 | }, 497 | { 498 | "stackId": 4, 499 | "timestamp": 2059.390000000596 500 | }, 501 | { 502 | "stackId": 4, 503 | "timestamp": 2071.925000011921 504 | }, 505 | { 506 | "stackId": 4, 507 | "timestamp": 2084.3400000035763 508 | }, 509 | { 510 | "stackId": 4, 511 | "timestamp": 2096.890000000596 512 | }, 513 | { 514 | "stackId": 4, 515 | "timestamp": 2109.3850000053644 516 | }, 517 | { 518 | "stackId": 4, 519 | "timestamp": 2121.8850000053644 520 | }, 521 | { 522 | "stackId": 4, 523 | "timestamp": 2134.4300000071526 524 | }, 525 | { 526 | "stackId": 4, 527 | "timestamp": 2146.925000011921 528 | }, 529 | { 530 | "stackId": 4, 531 | "timestamp": 2159.425000011921 532 | }, 533 | { 534 | "stackId": 4, 535 | "timestamp": 2171.969999998808 536 | }, 537 | { 538 | "stackId": 4, 539 | "timestamp": 2184.344999998808 540 | }, 541 | { 542 | "stackId": 4, 543 | "timestamp": 2191.3850000053644 544 | }, 545 | { 546 | "stackId": 5, 547 | "timestamp": 2192.1800000071526 548 | }, 549 | { 550 | "stackId": 5, 551 | "timestamp": 2196.8850000053644 552 | }, 553 | { 554 | "stackId": 5, 555 | "timestamp": 2209.4300000071526 556 | }, 557 | { 558 | "stackId": 5, 559 | "timestamp": 2221.8850000053644 560 | }, 561 | { 562 | "stackId": 5, 563 | "timestamp": 2234.3400000035763 564 | }, 565 | { 566 | "stackId": 5, 567 | "timestamp": 2245.890000000596 568 | }, 569 | { 570 | "stackId": 5, 571 | "timestamp": 2258.3850000053644 572 | }, 573 | { 574 | "stackId": 5, 575 | "timestamp": 2270.925000011921 576 | }, 577 | { 578 | "stackId": 5, 579 | "timestamp": 2283.469999998808 580 | }, 581 | { 582 | "stackId": 5, 583 | "timestamp": 2295.8850000053644 584 | }, 585 | { 586 | "stackId": 5, 587 | "timestamp": 2308.3850000053644 588 | }, 589 | { 590 | "stackId": 5, 591 | "timestamp": 2320.8850000053644 592 | }, 593 | { 594 | "stackId": 5, 595 | "timestamp": 2333.3850000053644 596 | }, 597 | { 598 | "stackId": 5, 599 | "timestamp": 2345.925000011921 600 | }, 601 | { 602 | "stackId": 5, 603 | "timestamp": 2358.3400000035763 604 | }, 605 | { 606 | "stackId": 5, 607 | "timestamp": 2370.890000000596 608 | }, 609 | { 610 | "stackId": 5, 611 | "timestamp": 2383.4300000071526 612 | }, 613 | { 614 | "stackId": 5, 615 | "timestamp": 2395.925000011921 616 | }, 617 | { 618 | "stackId": 5, 619 | "timestamp": 2408.469999998808 620 | }, 621 | { 622 | "stackId": 5, 623 | "timestamp": 2420.8850000053644 624 | }, 625 | { 626 | "stackId": 5, 627 | "timestamp": 2433.3850000053644 628 | }, 629 | { 630 | "stackId": 5, 631 | "timestamp": 2445.8850000053644 632 | }, 633 | { 634 | "stackId": 5, 635 | "timestamp": 2458.3850000053644 636 | }, 637 | { 638 | "stackId": 5, 639 | "timestamp": 2470.8850000053644 640 | }, 641 | { 642 | "stackId": 5, 643 | "timestamp": 2483.3850000053644 644 | }, 645 | { 646 | "stackId": 5, 647 | "timestamp": 2495.969999998808 648 | }, 649 | { 650 | "stackId": 5, 651 | "timestamp": 2508.3850000053644 652 | }, 653 | { 654 | "stackId": 5, 655 | "timestamp": 2520.8850000053644 656 | }, 657 | { 658 | "stackId": 5, 659 | "timestamp": 2533.425000011921 660 | }, 661 | { 662 | "stackId": 5, 663 | "timestamp": 2545.890000000596 664 | }, 665 | { 666 | "stackId": 5, 667 | "timestamp": 2558.3850000053644 668 | }, 669 | { 670 | "stackId": 5, 671 | "timestamp": 2570.925000011921 672 | }, 673 | { 674 | "stackId": 5, 675 | "timestamp": 2583.469999998808 676 | }, 677 | { 678 | "stackId": 5, 679 | "timestamp": 2595.969999998808 680 | }, 681 | { 682 | "stackId": 5, 683 | "timestamp": 2608.5100000053644 684 | }, 685 | { 686 | "stackId": 5, 687 | "timestamp": 2620.9650000035763 688 | }, 689 | { 690 | "stackId": 5, 691 | "timestamp": 2633.550000011921 692 | }, 693 | { 694 | "stackId": 5, 695 | "timestamp": 2645.969999998808 696 | }, 697 | { 698 | "stackId": 5, 699 | "timestamp": 2652.1350000053644 700 | }, 701 | { 702 | "stackId": 6, 703 | "timestamp": 2652.8850000053644 704 | }, 705 | { 706 | "stackId": 6, 707 | "timestamp": 2658.5100000053644 708 | }, 709 | { 710 | "stackId": 6, 711 | "timestamp": 2670.969999998808 712 | }, 713 | { 714 | "stackId": 6, 715 | "timestamp": 2683.469999998808 716 | }, 717 | { 718 | "stackId": 6, 719 | "timestamp": 2695.1350000053644 720 | }, 721 | { 722 | "stackId": 6, 723 | "timestamp": 2707.4300000071526 724 | }, 725 | { 726 | "stackId": 6, 727 | "timestamp": 2718.719999998808 728 | }, 729 | { 730 | "stackId": 6, 731 | "timestamp": 2729.300000011921 732 | }, 733 | { 734 | "stackId": 6, 735 | "timestamp": 2741.800000011921 736 | }, 737 | { 738 | "stackId": 6, 739 | "timestamp": 2754.344999998808 740 | }, 741 | { 742 | "stackId": 6, 743 | "timestamp": 2766.8050000071526 744 | }, 745 | { 746 | "stackId": 6, 747 | "timestamp": 2779.344999998808 748 | }, 749 | { 750 | "stackId": 6, 751 | "timestamp": 2791.800000011921 752 | }, 753 | { 754 | "stackId": 6, 755 | "timestamp": 2804.344999998808 756 | }, 757 | { 758 | "stackId": 6, 759 | "timestamp": 2816.8850000053644 760 | }, 761 | { 762 | "stackId": 6, 763 | "timestamp": 2829.3850000053644 764 | }, 765 | { 766 | "stackId": 6, 767 | "timestamp": 2841.8850000053644 768 | }, 769 | { 770 | "stackId": 6, 771 | "timestamp": 2854.4300000071526 772 | }, 773 | { 774 | "stackId": 6, 775 | "timestamp": 2866.9300000071526 776 | }, 777 | { 778 | "stackId": 6, 779 | "timestamp": 2879.425000011921 780 | }, 781 | { 782 | "stackId": 6, 783 | "timestamp": 2891.969999998808 784 | }, 785 | { 786 | "stackId": 6, 787 | "timestamp": 2904.5100000053644 788 | }, 789 | { 790 | "stackId": 6, 791 | "timestamp": 2917.0100000053644 792 | }, 793 | { 794 | "stackId": 6, 795 | "timestamp": 2929.5100000053644 796 | }, 797 | { 798 | "stackId": 6, 799 | "timestamp": 2942.0550000071526 800 | }, 801 | { 802 | "stackId": 6, 803 | "timestamp": 2954.550000011921 804 | }, 805 | { 806 | "stackId": 6, 807 | "timestamp": 2967.0550000071526 808 | }, 809 | { 810 | "stackId": 6, 811 | "timestamp": 2979.5550000071526 812 | }, 813 | { 814 | "stackId": 6, 815 | "timestamp": 2992.094999998808 816 | }, 817 | { 818 | "stackId": 6, 819 | "timestamp": 3004.594999998808 820 | }, 821 | { 822 | "stackId": 6, 823 | "timestamp": 3017.1350000053644 824 | }, 825 | { 826 | "stackId": 6, 827 | "timestamp": 3029.6350000053644 828 | }, 829 | { 830 | "stackId": 6, 831 | "timestamp": 3041.765000000596 832 | }, 833 | { 834 | "stackId": 6, 835 | "timestamp": 3054.265000000596 836 | }, 837 | { 838 | "stackId": 6, 839 | "timestamp": 3066.800000011921 840 | }, 841 | { 842 | "stackId": 6, 843 | "timestamp": 3079.2600000053644 844 | }, 845 | { 846 | "stackId": 6, 847 | "timestamp": 3091.7600000053644 848 | }, 849 | { 850 | "stackId": 6, 851 | "timestamp": 3104.2600000053644 852 | }, 853 | { 854 | "stackId": 6, 855 | "timestamp": 3110.675000011921 856 | }, 857 | { 858 | "stackId": 7, 859 | "timestamp": 3111.344999998808 860 | }, 861 | { 862 | "stackId": 7, 863 | "timestamp": 3116.8050000071526 864 | }, 865 | { 866 | "stackId": 7, 867 | "timestamp": 3129.344999998808 868 | }, 869 | { 870 | "stackId": 7, 871 | "timestamp": 3141.8850000053644 872 | }, 873 | { 874 | "stackId": 7, 875 | "timestamp": 3154.3850000053644 876 | }, 877 | { 878 | "stackId": 7, 879 | "timestamp": 3166.9300000071526 880 | }, 881 | { 882 | "stackId": 7, 883 | "timestamp": 3179.425000011921 884 | }, 885 | { 886 | "stackId": 7, 887 | "timestamp": 3191.969999998808 888 | }, 889 | { 890 | "stackId": 7, 891 | "timestamp": 3204.4650000035763 892 | }, 893 | { 894 | "stackId": 7, 895 | "timestamp": 3216.7600000053644 896 | }, 897 | { 898 | "stackId": 7, 899 | "timestamp": 3229.265000000596 900 | }, 901 | { 902 | "stackId": 7, 903 | "timestamp": 3241.800000011921 904 | }, 905 | { 906 | "stackId": 7, 907 | "timestamp": 3254.300000011921 908 | }, 909 | { 910 | "stackId": 7, 911 | "timestamp": 3266.844999998808 912 | }, 913 | { 914 | "stackId": 7, 915 | "timestamp": 3279.344999998808 916 | }, 917 | { 918 | "stackId": 7, 919 | "timestamp": 3291.8850000053644 920 | }, 921 | { 922 | "stackId": 7, 923 | "timestamp": 3304.4300000071526 924 | }, 925 | { 926 | "stackId": 7, 927 | "timestamp": 3316.844999998808 928 | }, 929 | { 930 | "stackId": 7, 931 | "timestamp": 3329.3850000053644 932 | }, 933 | { 934 | "stackId": 7, 935 | "timestamp": 3341.8850000053644 936 | }, 937 | { 938 | "stackId": 7, 939 | "timestamp": 3352.5100000053644 940 | }, 941 | { 942 | "stackId": 7, 943 | "timestamp": 3365.0100000053644 944 | }, 945 | { 946 | "stackId": 7, 947 | "timestamp": 3376.050000011921 948 | }, 949 | { 950 | "stackId": 7, 951 | "timestamp": 3388.550000011921 952 | }, 953 | { 954 | "stackId": 7, 955 | "timestamp": 3401.050000011921 956 | }, 957 | { 958 | "stackId": 7, 959 | "timestamp": 3413.594999998808 960 | }, 961 | { 962 | "stackId": 7, 963 | "timestamp": 3426.1350000053644 964 | }, 965 | { 966 | "stackId": 7, 967 | "timestamp": 3438.675000011921 968 | }, 969 | { 970 | "stackId": 7, 971 | "timestamp": 3451.0100000053644 972 | }, 973 | { 974 | "stackId": 7, 975 | "timestamp": 3463.5550000071526 976 | }, 977 | { 978 | "stackId": 7, 979 | "timestamp": 3476.050000011921 980 | }, 981 | { 982 | "stackId": 7, 983 | "timestamp": 3488.594999998808 984 | }, 985 | { 986 | "stackId": 7, 987 | "timestamp": 3501.0100000053644 988 | }, 989 | { 990 | "stackId": 7, 991 | "timestamp": 3513.5100000053644 992 | }, 993 | { 994 | "stackId": 7, 995 | "timestamp": 3526.050000011921 996 | }, 997 | { 998 | "stackId": 7, 999 | "timestamp": 3538.515000000596 1000 | }, 1001 | { 1002 | "stackId": 7, 1003 | "timestamp": 3551.094999998808 1004 | }, 1005 | { 1006 | "stackId": 7, 1007 | "timestamp": 3563.6350000053644 1008 | }, 1009 | { 1010 | "stackId": 7, 1011 | "timestamp": 3566.844999998808 1012 | }, 1013 | { 1014 | "stackId": 9, 1015 | "timestamp": 3570.300000011921 1016 | }, 1017 | { 1018 | "stackId": 9, 1019 | "timestamp": 3576.1800000071526 1020 | }, 1021 | { 1022 | "stackId": 9, 1023 | "timestamp": 3588.675000011921 1024 | }, 1025 | { 1026 | "stackId": 9, 1027 | "timestamp": 3601.0100000053644 1028 | }, 1029 | { 1030 | "stackId": 9, 1031 | "timestamp": 3612.5550000071526 1032 | }, 1033 | { 1034 | "stackId": 9, 1035 | "timestamp": 3625.094999998808 1036 | }, 1037 | { 1038 | "stackId": 9, 1039 | "timestamp": 3637.5900000035763 1040 | }, 1041 | { 1042 | "stackId": 9, 1043 | "timestamp": 3650.1350000053644 1044 | }, 1045 | { 1046 | "stackId": 9, 1047 | "timestamp": 3662.6350000053644 1048 | }, 1049 | { 1050 | "stackId": 9, 1051 | "timestamp": 3675.1350000053644 1052 | }, 1053 | { 1054 | "stackId": 9, 1055 | "timestamp": 3687.594999998808 1056 | }, 1057 | { 1058 | "stackId": 9, 1059 | "timestamp": 3700.050000011921 1060 | }, 1061 | { 1062 | "stackId": 9, 1063 | "timestamp": 3710.3850000053644 1064 | }, 1065 | { 1066 | "stackId": 9, 1067 | "timestamp": 3722.8850000053644 1068 | }, 1069 | { 1070 | "stackId": 9, 1071 | "timestamp": 3734.3850000053644 1072 | }, 1073 | { 1074 | "stackId": 9, 1075 | "timestamp": 3746.9300000071526 1076 | }, 1077 | { 1078 | "stackId": 9, 1079 | "timestamp": 3759.3850000053644 1080 | }, 1081 | { 1082 | "stackId": 9, 1083 | "timestamp": 3771.8850000053644 1084 | }, 1085 | { 1086 | "stackId": 9, 1087 | "timestamp": 3784.344999998808 1088 | }, 1089 | { 1090 | "stackId": 9, 1091 | "timestamp": 3796.8850000053644 1092 | }, 1093 | { 1094 | "stackId": 9, 1095 | "timestamp": 3809.344999998808 1096 | }, 1097 | { 1098 | "stackId": 9, 1099 | "timestamp": 3821.8850000053644 1100 | }, 1101 | { 1102 | "stackId": 9, 1103 | "timestamp": 3834.3850000053644 1104 | }, 1105 | { 1106 | "stackId": 9, 1107 | "timestamp": 3846.9300000071526 1108 | }, 1109 | { 1110 | "stackId": 9, 1111 | "timestamp": 3858.3850000053644 1112 | }, 1113 | { 1114 | "stackId": 9, 1115 | "timestamp": 3870.925000011921 1116 | }, 1117 | { 1118 | "stackId": 9, 1119 | "timestamp": 3883.469999998808 1120 | }, 1121 | { 1122 | "stackId": 9, 1123 | "timestamp": 3895.9650000035763 1124 | }, 1125 | { 1126 | "stackId": 9, 1127 | "timestamp": 3908.469999998808 1128 | }, 1129 | { 1130 | "stackId": 9, 1131 | "timestamp": 3921.0100000053644 1132 | }, 1133 | { 1134 | "stackId": 9, 1135 | "timestamp": 3933.5100000053644 1136 | }, 1137 | { 1138 | "stackId": 9, 1139 | "timestamp": 3946.0100000053644 1140 | }, 1141 | { 1142 | "stackId": 9, 1143 | "timestamp": 3958.5100000053644 1144 | }, 1145 | { 1146 | "stackId": 9, 1147 | "timestamp": 3971.050000011921 1148 | }, 1149 | { 1150 | "stackId": 9, 1151 | "timestamp": 3983.550000011921 1152 | }, 1153 | { 1154 | "stackId": 9, 1155 | "timestamp": 3996.050000011921 1156 | }, 1157 | { 1158 | "stackId": 9, 1159 | "timestamp": 4008.594999998808 1160 | }, 1161 | { 1162 | "stackId": 9, 1163 | "timestamp": 4021.094999998808 1164 | }, 1165 | { 1166 | "stackId": 9, 1167 | "timestamp": 4025.6350000053644 1168 | }, 1169 | { 1170 | "stackId": 9, 1171 | "timestamp": 4033.594999998808 1172 | }, 1173 | { 1174 | "stackId": 9, 1175 | "timestamp": 4046.094999998808 1176 | }, 1177 | { 1178 | "stackId": 9, 1179 | "timestamp": 4058.594999998808 1180 | }, 1181 | { 1182 | "stackId": 9, 1183 | "timestamp": 4071.1350000053644 1184 | }, 1185 | { 1186 | "stackId": 9, 1187 | "timestamp": 4083.640000000596 1188 | }, 1189 | { 1190 | "stackId": 9, 1191 | "timestamp": 4096.135000005364 1192 | }, 1193 | { 1194 | "stackId": 9, 1195 | "timestamp": 4108.640000000596 1196 | }, 1197 | { 1198 | "stackId": 9, 1199 | "timestamp": 4121.175000011921 1200 | }, 1201 | { 1202 | "stackId": 9, 1203 | "timestamp": 4133.680000007153 1204 | }, 1205 | { 1206 | "stackId": 9, 1207 | "timestamp": 4146.175000011921 1208 | }, 1209 | { 1210 | "stackId": 9, 1211 | "timestamp": 4158.675000011921 1212 | }, 1213 | { 1214 | "stackId": 9, 1215 | "timestamp": 4171.219999998808 1216 | }, 1217 | { 1218 | "stackId": 9, 1219 | "timestamp": 4183.719999998808 1220 | }, 1221 | { 1222 | "stackId": 9, 1223 | "timestamp": 4196.260000005364 1224 | }, 1225 | { 1226 | "stackId": 9, 1227 | "timestamp": 4208.805000007153 1228 | }, 1229 | { 1230 | "stackId": 9, 1231 | "timestamp": 4221.305000007153 1232 | }, 1233 | { 1234 | "stackId": 9, 1235 | "timestamp": 4233.800000011921 1236 | }, 1237 | { 1238 | "stackId": 9, 1239 | "timestamp": 4246.344999998808 1240 | }, 1241 | { 1242 | "stackId": 9, 1243 | "timestamp": 4258.844999998808 1244 | }, 1245 | { 1246 | "stackId": 9, 1247 | "timestamp": 4271.344999998808 1248 | }, 1249 | { 1250 | "stackId": 9, 1251 | "timestamp": 4283.844999998808 1252 | }, 1253 | { 1254 | "stackId": 9, 1255 | "timestamp": 4296.385000005364 1256 | }, 1257 | { 1258 | "stackId": 9, 1259 | "timestamp": 4308.885000005364 1260 | }, 1261 | { 1262 | "stackId": 9, 1263 | "timestamp": 4321.385000005364 1264 | }, 1265 | { 1266 | "stackId": 9, 1267 | "timestamp": 4333.930000007153 1268 | }, 1269 | { 1270 | "stackId": 9, 1271 | "timestamp": 4346.385000005364 1272 | }, 1273 | { 1274 | "stackId": 9, 1275 | "timestamp": 4358.885000005364 1276 | }, 1277 | { 1278 | "stackId": 9, 1279 | "timestamp": 4371.385000005364 1280 | }, 1281 | { 1282 | "stackId": 9, 1283 | "timestamp": 4383.925000011921 1284 | }, 1285 | { 1286 | "stackId": 9, 1287 | "timestamp": 4396.385000005364 1288 | }, 1289 | { 1290 | "stackId": 9, 1291 | "timestamp": 4408.885000005364 1292 | }, 1293 | { 1294 | "stackId": 9, 1295 | "timestamp": 4421.385000005364 1296 | }, 1297 | { 1298 | "stackId": 9, 1299 | "timestamp": 4433.969999998808 1300 | }, 1301 | { 1302 | "stackId": 9, 1303 | "timestamp": 4446.469999998808 1304 | }, 1305 | { 1306 | "stackId": 9, 1307 | "timestamp": 4458.969999998808 1308 | }, 1309 | { 1310 | "stackId": 9, 1311 | "timestamp": 4471.510000005364 1312 | }, 1313 | { 1314 | "stackId": 9, 1315 | "timestamp": 4480.765000000596 1316 | }, 1317 | { 1318 | "timestamp": 4484.055000007153 1319 | }, 1320 | { 1321 | "timestamp": 4496.550000011921 1322 | }, 1323 | { 1324 | "timestamp": 4509.140000000596 1325 | }, 1326 | { 1327 | "timestamp": 4521.635000005364 1328 | }, 1329 | { 1330 | "timestamp": 4534.135000005364 1331 | }, 1332 | { 1333 | "timestamp": 4546.675000011921 1334 | }, 1335 | { 1336 | "timestamp": 4559.219999998808 1337 | }, 1338 | { 1339 | "timestamp": 4571.260000005364 1340 | }, 1341 | { 1342 | "timestamp": 4583.760000005364 1343 | }, 1344 | { 1345 | "timestamp": 4596.344999998808 1346 | }, 1347 | { 1348 | "timestamp": 4608.844999998808 1349 | }, 1350 | { 1351 | "timestamp": 4621.390000000596 1352 | }, 1353 | { 1354 | "timestamp": 4633.885000005364 1355 | }, 1356 | { 1357 | "timestamp": 4646.430000007153 1358 | }, 1359 | { 1360 | "timestamp": 4658.925000011921 1361 | }, 1362 | { 1363 | "timestamp": 4671.510000005364 1364 | }, 1365 | { 1366 | "timestamp": 4684.010000005364 1367 | }, 1368 | { 1369 | "timestamp": 4696.555000007153 1370 | }, 1371 | { 1372 | "timestamp": 4709.135000005364 1373 | }, 1374 | { 1375 | "timestamp": 4721.635000005364 1376 | }, 1377 | { 1378 | "timestamp": 4733.219999998808 1379 | }, 1380 | { 1381 | "timestamp": 4745.719999998808 1382 | }, 1383 | { 1384 | "timestamp": 4756.844999998808 1385 | }, 1386 | { 1387 | "timestamp": 4769.344999998808 1388 | }, 1389 | { 1390 | "timestamp": 4781.890000000596 1391 | }, 1392 | { 1393 | "timestamp": 4794.425000011921 1394 | }, 1395 | { 1396 | "timestamp": 4805.265000000596 1397 | }, 1398 | { 1399 | "timestamp": 4816.015000000596 1400 | }, 1401 | { 1402 | "timestamp": 4828.550000011921 1403 | }, 1404 | { 1405 | "timestamp": 4841.010000005364 1406 | }, 1407 | { 1408 | "timestamp": 4851.675000011921 1409 | }, 1410 | { 1411 | "timestamp": 4863.219999998808 1412 | }, 1413 | { 1414 | "timestamp": 4875.800000011921 1415 | }, 1416 | { 1417 | "timestamp": 4888.300000011921 1418 | }, 1419 | { 1420 | "timestamp": 4899.510000005364 1421 | }, 1422 | { 1423 | "timestamp": 4912.055000007153 1424 | }, 1425 | { 1426 | "timestamp": 4923.094999998808 1427 | }, 1428 | { 1429 | "timestamp": 4934.135000005364 1430 | }, 1431 | { 1432 | "timestamp": 4945.180000007153 1433 | }, 1434 | { 1435 | "timestamp": 4955.300000011921 1436 | }, 1437 | { 1438 | "timestamp": 4966.305000007153 1439 | }, 1440 | { 1441 | "timestamp": 4978.844999998808 1442 | }, 1443 | { 1444 | "timestamp": 4989.050000011921 1445 | }, 1446 | { 1447 | "timestamp": 5000.260000005364 1448 | }, 1449 | { 1450 | "timestamp": 5010.385000005364 1451 | }, 1452 | { 1453 | "timestamp": 5021.385000005364 1454 | }, 1455 | { 1456 | "timestamp": 5033.760000005364 1457 | }, 1458 | { 1459 | "timestamp": 5045.550000011921 1460 | }, 1461 | { 1462 | "timestamp": 5055.635000005364 1463 | }, 1464 | { 1465 | "timestamp": 5068.175000011921 1466 | }, 1467 | { 1468 | "timestamp": 5080.719999998808 1469 | }, 1470 | { 1471 | "timestamp": 5093.260000005364 1472 | }, 1473 | { 1474 | "timestamp": 5105.510000005364 1475 | }, 1476 | { 1477 | "timestamp": 5117.800000011921 1478 | }, 1479 | { 1480 | "timestamp": 5130.300000011921 1481 | }, 1482 | { 1483 | "timestamp": 5141.925000011921 1484 | }, 1485 | { 1486 | "timestamp": 5154.385000005364 1487 | }, 1488 | { 1489 | "timestamp": 5165.050000011921 1490 | }, 1491 | { 1492 | "timestamp": 5177.550000011921 1493 | }, 1494 | { 1495 | "timestamp": 5190.094999998808 1496 | }, 1497 | { 1498 | "timestamp": 5200.760000005364 1499 | }, 1500 | { 1501 | "timestamp": 5213.340000003576 1502 | }, 1503 | { 1504 | "timestamp": 5225.885000005364 1505 | }, 1506 | { 1507 | "timestamp": 5237.094999998808 1508 | }, 1509 | { 1510 | "timestamp": 5249.635000005364 1511 | }, 1512 | { 1513 | "timestamp": 5260.385000005364 1514 | }, 1515 | { 1516 | "timestamp": 5272.890000000596 1517 | }, 1518 | { 1519 | "timestamp": 5285.469999998808 1520 | }, 1521 | { 1522 | "timestamp": 5295.555000007153 1523 | }, 1524 | { 1525 | "timestamp": 5307.260000005364 1526 | }, 1527 | { 1528 | "timestamp": 5319.390000000596 1529 | }, 1530 | { 1531 | "timestamp": 5331.925000011921 1532 | }, 1533 | { 1534 | "timestamp": 5343.425000011921 1535 | }, 1536 | { 1537 | "timestamp": 5355.469999998808 1538 | }, 1539 | { 1540 | "timestamp": 5367.010000005364 1541 | }, 1542 | { 1543 | "timestamp": 5379.550000011921 1544 | }, 1545 | { 1546 | "timestamp": 5392.090000003576 1547 | }, 1548 | { 1549 | "timestamp": 5404.594999998808 1550 | }, 1551 | { 1552 | "timestamp": 5420.885000005364 1553 | }, 1554 | { 1555 | "timestamp": 5432.675000011921 1556 | }, 1557 | { 1558 | "timestamp": 5445.219999998808 1559 | }, 1560 | { 1561 | "timestamp": 5457.805000007153 1562 | }, 1563 | { 1564 | "timestamp": 5470.385000005364 1565 | }, 1566 | { 1567 | "timestamp": 5481.390000000596 1568 | }, 1569 | { 1570 | "timestamp": 5492.925000011921 1571 | }, 1572 | { 1573 | "timestamp": 5505.469999998808 1574 | }, 1575 | { 1576 | "timestamp": 5518.010000005364 1577 | }, 1578 | { 1579 | "timestamp": 5530.550000011921 1580 | }, 1581 | { 1582 | "timestamp": 5543.135000005364 1583 | }, 1584 | { 1585 | "timestamp": 5555.675000011921 1586 | }, 1587 | { 1588 | "timestamp": 5565.965000003576 1589 | }, 1590 | { 1591 | "timestamp": 5577.805000007153 1592 | }, 1593 | { 1594 | "timestamp": 5590.180000007153 1595 | }, 1596 | { 1597 | "timestamp": 5602.715000003576 1598 | }, 1599 | { 1600 | "timestamp": 5613.550000011921 1601 | }, 1602 | { 1603 | "timestamp": 5625.760000005364 1604 | }, 1605 | { 1606 | "timestamp": 5638.300000011921 1607 | }, 1608 | { 1609 | "timestamp": 5650.805000007153 1610 | }, 1611 | { 1612 | "timestamp": 5663.344999998808 1613 | }, 1614 | { 1615 | "timestamp": 5675.844999998808 1616 | }, 1617 | { 1618 | "timestamp": 5686.215000003576 1619 | }, 1620 | { 1621 | "timestamp": 5697.260000005364 1622 | }, 1623 | { 1624 | "timestamp": 5708.340000003576 1625 | }, 1626 | { 1627 | "timestamp": 5719.094999998808 1628 | }, 1629 | { 1630 | "timestamp": 5730.135000005364 1631 | }, 1632 | { 1633 | "timestamp": 5742.140000000596 1634 | }, 1635 | { 1636 | "timestamp": 5754.760000005364 1637 | }, 1638 | { 1639 | "timestamp": 5767.260000005364 1640 | }, 1641 | { 1642 | "timestamp": 5779.800000011921 1643 | }, 1644 | { 1645 | "timestamp": 5792.305000007153 1646 | }, 1647 | { 1648 | "timestamp": 5804.844999998808 1649 | }, 1650 | { 1651 | "timestamp": 5817.385000005364 1652 | }, 1653 | { 1654 | "timestamp": 5828.385000005364 1655 | }, 1656 | { 1657 | "timestamp": 5839.425000011921 1658 | }, 1659 | { 1660 | "timestamp": 5850.930000007153 1661 | }, 1662 | { 1663 | "timestamp": 5862.050000011921 1664 | }, 1665 | { 1666 | "timestamp": 5873.140000000596 1667 | }, 1668 | { 1669 | "timestamp": 5884.135000005364 1670 | }, 1671 | { 1672 | "timestamp": 5895.215000003576 1673 | }, 1674 | { 1675 | "timestamp": 5905.385000005364 1676 | }, 1677 | { 1678 | "timestamp": 5916.469999998808 1679 | }, 1680 | { 1681 | "timestamp": 5927.594999998808 1682 | }, 1683 | { 1684 | "timestamp": 5938.010000005364 1685 | }, 1686 | { 1687 | "timestamp": 5949.675000011921 1688 | }, 1689 | { 1690 | "timestamp": 5961.510000005364 1691 | }, 1692 | { 1693 | "timestamp": 5972.469999998808 1694 | }, 1695 | { 1696 | "timestamp": 5987.510000005364 1697 | }, 1698 | { 1699 | "timestamp": 6000.090000003576 1700 | }, 1701 | { 1702 | "timestamp": 6012.719999998808 1703 | }, 1704 | { 1705 | "timestamp": 6023.760000005364 1706 | }, 1707 | { 1708 | "timestamp": 6034.719999998808 1709 | }, 1710 | { 1711 | "timestamp": 6045.930000007153 1712 | }, 1713 | { 1714 | "timestamp": 6058.430000007153 1715 | }, 1716 | { 1717 | "timestamp": 6070.965000003576 1718 | }, 1719 | { 1720 | "timestamp": 6083.550000011921 1721 | }, 1722 | { 1723 | "timestamp": 6096.094999998808 1724 | }, 1725 | { 1726 | "timestamp": 6108.425000011921 1727 | }, 1728 | { 1729 | "timestamp": 6120.925000011921 1730 | }, 1731 | { 1732 | "timestamp": 6133.510000005364 1733 | }, 1734 | { 1735 | "timestamp": 6143.760000005364 1736 | }, 1737 | { 1738 | "timestamp": 6155.344999998808 1739 | }, 1740 | { 1741 | "timestamp": 6167.719999998808 1742 | }, 1743 | { 1744 | "timestamp": 6180.265000000596 1745 | }, 1746 | { 1747 | "timestamp": 6192.885000005364 1748 | }, 1749 | { 1750 | "timestamp": 6205.515000000596 1751 | }, 1752 | { 1753 | "timestamp": 6217.760000005364 1754 | }, 1755 | { 1756 | "timestamp": 6230.425000011921 1757 | }, 1758 | { 1759 | "timestamp": 6242.300000011921 1760 | }, 1761 | { 1762 | "timestamp": 6254.840000003576 1763 | }, 1764 | { 1765 | "timestamp": 6266.635000005364 1766 | }, 1767 | { 1768 | "timestamp": 6277.719999998808 1769 | }, 1770 | { 1771 | "timestamp": 6288.715000003576 1772 | }, 1773 | { 1774 | "timestamp": 6301.094999998808 1775 | }, 1776 | { 1777 | "timestamp": 6313.635000005364 1778 | }, 1779 | { 1780 | "timestamp": 6326.175000011921 1781 | }, 1782 | { 1783 | "timestamp": 6337.300000011921 1784 | }, 1785 | { 1786 | "timestamp": 6347.510000005364 1787 | }, 1788 | { 1789 | "timestamp": 6357.680000007153 1790 | }, 1791 | { 1792 | "timestamp": 6370.219999998808 1793 | }, 1794 | { 1795 | "timestamp": 6382.760000005364 1796 | }, 1797 | { 1798 | "timestamp": 6395.305000007153 1799 | }, 1800 | { 1801 | "timestamp": 6405.590000003576 1802 | }, 1803 | { 1804 | "timestamp": 6418.260000005364 1805 | }, 1806 | { 1807 | "timestamp": 6429.219999998808 1808 | }, 1809 | { 1810 | "timestamp": 6441.840000003576 1811 | }, 1812 | { 1813 | "timestamp": 6454.385000005364 1814 | }, 1815 | { 1816 | "timestamp": 6464.675000011921 1817 | }, 1818 | { 1819 | "timestamp": 6477.135000005364 1820 | }, 1821 | { 1822 | "timestamp": 6487.844999998808 1823 | }, 1824 | { 1825 | "timestamp": 6499.675000011921 1826 | }, 1827 | { 1828 | "timestamp": 6510.260000005364 1829 | }, 1830 | { 1831 | "timestamp": 6522.844999998808 1832 | }, 1833 | { 1834 | "timestamp": 6533.550000011921 1835 | }, 1836 | { 1837 | "timestamp": 6544.469999998808 1838 | }, 1839 | { 1840 | "timestamp": 6557.010000005364 1841 | }, 1842 | { 1843 | "timestamp": 6567.090000003576 1844 | }, 1845 | { 1846 | "timestamp": 6579.680000007153 1847 | }, 1848 | { 1849 | "timestamp": 6591.594999998808 1850 | }, 1851 | { 1852 | "timestamp": 6604.094999998808 1853 | }, 1854 | { 1855 | "timestamp": 6616.594999998808 1856 | }, 1857 | { 1858 | "timestamp": 6627.635000005364 1859 | }, 1860 | { 1861 | "timestamp": 6638.675000011921 1862 | }, 1863 | { 1864 | "timestamp": 6649.719999998808 1865 | }, 1866 | { 1867 | "timestamp": 6660.760000005364 1868 | }, 1869 | { 1870 | "timestamp": 6671.800000011921 1871 | }, 1872 | { 1873 | "timestamp": 6682.844999998808 1874 | }, 1875 | { 1876 | "timestamp": 6693.885000005364 1877 | }, 1878 | { 1879 | "timestamp": 6704.930000007153 1880 | }, 1881 | { 1882 | "timestamp": 6715.300000011921 1883 | }, 1884 | { 1885 | "timestamp": 6725.344999998808 1886 | }, 1887 | { 1888 | "timestamp": 6735.550000011921 1889 | }, 1890 | { 1891 | "timestamp": 6747.844999998808 1892 | }, 1893 | { 1894 | "timestamp": 6760.390000000596 1895 | }, 1896 | { 1897 | "timestamp": 6770.800000011921 1898 | }, 1899 | { 1900 | "timestamp": 6783.260000005364 1901 | }, 1902 | { 1903 | "timestamp": 6795.175000011921 1904 | }, 1905 | { 1906 | "timestamp": 6805.215000003576 1907 | }, 1908 | { 1909 | "timestamp": 6815.300000011921 1910 | }, 1911 | { 1912 | "timestamp": 6827.344999998808 1913 | }, 1914 | { 1915 | "timestamp": 6837.635000005364 1916 | }, 1917 | { 1918 | "timestamp": 6850.305000007153 1919 | }, 1920 | { 1921 | "timestamp": 6861.969999998808 1922 | }, 1923 | { 1924 | "timestamp": 6875.180000007153 1925 | }, 1926 | { 1927 | "timestamp": 6886.385000005364 1928 | }, 1929 | { 1930 | "timestamp": 6897.425000011921 1931 | }, 1932 | { 1933 | "timestamp": 6909.965000003576 1934 | }, 1935 | { 1936 | "timestamp": 6922.594999998808 1937 | }, 1938 | { 1939 | "timestamp": 6935.219999998808 1940 | }, 1941 | { 1942 | "timestamp": 6947.260000005364 1943 | }, 1944 | { 1945 | "timestamp": 6958.969999998808 1946 | }, 1947 | { 1948 | "timestamp": 6971.510000005364 1949 | }, 1950 | { 1951 | "timestamp": 6982.430000007153 1952 | }, 1953 | { 1954 | "timestamp": 6992.760000005364 1955 | }, 1956 | { 1957 | "timestamp": 7004.594999998808 1958 | }, 1959 | { 1960 | "timestamp": 7017.094999998808 1961 | }, 1962 | { 1963 | "timestamp": 7029.635000005364 1964 | }, 1965 | { 1966 | "timestamp": 7042.175000011921 1967 | }, 1968 | { 1969 | "timestamp": 7054.719999998808 1970 | }, 1971 | { 1972 | "timestamp": 7067.260000005364 1973 | }, 1974 | { 1975 | "timestamp": 7079.800000011921 1976 | }, 1977 | { 1978 | "timestamp": 7092.390000000596 1979 | }, 1980 | { 1981 | "timestamp": 7105.010000005364 1982 | }, 1983 | { 1984 | "timestamp": 7116.760000005364 1985 | }, 1986 | { 1987 | "timestamp": 7129.305000007153 1988 | }, 1989 | { 1990 | "timestamp": 7141.844999998808 1991 | }, 1992 | { 1993 | "timestamp": 7154.385000005364 1994 | }, 1995 | { 1996 | "timestamp": 7166.925000011921 1997 | }, 1998 | { 1999 | "timestamp": 7177.390000000596 2000 | }, 2001 | { 2002 | "timestamp": 7189.094999998808 2003 | }, 2004 | { 2005 | "timestamp": 7201.010000005364 2006 | }, 2007 | { 2008 | "timestamp": 7213.510000005364 2009 | }, 2010 | { 2011 | "timestamp": 7225.885000005364 2012 | }, 2013 | { 2014 | "timestamp": 7237.594999998808 2015 | }, 2016 | { 2017 | "timestamp": 7249.844999998808 2018 | }, 2019 | { 2020 | "timestamp": 7260.925000011921 2021 | }, 2022 | { 2023 | "timestamp": 7273.469999998808 2024 | }, 2025 | { 2026 | "timestamp": 7286.010000005364 2027 | }, 2028 | { 2029 | "timestamp": 7300.300000011921 2030 | }, 2031 | { 2032 | "timestamp": 7312.805000007153 2033 | }, 2034 | { 2035 | "timestamp": 7325.635000005364 2036 | }, 2037 | { 2038 | "timestamp": 7335.890000000596 2039 | }, 2040 | { 2041 | "timestamp": 7349.555000007153 2042 | }, 2043 | { 2044 | "timestamp": 7363.390000000596 2045 | }, 2046 | { 2047 | "timestamp": 7376.010000005364 2048 | }, 2049 | { 2050 | "timestamp": 7388.094999998808 2051 | }, 2052 | { 2053 | "timestamp": 7400.305000007153 2054 | }, 2055 | { 2056 | "timestamp": 7412.469999998808 2057 | }, 2058 | { 2059 | "timestamp": 7425.260000005364 2060 | }, 2061 | { 2062 | "timestamp": 7437.800000011921 2063 | }, 2064 | { 2065 | "timestamp": 7450.050000011921 2066 | }, 2067 | { 2068 | "timestamp": 7462.550000011921 2069 | }, 2070 | { 2071 | "timestamp": 7475.094999998808 2072 | }, 2073 | { 2074 | "timestamp": 7487.555000007153 2075 | }, 2076 | { 2077 | "timestamp": 7500.135000005364 2078 | }, 2079 | { 2080 | "timestamp": 7512.635000005364 2081 | }, 2082 | { 2083 | "timestamp": 7525.219999998808 2084 | }, 2085 | { 2086 | "timestamp": 7537.800000011921 2087 | }, 2088 | { 2089 | "timestamp": 7549.635000005364 2090 | }, 2091 | { 2092 | "timestamp": 7562.175000011921 2093 | }, 2094 | { 2095 | "timestamp": 7574.675000011921 2096 | }, 2097 | { 2098 | "timestamp": 7587.219999998808 2099 | }, 2100 | { 2101 | "timestamp": 7599.719999998808 2102 | }, 2103 | { 2104 | "timestamp": 7612.260000005364 2105 | }, 2106 | { 2107 | "timestamp": 7627.260000005364 2108 | }, 2109 | { 2110 | "timestamp": 7639.719999998808 2111 | }, 2112 | { 2113 | "timestamp": 7652.300000011921 2114 | }, 2115 | { 2116 | "timestamp": 7663.219999998808 2117 | }, 2118 | { 2119 | "timestamp": 7675.344999998808 2120 | }, 2121 | { 2122 | "timestamp": 7685.555000007153 2123 | }, 2124 | { 2125 | "timestamp": 7696.469999998808 2126 | }, 2127 | { 2128 | "timestamp": 7708.760000005364 2129 | } 2130 | ], 2131 | "stacks": [ 2132 | { 2133 | "frameId": 1 2134 | }, 2135 | { 2136 | "frameId": 0, 2137 | "parentId": 0 2138 | }, 2139 | { 2140 | "frameId": 3 2141 | }, 2142 | { 2143 | "frameId": 2, 2144 | "parentId": 2 2145 | }, 2146 | { 2147 | "frameId": 4, 2148 | "parentId": 3 2149 | }, 2150 | { 2151 | "frameId": 5, 2152 | "parentId": 3 2153 | }, 2154 | { 2155 | "frameId": 6, 2156 | "parentId": 2 2157 | }, 2158 | { 2159 | "frameId": 7, 2160 | "parentId": 2 2161 | }, 2162 | { 2163 | "frameId": 9 2164 | }, 2165 | { 2166 | "frameId": 8, 2167 | "parentId": 8 2168 | } 2169 | ] 2170 | } -------------------------------------------------------------------------------- /src/test-data/edit-three.json: -------------------------------------------------------------------------------- 1 | { 2 | "frames": [ 3 | { 4 | "name": "Profiler" 5 | }, 6 | { 7 | "column": 38, 8 | "line": 214, 9 | "name": "startProfiling", 10 | "resourceId": 0 11 | }, 12 | { 13 | "column": 28, 14 | "line": 347, 15 | "name": "main", 16 | "resourceId": 0 17 | }, 18 | { 19 | "column": 33, 20 | "line": 398, 21 | "name": "executeWorkload", 22 | "resourceId": 0 23 | }, 24 | { 25 | "column": 32, 26 | "line": 348, 27 | "name": "beforeTask", 28 | "resourceId": 0 29 | }, 30 | { 31 | "column": 31, 32 | "line": 354, 33 | "name": "afterTask", 34 | "resourceId": 0 35 | }, 36 | { 37 | "column": 28, 38 | "line": 385, 39 | "name": "afterTask1", 40 | "resourceId": 0 41 | }, 42 | { 43 | "column": 28, 44 | "line": 391, 45 | "name": "afterTask2", 46 | "resourceId": 0 47 | }, 48 | { 49 | "column": 37, 50 | "line": 341, 51 | "name": "taskInAsyncFunction", 52 | "resourceId": 0 53 | }, 54 | { 55 | "column": 33, 56 | "line": 361, 57 | "name": "task2", 58 | "resourceId": 0 59 | } 60 | ], 61 | "resources": [ 62 | "http://localhost:3000/" 63 | ], 64 | "samples": [ 65 | { 66 | "stackId": 1, 67 | "timestamp": 462.7600000053644 68 | }, 69 | { 70 | "timestamp": 475.0949999988079 71 | }, 72 | { 73 | "timestamp": 484.8449999988079 74 | }, 75 | { 76 | "timestamp": 487.64000000059605 77 | }, 78 | { 79 | "timestamp": 500.18000000715256 80 | }, 81 | { 82 | "timestamp": 512.6750000119209 83 | }, 84 | { 85 | "timestamp": 525.0949999988079 86 | }, 87 | { 88 | "timestamp": 537.5900000035763 89 | }, 90 | { 91 | "timestamp": 550.0949999988079 92 | }, 93 | { 94 | "timestamp": 560.3850000053644 95 | }, 96 | { 97 | "timestamp": 562.765000000596 98 | }, 99 | { 100 | "timestamp": 572.8850000053644 101 | }, 102 | { 103 | "timestamp": 583.9650000035763 104 | }, 105 | { 106 | "timestamp": 596.5100000053644 107 | }, 108 | { 109 | "timestamp": 597.3850000053644 110 | }, 111 | { 112 | "timestamp": 609.0500000119209 113 | }, 114 | { 115 | "timestamp": 621.9250000119209 116 | }, 117 | { 118 | "timestamp": 634.4250000119209 119 | }, 120 | { 121 | "timestamp": 646.4650000035763 122 | }, 123 | { 124 | "timestamp": 659.0100000053644 125 | }, 126 | { 127 | "timestamp": 671.4250000119209 128 | }, 129 | { 130 | "timestamp": 683.4250000119209 131 | }, 132 | { 133 | "timestamp": 693.6800000071526 134 | }, 135 | { 136 | "timestamp": 704.3050000071526 137 | }, 138 | { 139 | "timestamp": 716.7199999988079 140 | }, 141 | { 142 | "timestamp": 729.2600000053644 143 | }, 144 | { 145 | "timestamp": 741.7199999988079 146 | }, 147 | { 148 | "timestamp": 754.2199999988079 149 | }, 150 | { 151 | "timestamp": 766.7199999988079 152 | }, 153 | { 154 | "timestamp": 779.2600000053644 155 | }, 156 | { 157 | "timestamp": 791.8050000071526 158 | }, 159 | { 160 | "timestamp": 804.3000000119209 161 | }, 162 | { 163 | "timestamp": 816.8449999988079 164 | }, 165 | { 166 | "timestamp": 829.3449999988079 167 | }, 168 | { 169 | "timestamp": 841.8850000053644 170 | }, 171 | { 172 | "timestamp": 854.3449999988079 173 | }, 174 | { 175 | "timestamp": 866.8850000053644 176 | }, 177 | { 178 | "timestamp": 879.4250000119209 179 | }, 180 | { 181 | "timestamp": 892.0100000053644 182 | }, 183 | { 184 | "timestamp": 904.5550000071526 185 | }, 186 | { 187 | "timestamp": 917.0949999988079 188 | }, 189 | { 190 | "timestamp": 929.2600000053644 191 | }, 192 | { 193 | "timestamp": 941.7600000053644 194 | }, 195 | { 196 | "timestamp": 954.2600000053644 197 | }, 198 | { 199 | "timestamp": 966.7600000053644 200 | }, 201 | { 202 | "timestamp": 979.3449999988079 203 | }, 204 | { 205 | "timestamp": 991.8850000053644 206 | }, 207 | { 208 | "timestamp": 1004.3449999988079 209 | }, 210 | { 211 | "timestamp": 1016.8850000053644 212 | }, 213 | { 214 | "timestamp": 1029.3400000035763 215 | }, 216 | { 217 | "timestamp": 1041.969999998808 218 | }, 219 | { 220 | "timestamp": 1054.3050000071526 221 | }, 222 | { 223 | "timestamp": 1066.8050000071526 224 | }, 225 | { 226 | "timestamp": 1079.2600000053644 227 | }, 228 | { 229 | "timestamp": 1091.844999998808 230 | }, 231 | { 232 | "timestamp": 1104.3850000053644 233 | }, 234 | { 235 | "timestamp": 1116.9300000071526 236 | }, 237 | { 238 | "timestamp": 1129.5100000053644 239 | }, 240 | { 241 | "timestamp": 1141.800000011921 242 | }, 243 | { 244 | "timestamp": 1154.300000011921 245 | }, 246 | { 247 | "timestamp": 1166.8850000053644 248 | }, 249 | { 250 | "timestamp": 1179.469999998808 251 | }, 252 | { 253 | "timestamp": 1192.0100000053644 254 | }, 255 | { 256 | "timestamp": 1204.469999998808 257 | }, 258 | { 259 | "timestamp": 1217.050000011921 260 | }, 261 | { 262 | "timestamp": 1229.5550000071526 263 | }, 264 | { 265 | "timestamp": 1242.050000011921 266 | }, 267 | { 268 | "timestamp": 1254.594999998808 269 | }, 270 | { 271 | "timestamp": 1267.1350000053644 272 | }, 273 | { 274 | "timestamp": 1279.6350000053644 275 | }, 276 | { 277 | "timestamp": 1292.1800000071526 278 | }, 279 | { 280 | "timestamp": 1304.765000000596 281 | }, 282 | { 283 | "timestamp": 1316.8050000071526 284 | }, 285 | { 286 | "timestamp": 1329.344999998808 287 | }, 288 | { 289 | "timestamp": 1341.8850000053644 290 | }, 291 | { 292 | "timestamp": 1354.2600000053644 293 | }, 294 | { 295 | "timestamp": 1366.7150000035763 296 | }, 297 | { 298 | "timestamp": 1377.219999998808 299 | }, 300 | { 301 | "timestamp": 1389.719999998808 302 | }, 303 | { 304 | "timestamp": 1402.050000011921 305 | }, 306 | { 307 | "timestamp": 1412.5900000035763 308 | }, 309 | { 310 | "timestamp": 1425.1350000053644 311 | }, 312 | { 313 | "timestamp": 1435.5100000053644 314 | }, 315 | { 316 | "timestamp": 1447.300000011921 317 | }, 318 | { 319 | "timestamp": 1459.3850000053644 320 | }, 321 | { 322 | "timestamp": 1471.844999998808 323 | }, 324 | { 325 | "timestamp": 1484.425000011921 326 | }, 327 | { 328 | "timestamp": 1496.925000011921 329 | }, 330 | { 331 | "timestamp": 1509.469999998808 332 | }, 333 | { 334 | "timestamp": 1521.9650000035763 335 | }, 336 | { 337 | "timestamp": 1534.5100000053644 338 | }, 339 | { 340 | "timestamp": 1547.0100000053644 341 | }, 342 | { 343 | "timestamp": 1559.5900000035763 344 | }, 345 | { 346 | "timestamp": 1571.469999998808 347 | }, 348 | { 349 | "timestamp": 1583.344999998808 350 | }, 351 | { 352 | "timestamp": 1593.9650000035763 353 | }, 354 | { 355 | "timestamp": 1604.2600000053644 356 | }, 357 | { 358 | "timestamp": 1616.765000000596 359 | }, 360 | { 361 | "timestamp": 1629.550000011921 362 | }, 363 | { 364 | "timestamp": 1641.6350000053644 365 | }, 366 | { 367 | "timestamp": 1654.2150000035763 368 | }, 369 | { 370 | "timestamp": 1665.594999998808 371 | }, 372 | { 373 | "timestamp": 1677.3850000053644 374 | }, 375 | { 376 | "timestamp": 1689.844999998808 377 | }, 378 | { 379 | "timestamp": 1701.219999998808 380 | }, 381 | { 382 | "stackId": 3, 383 | "timestamp": 1715.719999998808 384 | }, 385 | { 386 | "stackId": 4, 387 | "timestamp": 1717.469999998808 388 | }, 389 | { 390 | "stackId": 4, 391 | "timestamp": 1728.2600000053644 392 | }, 393 | { 394 | "stackId": 4, 395 | "timestamp": 1740.800000011921 396 | }, 397 | { 398 | "stackId": 4, 399 | "timestamp": 1752.050000011921 400 | }, 401 | { 402 | "stackId": 4, 403 | "timestamp": 1764.550000011921 404 | }, 405 | { 406 | "stackId": 4, 407 | "timestamp": 1776.0100000053644 408 | }, 409 | { 410 | "stackId": 4, 411 | "timestamp": 1788.5550000071526 412 | }, 413 | { 414 | "stackId": 4, 415 | "timestamp": 1801.0550000071526 416 | }, 417 | { 418 | "stackId": 4, 419 | "timestamp": 1813.550000011921 420 | }, 421 | { 422 | "stackId": 4, 423 | "timestamp": 1826.0900000035763 424 | }, 425 | { 426 | "stackId": 4, 427 | "timestamp": 1838.6350000053644 428 | }, 429 | { 430 | "stackId": 4, 431 | "timestamp": 1851.0100000053644 432 | }, 433 | { 434 | "stackId": 4, 435 | "timestamp": 1863.5550000071526 436 | }, 437 | { 438 | "stackId": 4, 439 | "timestamp": 1876.0550000071526 440 | }, 441 | { 442 | "stackId": 4, 443 | "timestamp": 1888.594999998808 444 | }, 445 | { 446 | "stackId": 4, 447 | "timestamp": 1901.015000000596 448 | }, 449 | { 450 | "stackId": 4, 451 | "timestamp": 1913.5550000071526 452 | }, 453 | { 454 | "stackId": 4, 455 | "timestamp": 1926.094999998808 456 | }, 457 | { 458 | "stackId": 4, 459 | "timestamp": 1938.594999998808 460 | }, 461 | { 462 | "stackId": 4, 463 | "timestamp": 1951.0100000053644 464 | }, 465 | { 466 | "stackId": 4, 467 | "timestamp": 1961.719999998808 468 | }, 469 | { 470 | "stackId": 4, 471 | "timestamp": 1974.265000000596 472 | }, 473 | { 474 | "stackId": 4, 475 | "timestamp": 1985.4300000071526 476 | }, 477 | { 478 | "stackId": 4, 479 | "timestamp": 1997.969999998808 480 | }, 481 | { 482 | "stackId": 4, 483 | "timestamp": 2010.2600000053644 484 | }, 485 | { 486 | "stackId": 4, 487 | "timestamp": 2022.800000011921 488 | }, 489 | { 490 | "stackId": 4, 491 | "timestamp": 2034.344999998808 492 | }, 493 | { 494 | "stackId": 4, 495 | "timestamp": 2046.8850000053644 496 | }, 497 | { 498 | "stackId": 4, 499 | "timestamp": 2059.390000000596 500 | }, 501 | { 502 | "stackId": 4, 503 | "timestamp": 2071.925000011921 504 | }, 505 | { 506 | "stackId": 4, 507 | "timestamp": 2084.3400000035763 508 | }, 509 | { 510 | "stackId": 4, 511 | "timestamp": 2096.890000000596 512 | }, 513 | { 514 | "stackId": 4, 515 | "timestamp": 2109.3850000053644 516 | }, 517 | { 518 | "stackId": 4, 519 | "timestamp": 2121.8850000053644 520 | }, 521 | { 522 | "stackId": 4, 523 | "timestamp": 2134.4300000071526 524 | }, 525 | { 526 | "stackId": 4, 527 | "timestamp": 2146.925000011921 528 | }, 529 | { 530 | "stackId": 4, 531 | "timestamp": 2159.425000011921 532 | }, 533 | { 534 | "stackId": 4, 535 | "timestamp": 2171.969999998808 536 | }, 537 | { 538 | "stackId": 4, 539 | "timestamp": 2184.344999998808 540 | }, 541 | { 542 | "stackId": 4, 543 | "timestamp": 2191.3850000053644 544 | }, 545 | { 546 | "stackId": 5, 547 | "timestamp": 2192.1800000071526 548 | }, 549 | { 550 | "stackId": 5, 551 | "timestamp": 2196.8850000053644 552 | }, 553 | { 554 | "stackId": 5, 555 | "timestamp": 2209.4300000071526 556 | }, 557 | { 558 | "stackId": 5, 559 | "timestamp": 2221.8850000053644 560 | }, 561 | { 562 | "stackId": 5, 563 | "timestamp": 2234.3400000035763 564 | }, 565 | { 566 | "stackId": 5, 567 | "timestamp": 2245.890000000596 568 | }, 569 | { 570 | "stackId": 5, 571 | "timestamp": 2258.3850000053644 572 | }, 573 | { 574 | "stackId": 5, 575 | "timestamp": 2270.925000011921 576 | }, 577 | { 578 | "stackId": 5, 579 | "timestamp": 2283.469999998808 580 | }, 581 | { 582 | "stackId": 5, 583 | "timestamp": 2295.8850000053644 584 | }, 585 | { 586 | "stackId": 5, 587 | "timestamp": 2308.3850000053644 588 | }, 589 | { 590 | "stackId": 5, 591 | "timestamp": 2320.8850000053644 592 | }, 593 | { 594 | "stackId": 5, 595 | "timestamp": 2333.3850000053644 596 | }, 597 | { 598 | "stackId": 5, 599 | "timestamp": 2345.925000011921 600 | }, 601 | { 602 | "stackId": 5, 603 | "timestamp": 2358.3400000035763 604 | }, 605 | { 606 | "stackId": 5, 607 | "timestamp": 2370.890000000596 608 | }, 609 | { 610 | "stackId": 5, 611 | "timestamp": 2383.4300000071526 612 | }, 613 | { 614 | "stackId": 5, 615 | "timestamp": 2395.925000011921 616 | }, 617 | { 618 | "stackId": 5, 619 | "timestamp": 2408.469999998808 620 | }, 621 | { 622 | "stackId": 5, 623 | "timestamp": 2420.8850000053644 624 | }, 625 | { 626 | "stackId": 5, 627 | "timestamp": 2433.3850000053644 628 | }, 629 | { 630 | "stackId": 5, 631 | "timestamp": 2445.8850000053644 632 | }, 633 | { 634 | "stackId": 5, 635 | "timestamp": 2458.3850000053644 636 | }, 637 | { 638 | "stackId": 5, 639 | "timestamp": 2470.8850000053644 640 | }, 641 | { 642 | "stackId": 5, 643 | "timestamp": 2483.3850000053644 644 | }, 645 | { 646 | "stackId": 5, 647 | "timestamp": 2495.969999998808 648 | }, 649 | { 650 | "stackId": 5, 651 | "timestamp": 2508.3850000053644 652 | }, 653 | { 654 | "stackId": 5, 655 | "timestamp": 2520.8850000053644 656 | }, 657 | { 658 | "stackId": 5, 659 | "timestamp": 2533.425000011921 660 | }, 661 | { 662 | "stackId": 5, 663 | "timestamp": 2545.890000000596 664 | }, 665 | { 666 | "stackId": 5, 667 | "timestamp": 2558.3850000053644 668 | }, 669 | { 670 | "stackId": 5, 671 | "timestamp": 2570.925000011921 672 | }, 673 | { 674 | "stackId": 5, 675 | "timestamp": 2583.469999998808 676 | }, 677 | { 678 | "stackId": 5, 679 | "timestamp": 2595.969999998808 680 | }, 681 | { 682 | "stackId": 5, 683 | "timestamp": 2608.5100000053644 684 | }, 685 | { 686 | "stackId": 5, 687 | "timestamp": 2620.9650000035763 688 | }, 689 | { 690 | "stackId": 5, 691 | "timestamp": 2633.550000011921 692 | }, 693 | { 694 | "stackId": 5, 695 | "timestamp": 2645.969999998808 696 | }, 697 | { 698 | "stackId": 5, 699 | "timestamp": 2652.1350000053644 700 | }, 701 | { 702 | "stackId": 6, 703 | "timestamp": 2652.8850000053644 704 | }, 705 | { 706 | "stackId": 6, 707 | "timestamp": 2658.5100000053644 708 | }, 709 | { 710 | "stackId": 6, 711 | "timestamp": 2670.969999998808 712 | }, 713 | { 714 | "stackId": 6, 715 | "timestamp": 2683.469999998808 716 | }, 717 | { 718 | "stackId": 6, 719 | "timestamp": 2695.1350000053644 720 | }, 721 | { 722 | "stackId": 6, 723 | "timestamp": 2707.4300000071526 724 | }, 725 | { 726 | "stackId": 6, 727 | "timestamp": 2718.719999998808 728 | }, 729 | { 730 | "stackId": 6, 731 | "timestamp": 2729.300000011921 732 | }, 733 | { 734 | "stackId": 6, 735 | "timestamp": 2741.800000011921 736 | }, 737 | { 738 | "stackId": 6, 739 | "timestamp": 2754.344999998808 740 | }, 741 | { 742 | "stackId": 6, 743 | "timestamp": 2766.8050000071526 744 | }, 745 | { 746 | "stackId": 6, 747 | "timestamp": 2779.344999998808 748 | }, 749 | { 750 | "stackId": 6, 751 | "timestamp": 2791.800000011921 752 | }, 753 | { 754 | "stackId": 6, 755 | "timestamp": 2804.344999998808 756 | }, 757 | { 758 | "stackId": 6, 759 | "timestamp": 2816.8850000053644 760 | }, 761 | { 762 | "stackId": 6, 763 | "timestamp": 2829.3850000053644 764 | }, 765 | { 766 | "stackId": 6, 767 | "timestamp": 2841.8850000053644 768 | }, 769 | { 770 | "stackId": 6, 771 | "timestamp": 2854.4300000071526 772 | }, 773 | { 774 | "stackId": 6, 775 | "timestamp": 2866.9300000071526 776 | }, 777 | { 778 | "stackId": 6, 779 | "timestamp": 2879.425000011921 780 | }, 781 | { 782 | "stackId": 6, 783 | "timestamp": 2891.969999998808 784 | }, 785 | { 786 | "stackId": 6, 787 | "timestamp": 2904.5100000053644 788 | }, 789 | { 790 | "stackId": 6, 791 | "timestamp": 2917.0100000053644 792 | }, 793 | { 794 | "stackId": 6, 795 | "timestamp": 2929.5100000053644 796 | }, 797 | { 798 | "stackId": 6, 799 | "timestamp": 2942.0550000071526 800 | }, 801 | { 802 | "stackId": 6, 803 | "timestamp": 2954.550000011921 804 | }, 805 | { 806 | "stackId": 6, 807 | "timestamp": 2967.0550000071526 808 | }, 809 | { 810 | "stackId": 6, 811 | "timestamp": 2979.5550000071526 812 | }, 813 | { 814 | "stackId": 6, 815 | "timestamp": 2992.094999998808 816 | }, 817 | { 818 | "stackId": 6, 819 | "timestamp": 3004.594999998808 820 | }, 821 | { 822 | "stackId": 6, 823 | "timestamp": 3017.1350000053644 824 | }, 825 | { 826 | "stackId": 6, 827 | "timestamp": 3029.6350000053644 828 | }, 829 | { 830 | "stackId": 6, 831 | "timestamp": 3041.765000000596 832 | }, 833 | { 834 | "stackId": 6, 835 | "timestamp": 3054.265000000596 836 | }, 837 | { 838 | "stackId": 6, 839 | "timestamp": 3066.800000011921 840 | }, 841 | { 842 | "stackId": 6, 843 | "timestamp": 3079.2600000053644 844 | }, 845 | { 846 | "stackId": 6, 847 | "timestamp": 3091.7600000053644 848 | }, 849 | { 850 | "stackId": 6, 851 | "timestamp": 3104.2600000053644 852 | }, 853 | { 854 | "stackId": 6, 855 | "timestamp": 3110.675000011921 856 | }, 857 | { 858 | "stackId": 7, 859 | "timestamp": 3111.344999998808 860 | }, 861 | { 862 | "stackId": 7, 863 | "timestamp": 3116.8050000071526 864 | }, 865 | { 866 | "stackId": 7, 867 | "timestamp": 3129.344999998808 868 | }, 869 | { 870 | "stackId": 7, 871 | "timestamp": 3141.8850000053644 872 | }, 873 | { 874 | "stackId": 7, 875 | "timestamp": 3154.3850000053644 876 | }, 877 | { 878 | "stackId": 7, 879 | "timestamp": 3166.9300000071526 880 | }, 881 | { 882 | "stackId": 7, 883 | "timestamp": 3179.425000011921 884 | }, 885 | { 886 | "stackId": 7, 887 | "timestamp": 3191.969999998808 888 | }, 889 | { 890 | "stackId": 7, 891 | "timestamp": 3204.4650000035763 892 | }, 893 | { 894 | "stackId": 7, 895 | "timestamp": 3216.7600000053644 896 | }, 897 | { 898 | "stackId": 7, 899 | "timestamp": 3229.265000000596 900 | }, 901 | { 902 | "stackId": 7, 903 | "timestamp": 3241.800000011921 904 | }, 905 | { 906 | "stackId": 7, 907 | "timestamp": 3254.300000011921 908 | }, 909 | { 910 | "stackId": 7, 911 | "timestamp": 3266.844999998808 912 | }, 913 | { 914 | "stackId": 7, 915 | "timestamp": 3279.344999998808 916 | }, 917 | { 918 | "stackId": 7, 919 | "timestamp": 3291.8850000053644 920 | }, 921 | { 922 | "stackId": 7, 923 | "timestamp": 3304.4300000071526 924 | }, 925 | { 926 | "stackId": 7, 927 | "timestamp": 3316.844999998808 928 | }, 929 | { 930 | "stackId": 7, 931 | "timestamp": 3329.3850000053644 932 | }, 933 | { 934 | "stackId": 7, 935 | "timestamp": 3341.8850000053644 936 | }, 937 | { 938 | "stackId": 7, 939 | "timestamp": 3352.5100000053644 940 | }, 941 | { 942 | "stackId": 7, 943 | "timestamp": 3365.0100000053644 944 | }, 945 | { 946 | "stackId": 7, 947 | "timestamp": 3376.050000011921 948 | }, 949 | { 950 | "stackId": 7, 951 | "timestamp": 3388.550000011921 952 | }, 953 | { 954 | "stackId": 7, 955 | "timestamp": 3401.050000011921 956 | }, 957 | { 958 | "stackId": 7, 959 | "timestamp": 3413.594999998808 960 | }, 961 | { 962 | "stackId": 7, 963 | "timestamp": 3426.1350000053644 964 | }, 965 | { 966 | "stackId": 7, 967 | "timestamp": 3438.675000011921 968 | }, 969 | { 970 | "stackId": 7, 971 | "timestamp": 3451.0100000053644 972 | }, 973 | { 974 | "stackId": 7, 975 | "timestamp": 3463.5550000071526 976 | }, 977 | { 978 | "stackId": 7, 979 | "timestamp": 3476.050000011921 980 | }, 981 | { 982 | "stackId": 7, 983 | "timestamp": 3488.594999998808 984 | }, 985 | { 986 | "stackId": 7, 987 | "timestamp": 3501.0100000053644 988 | }, 989 | { 990 | "stackId": 7, 991 | "timestamp": 3513.5100000053644 992 | }, 993 | { 994 | "stackId": 7, 995 | "timestamp": 3526.050000011921 996 | }, 997 | { 998 | "stackId": 7, 999 | "timestamp": 3538.515000000596 1000 | }, 1001 | { 1002 | "stackId": 7, 1003 | "timestamp": 3551.094999998808 1004 | }, 1005 | { 1006 | "stackId": 7, 1007 | "timestamp": 3563.6350000053644 1008 | }, 1009 | { 1010 | "stackId": 7, 1011 | "timestamp": 3566.844999998808 1012 | }, 1013 | { 1014 | "stackId": 9, 1015 | "timestamp": 3570.300000011921 1016 | }, 1017 | { 1018 | "stackId": 9, 1019 | "timestamp": 3576.1800000071526 1020 | }, 1021 | { 1022 | "stackId": 9, 1023 | "timestamp": 3588.675000011921 1024 | }, 1025 | { 1026 | "stackId": 9, 1027 | "timestamp": 3601.0100000053644 1028 | }, 1029 | { 1030 | "stackId": 9, 1031 | "timestamp": 3612.5550000071526 1032 | }, 1033 | { 1034 | "stackId": 9, 1035 | "timestamp": 3625.094999998808 1036 | }, 1037 | { 1038 | "stackId": 9, 1039 | "timestamp": 3637.5900000035763 1040 | }, 1041 | { 1042 | "stackId": 9, 1043 | "timestamp": 3650.1350000053644 1044 | }, 1045 | { 1046 | "stackId": 9, 1047 | "timestamp": 3662.6350000053644 1048 | }, 1049 | { 1050 | "stackId": 9, 1051 | "timestamp": 3675.1350000053644 1052 | }, 1053 | { 1054 | "stackId": 9, 1055 | "timestamp": 3687.594999998808 1056 | }, 1057 | { 1058 | "stackId": 9, 1059 | "timestamp": 3700.050000011921 1060 | }, 1061 | { 1062 | "stackId": 9, 1063 | "timestamp": 3710.3850000053644 1064 | }, 1065 | { 1066 | "stackId": 9, 1067 | "timestamp": 3722.8850000053644 1068 | }, 1069 | { 1070 | "stackId": 9, 1071 | "timestamp": 3734.3850000053644 1072 | }, 1073 | { 1074 | "stackId": 9, 1075 | "timestamp": 3746.9300000071526 1076 | }, 1077 | { 1078 | "stackId": 9, 1079 | "timestamp": 3759.3850000053644 1080 | }, 1081 | { 1082 | "stackId": 9, 1083 | "timestamp": 3771.8850000053644 1084 | }, 1085 | { 1086 | "stackId": 9, 1087 | "timestamp": 3784.344999998808 1088 | }, 1089 | { 1090 | "stackId": 9, 1091 | "timestamp": 3796.8850000053644 1092 | }, 1093 | { 1094 | "stackId": 9, 1095 | "timestamp": 3809.344999998808 1096 | }, 1097 | { 1098 | "stackId": 9, 1099 | "timestamp": 3821.8850000053644 1100 | }, 1101 | { 1102 | "stackId": 9, 1103 | "timestamp": 3834.3850000053644 1104 | }, 1105 | { 1106 | "stackId": 9, 1107 | "timestamp": 3846.9300000071526 1108 | }, 1109 | { 1110 | "stackId": 9, 1111 | "timestamp": 3858.3850000053644 1112 | }, 1113 | { 1114 | "stackId": 9, 1115 | "timestamp": 3870.925000011921 1116 | }, 1117 | { 1118 | "stackId": 9, 1119 | "timestamp": 3883.469999998808 1120 | }, 1121 | { 1122 | "stackId": 9, 1123 | "timestamp": 3895.9650000035763 1124 | }, 1125 | { 1126 | "stackId": 9, 1127 | "timestamp": 3908.469999998808 1128 | }, 1129 | { 1130 | "stackId": 9, 1131 | "timestamp": 3921.0100000053644 1132 | }, 1133 | { 1134 | "stackId": 9, 1135 | "timestamp": 3933.5100000053644 1136 | }, 1137 | { 1138 | "stackId": 9, 1139 | "timestamp": 3946.0100000053644 1140 | }, 1141 | { 1142 | "stackId": 9, 1143 | "timestamp": 3958.5100000053644 1144 | }, 1145 | { 1146 | "stackId": 9, 1147 | "timestamp": 3971.050000011921 1148 | }, 1149 | { 1150 | "stackId": 9, 1151 | "timestamp": 3983.550000011921 1152 | }, 1153 | { 1154 | "stackId": 9, 1155 | "timestamp": 3996.050000011921 1156 | }, 1157 | { 1158 | "stackId": 9, 1159 | "timestamp": 4008.594999998808 1160 | }, 1161 | { 1162 | "stackId": 9, 1163 | "timestamp": 4021.094999998808 1164 | }, 1165 | { 1166 | "stackId": 9, 1167 | "timestamp": 4025.6350000053644 1168 | }, 1169 | { 1170 | "stackId": 9, 1171 | "timestamp": 4033.594999998808 1172 | }, 1173 | { 1174 | "stackId": 9, 1175 | "timestamp": 4046.094999998808 1176 | }, 1177 | { 1178 | "stackId": 9, 1179 | "timestamp": 4058.594999998808 1180 | }, 1181 | { 1182 | "stackId": 9, 1183 | "timestamp": 4071.1350000053644 1184 | }, 1185 | { 1186 | "stackId": 9, 1187 | "timestamp": 4083.640000000596 1188 | }, 1189 | { 1190 | "stackId": 9, 1191 | "timestamp": 4096.135000005364 1192 | }, 1193 | { 1194 | "stackId": 9, 1195 | "timestamp": 4108.640000000596 1196 | }, 1197 | { 1198 | "stackId": 9, 1199 | "timestamp": 4121.175000011921 1200 | }, 1201 | { 1202 | "stackId": 9, 1203 | "timestamp": 4133.680000007153 1204 | }, 1205 | { 1206 | "stackId": 9, 1207 | "timestamp": 4146.175000011921 1208 | }, 1209 | { 1210 | "stackId": 9, 1211 | "timestamp": 4158.675000011921 1212 | }, 1213 | { 1214 | "stackId": 9, 1215 | "timestamp": 4171.219999998808 1216 | }, 1217 | { 1218 | "stackId": 9, 1219 | "timestamp": 4183.719999998808 1220 | }, 1221 | { 1222 | "stackId": 9, 1223 | "timestamp": 4196.260000005364 1224 | }, 1225 | { 1226 | "stackId": 9, 1227 | "timestamp": 4208.805000007153 1228 | }, 1229 | { 1230 | "stackId": 9, 1231 | "timestamp": 4221.305000007153 1232 | }, 1233 | { 1234 | "stackId": 9, 1235 | "timestamp": 4233.800000011921 1236 | }, 1237 | { 1238 | "stackId": 9, 1239 | "timestamp": 4246.344999998808 1240 | }, 1241 | { 1242 | "stackId": 9, 1243 | "timestamp": 4258.844999998808 1244 | }, 1245 | { 1246 | "stackId": 9, 1247 | "timestamp": 4271.344999998808 1248 | }, 1249 | { 1250 | "stackId": 9, 1251 | "timestamp": 4283.844999998808 1252 | }, 1253 | { 1254 | "stackId": 9, 1255 | "timestamp": 4296.385000005364 1256 | }, 1257 | { 1258 | "stackId": 9, 1259 | "timestamp": 4308.885000005364 1260 | }, 1261 | { 1262 | "stackId": 9, 1263 | "timestamp": 4321.385000005364 1264 | }, 1265 | { 1266 | "stackId": 9, 1267 | "timestamp": 4333.930000007153 1268 | }, 1269 | { 1270 | "stackId": 9, 1271 | "timestamp": 4346.385000005364 1272 | }, 1273 | { 1274 | "stackId": 9, 1275 | "timestamp": 4358.885000005364 1276 | }, 1277 | { 1278 | "stackId": 9, 1279 | "timestamp": 4371.385000005364 1280 | }, 1281 | { 1282 | "stackId": 9, 1283 | "timestamp": 4383.925000011921 1284 | }, 1285 | { 1286 | "stackId": 9, 1287 | "timestamp": 4396.385000005364 1288 | }, 1289 | { 1290 | "stackId": 9, 1291 | "timestamp": 4408.885000005364 1292 | }, 1293 | { 1294 | "stackId": 9, 1295 | "timestamp": 4421.385000005364 1296 | }, 1297 | { 1298 | "stackId": 9, 1299 | "timestamp": 4433.969999998808 1300 | }, 1301 | { 1302 | "stackId": 9, 1303 | "timestamp": 4446.469999998808 1304 | }, 1305 | { 1306 | "stackId": 9, 1307 | "timestamp": 4458.969999998808 1308 | }, 1309 | { 1310 | "stackId": 9, 1311 | "timestamp": 4471.510000005364 1312 | }, 1313 | { 1314 | "stackId": 9, 1315 | "timestamp": 4480.765000000596 1316 | }, 1317 | { 1318 | "timestamp": 4484.055000007153 1319 | }, 1320 | { 1321 | "timestamp": 4496.550000011921 1322 | }, 1323 | { 1324 | "timestamp": 4509.140000000596 1325 | }, 1326 | { 1327 | "timestamp": 4521.635000005364 1328 | }, 1329 | { 1330 | "timestamp": 4534.135000005364 1331 | }, 1332 | { 1333 | "timestamp": 4546.675000011921 1334 | }, 1335 | { 1336 | "timestamp": 4559.219999998808 1337 | }, 1338 | { 1339 | "timestamp": 4571.260000005364 1340 | }, 1341 | { 1342 | "timestamp": 4583.760000005364 1343 | }, 1344 | { 1345 | "timestamp": 4596.344999998808 1346 | }, 1347 | { 1348 | "timestamp": 4608.844999998808 1349 | }, 1350 | { 1351 | "timestamp": 4621.390000000596 1352 | }, 1353 | { 1354 | "timestamp": 4633.885000005364 1355 | }, 1356 | { 1357 | "timestamp": 4646.430000007153 1358 | }, 1359 | { 1360 | "timestamp": 4658.925000011921 1361 | }, 1362 | { 1363 | "timestamp": 4671.510000005364 1364 | }, 1365 | { 1366 | "timestamp": 4684.010000005364 1367 | }, 1368 | { 1369 | "timestamp": 4696.555000007153 1370 | }, 1371 | { 1372 | "timestamp": 4709.135000005364 1373 | }, 1374 | { 1375 | "timestamp": 4721.635000005364 1376 | }, 1377 | { 1378 | "timestamp": 4733.219999998808 1379 | }, 1380 | { 1381 | "timestamp": 4745.719999998808 1382 | }, 1383 | { 1384 | "timestamp": 4756.844999998808 1385 | }, 1386 | { 1387 | "timestamp": 4769.344999998808 1388 | }, 1389 | { 1390 | "timestamp": 4781.890000000596 1391 | }, 1392 | { 1393 | "timestamp": 4794.425000011921 1394 | }, 1395 | { 1396 | "timestamp": 4805.265000000596 1397 | }, 1398 | { 1399 | "timestamp": 4816.015000000596 1400 | }, 1401 | { 1402 | "timestamp": 4828.550000011921 1403 | }, 1404 | { 1405 | "timestamp": 4841.010000005364 1406 | }, 1407 | { 1408 | "timestamp": 4851.675000011921 1409 | }, 1410 | { 1411 | "timestamp": 4863.219999998808 1412 | }, 1413 | { 1414 | "timestamp": 4875.800000011921 1415 | }, 1416 | { 1417 | "timestamp": 4888.300000011921 1418 | }, 1419 | { 1420 | "timestamp": 4899.510000005364 1421 | }, 1422 | { 1423 | "timestamp": 4912.055000007153 1424 | }, 1425 | { 1426 | "timestamp": 4923.094999998808 1427 | }, 1428 | { 1429 | "timestamp": 4934.135000005364 1430 | }, 1431 | { 1432 | "timestamp": 4945.180000007153 1433 | }, 1434 | { 1435 | "timestamp": 4955.300000011921 1436 | }, 1437 | { 1438 | "timestamp": 4966.305000007153 1439 | }, 1440 | { 1441 | "timestamp": 4978.844999998808 1442 | }, 1443 | { 1444 | "timestamp": 4989.050000011921 1445 | }, 1446 | { 1447 | "timestamp": 5000.260000005364 1448 | }, 1449 | { 1450 | "timestamp": 5010.385000005364 1451 | }, 1452 | { 1453 | "timestamp": 5021.385000005364 1454 | }, 1455 | { 1456 | "timestamp": 5033.760000005364 1457 | }, 1458 | { 1459 | "timestamp": 5045.550000011921 1460 | }, 1461 | { 1462 | "timestamp": 5055.635000005364 1463 | }, 1464 | { 1465 | "timestamp": 5068.175000011921 1466 | }, 1467 | { 1468 | "timestamp": 5080.719999998808 1469 | }, 1470 | { 1471 | "timestamp": 5093.260000005364 1472 | }, 1473 | { 1474 | "timestamp": 5105.510000005364 1475 | }, 1476 | { 1477 | "timestamp": 5117.800000011921 1478 | }, 1479 | { 1480 | "timestamp": 5130.300000011921 1481 | }, 1482 | { 1483 | "timestamp": 5141.925000011921 1484 | }, 1485 | { 1486 | "timestamp": 5154.385000005364 1487 | }, 1488 | { 1489 | "timestamp": 5165.050000011921 1490 | }, 1491 | { 1492 | "timestamp": 5177.550000011921 1493 | }, 1494 | { 1495 | "timestamp": 5190.094999998808 1496 | }, 1497 | { 1498 | "timestamp": 5200.760000005364 1499 | }, 1500 | { 1501 | "timestamp": 5213.340000003576 1502 | }, 1503 | { 1504 | "timestamp": 5225.885000005364 1505 | }, 1506 | { 1507 | "timestamp": 5237.094999998808 1508 | }, 1509 | { 1510 | "timestamp": 5249.635000005364 1511 | }, 1512 | { 1513 | "timestamp": 5260.385000005364 1514 | }, 1515 | { 1516 | "timestamp": 5272.890000000596 1517 | }, 1518 | { 1519 | "timestamp": 5285.469999998808 1520 | }, 1521 | { 1522 | "timestamp": 5295.555000007153 1523 | }, 1524 | { 1525 | "timestamp": 5307.260000005364 1526 | }, 1527 | { 1528 | "timestamp": 5319.390000000596 1529 | }, 1530 | { 1531 | "timestamp": 5331.925000011921 1532 | }, 1533 | { 1534 | "timestamp": 5343.425000011921 1535 | }, 1536 | { 1537 | "timestamp": 5355.469999998808 1538 | }, 1539 | { 1540 | "timestamp": 5367.010000005364 1541 | }, 1542 | { 1543 | "timestamp": 5379.550000011921 1544 | }, 1545 | { 1546 | "timestamp": 5392.090000003576 1547 | }, 1548 | { 1549 | "timestamp": 5404.594999998808 1550 | }, 1551 | { 1552 | "timestamp": 5420.885000005364 1553 | }, 1554 | { 1555 | "timestamp": 5432.675000011921 1556 | }, 1557 | { 1558 | "timestamp": 5445.219999998808 1559 | }, 1560 | { 1561 | "timestamp": 5457.805000007153 1562 | }, 1563 | { 1564 | "timestamp": 5470.385000005364 1565 | }, 1566 | { 1567 | "timestamp": 5481.390000000596 1568 | }, 1569 | { 1570 | "timestamp": 5492.925000011921 1571 | }, 1572 | { 1573 | "timestamp": 5505.469999998808 1574 | }, 1575 | { 1576 | "timestamp": 5518.010000005364 1577 | }, 1578 | { 1579 | "timestamp": 5530.550000011921 1580 | }, 1581 | { 1582 | "timestamp": 5543.135000005364 1583 | }, 1584 | { 1585 | "timestamp": 5555.675000011921 1586 | }, 1587 | { 1588 | "timestamp": 5565.965000003576 1589 | }, 1590 | { 1591 | "timestamp": 5577.805000007153 1592 | }, 1593 | { 1594 | "timestamp": 5590.180000007153 1595 | }, 1596 | { 1597 | "timestamp": 5602.715000003576 1598 | }, 1599 | { 1600 | "timestamp": 5613.550000011921 1601 | }, 1602 | { 1603 | "timestamp": 5625.760000005364 1604 | }, 1605 | { 1606 | "timestamp": 5638.300000011921 1607 | }, 1608 | { 1609 | "timestamp": 5650.805000007153 1610 | }, 1611 | { 1612 | "timestamp": 5663.344999998808 1613 | }, 1614 | { 1615 | "timestamp": 5675.844999998808 1616 | }, 1617 | { 1618 | "timestamp": 5686.215000003576 1619 | }, 1620 | { 1621 | "timestamp": 5697.260000005364 1622 | }, 1623 | { 1624 | "timestamp": 5708.340000003576 1625 | }, 1626 | { 1627 | "timestamp": 5719.094999998808 1628 | }, 1629 | { 1630 | "timestamp": 5730.135000005364 1631 | }, 1632 | { 1633 | "timestamp": 5742.140000000596 1634 | }, 1635 | { 1636 | "timestamp": 5754.760000005364 1637 | }, 1638 | { 1639 | "timestamp": 5767.260000005364 1640 | }, 1641 | { 1642 | "timestamp": 5779.800000011921 1643 | }, 1644 | { 1645 | "timestamp": 5792.305000007153 1646 | }, 1647 | { 1648 | "timestamp": 5804.844999998808 1649 | }, 1650 | { 1651 | "timestamp": 5817.385000005364 1652 | }, 1653 | { 1654 | "timestamp": 5828.385000005364 1655 | }, 1656 | { 1657 | "timestamp": 5839.425000011921 1658 | }, 1659 | { 1660 | "timestamp": 5850.930000007153 1661 | }, 1662 | { 1663 | "timestamp": 5862.050000011921 1664 | }, 1665 | { 1666 | "timestamp": 5873.140000000596 1667 | }, 1668 | { 1669 | "timestamp": 5884.135000005364 1670 | }, 1671 | { 1672 | "timestamp": 5895.215000003576 1673 | }, 1674 | { 1675 | "timestamp": 5905.385000005364 1676 | }, 1677 | { 1678 | "timestamp": 5916.469999998808 1679 | }, 1680 | { 1681 | "timestamp": 5927.594999998808 1682 | }, 1683 | { 1684 | "timestamp": 5938.010000005364 1685 | }, 1686 | { 1687 | "timestamp": 5949.675000011921 1688 | }, 1689 | { 1690 | "timestamp": 5961.510000005364 1691 | }, 1692 | { 1693 | "timestamp": 5972.469999998808 1694 | }, 1695 | { 1696 | "timestamp": 5987.510000005364 1697 | }, 1698 | { 1699 | "timestamp": 6000.090000003576 1700 | }, 1701 | { 1702 | "timestamp": 6012.719999998808 1703 | }, 1704 | { 1705 | "timestamp": 6023.760000005364 1706 | }, 1707 | { 1708 | "timestamp": 6034.719999998808 1709 | }, 1710 | { 1711 | "timestamp": 6045.930000007153 1712 | }, 1713 | { 1714 | "timestamp": 6058.430000007153 1715 | }, 1716 | { 1717 | "timestamp": 6070.965000003576 1718 | }, 1719 | { 1720 | "timestamp": 6083.550000011921 1721 | }, 1722 | { 1723 | "timestamp": 6096.094999998808 1724 | }, 1725 | { 1726 | "timestamp": 6108.425000011921 1727 | }, 1728 | { 1729 | "timestamp": 6120.925000011921 1730 | }, 1731 | { 1732 | "timestamp": 6133.510000005364 1733 | }, 1734 | { 1735 | "timestamp": 6143.760000005364 1736 | }, 1737 | { 1738 | "timestamp": 6155.344999998808 1739 | }, 1740 | { 1741 | "timestamp": 6167.719999998808 1742 | }, 1743 | { 1744 | "timestamp": 6180.265000000596 1745 | }, 1746 | { 1747 | "timestamp": 6192.885000005364 1748 | }, 1749 | { 1750 | "timestamp": 6205.515000000596 1751 | }, 1752 | { 1753 | "timestamp": 6217.760000005364 1754 | }, 1755 | { 1756 | "timestamp": 6230.425000011921 1757 | }, 1758 | { 1759 | "timestamp": 6242.300000011921 1760 | }, 1761 | { 1762 | "timestamp": 6254.840000003576 1763 | }, 1764 | { 1765 | "timestamp": 6266.635000005364 1766 | }, 1767 | { 1768 | "timestamp": 6277.719999998808 1769 | }, 1770 | { 1771 | "timestamp": 6288.715000003576 1772 | }, 1773 | { 1774 | "timestamp": 6301.094999998808 1775 | }, 1776 | { 1777 | "timestamp": 6313.635000005364 1778 | }, 1779 | { 1780 | "timestamp": 6326.175000011921 1781 | }, 1782 | { 1783 | "timestamp": 6337.300000011921 1784 | }, 1785 | { 1786 | "timestamp": 6347.510000005364 1787 | }, 1788 | { 1789 | "timestamp": 6357.680000007153 1790 | }, 1791 | { 1792 | "timestamp": 6370.219999998808 1793 | }, 1794 | { 1795 | "timestamp": 6382.760000005364 1796 | }, 1797 | { 1798 | "timestamp": 6395.305000007153 1799 | }, 1800 | { 1801 | "timestamp": 6405.590000003576 1802 | }, 1803 | { 1804 | "timestamp": 6418.260000005364 1805 | }, 1806 | { 1807 | "timestamp": 6429.219999998808 1808 | }, 1809 | { 1810 | "timestamp": 6441.840000003576 1811 | }, 1812 | { 1813 | "timestamp": 6454.385000005364 1814 | }, 1815 | { 1816 | "timestamp": 6464.675000011921 1817 | }, 1818 | { 1819 | "timestamp": 6477.135000005364 1820 | }, 1821 | { 1822 | "timestamp": 6487.844999998808 1823 | }, 1824 | { 1825 | "timestamp": 6499.675000011921 1826 | }, 1827 | { 1828 | "timestamp": 6510.260000005364 1829 | }, 1830 | { 1831 | "timestamp": 6522.844999998808 1832 | }, 1833 | { 1834 | "timestamp": 6533.550000011921 1835 | }, 1836 | { 1837 | "timestamp": 6544.469999998808 1838 | }, 1839 | { 1840 | "timestamp": 6557.010000005364 1841 | }, 1842 | { 1843 | "timestamp": 6567.090000003576 1844 | }, 1845 | { 1846 | "timestamp": 6579.680000007153 1847 | }, 1848 | { 1849 | "timestamp": 6591.594999998808 1850 | }, 1851 | { 1852 | "timestamp": 6604.094999998808 1853 | }, 1854 | { 1855 | "timestamp": 6616.594999998808 1856 | }, 1857 | { 1858 | "timestamp": 6627.635000005364 1859 | }, 1860 | { 1861 | "timestamp": 6638.675000011921 1862 | }, 1863 | { 1864 | "timestamp": 6649.719999998808 1865 | }, 1866 | { 1867 | "timestamp": 6660.760000005364 1868 | }, 1869 | { 1870 | "timestamp": 6671.800000011921 1871 | }, 1872 | { 1873 | "timestamp": 6682.844999998808 1874 | }, 1875 | { 1876 | "timestamp": 6693.885000005364 1877 | }, 1878 | { 1879 | "timestamp": 6704.930000007153 1880 | }, 1881 | { 1882 | "timestamp": 6715.300000011921 1883 | }, 1884 | { 1885 | "timestamp": 6725.344999998808 1886 | }, 1887 | { 1888 | "timestamp": 6735.550000011921 1889 | }, 1890 | { 1891 | "timestamp": 6747.844999998808 1892 | }, 1893 | { 1894 | "timestamp": 6760.390000000596 1895 | }, 1896 | { 1897 | "timestamp": 6770.800000011921 1898 | }, 1899 | { 1900 | "timestamp": 6783.260000005364 1901 | }, 1902 | { 1903 | "timestamp": 6795.175000011921 1904 | }, 1905 | { 1906 | "timestamp": 6805.215000003576 1907 | }, 1908 | { 1909 | "timestamp": 6815.300000011921 1910 | }, 1911 | { 1912 | "timestamp": 6827.344999998808 1913 | }, 1914 | { 1915 | "timestamp": 6837.635000005364 1916 | }, 1917 | { 1918 | "timestamp": 6850.305000007153 1919 | }, 1920 | { 1921 | "timestamp": 6861.969999998808 1922 | }, 1923 | { 1924 | "timestamp": 6875.180000007153 1925 | }, 1926 | { 1927 | "timestamp": 6886.385000005364 1928 | }, 1929 | { 1930 | "timestamp": 6897.425000011921 1931 | }, 1932 | { 1933 | "timestamp": 6909.965000003576 1934 | }, 1935 | { 1936 | "timestamp": 6922.594999998808 1937 | }, 1938 | { 1939 | "timestamp": 6935.219999998808 1940 | }, 1941 | { 1942 | "timestamp": 6947.260000005364 1943 | }, 1944 | { 1945 | "timestamp": 6958.969999998808 1946 | }, 1947 | { 1948 | "timestamp": 6971.510000005364 1949 | }, 1950 | { 1951 | "timestamp": 6982.430000007153 1952 | }, 1953 | { 1954 | "timestamp": 6992.760000005364 1955 | }, 1956 | { 1957 | "timestamp": 7004.594999998808 1958 | }, 1959 | { 1960 | "timestamp": 7017.094999998808 1961 | }, 1962 | { 1963 | "timestamp": 7029.635000005364 1964 | }, 1965 | { 1966 | "timestamp": 7042.175000011921 1967 | }, 1968 | { 1969 | "timestamp": 7054.719999998808 1970 | }, 1971 | { 1972 | "timestamp": 7067.260000005364 1973 | }, 1974 | { 1975 | "timestamp": 7079.800000011921 1976 | }, 1977 | { 1978 | "timestamp": 7092.390000000596 1979 | }, 1980 | { 1981 | "timestamp": 7105.010000005364 1982 | }, 1983 | { 1984 | "timestamp": 7116.760000005364 1985 | }, 1986 | { 1987 | "timestamp": 7129.305000007153 1988 | }, 1989 | { 1990 | "timestamp": 7141.844999998808 1991 | }, 1992 | { 1993 | "timestamp": 7154.385000005364 1994 | }, 1995 | { 1996 | "timestamp": 7166.925000011921 1997 | }, 1998 | { 1999 | "timestamp": 7177.390000000596 2000 | }, 2001 | { 2002 | "timestamp": 7189.094999998808 2003 | }, 2004 | { 2005 | "timestamp": 7201.010000005364 2006 | }, 2007 | { 2008 | "timestamp": 7213.510000005364 2009 | }, 2010 | { 2011 | "timestamp": 7225.885000005364 2012 | }, 2013 | { 2014 | "timestamp": 7237.594999998808 2015 | }, 2016 | { 2017 | "timestamp": 7249.844999998808 2018 | }, 2019 | { 2020 | "timestamp": 7260.925000011921 2021 | }, 2022 | { 2023 | "timestamp": 7273.469999998808 2024 | }, 2025 | { 2026 | "timestamp": 7286.010000005364 2027 | }, 2028 | { 2029 | "timestamp": 7300.300000011921 2030 | }, 2031 | { 2032 | "timestamp": 7312.805000007153 2033 | }, 2034 | { 2035 | "timestamp": 7325.635000005364 2036 | }, 2037 | { 2038 | "timestamp": 7335.890000000596 2039 | }, 2040 | { 2041 | "timestamp": 7349.555000007153 2042 | }, 2043 | { 2044 | "timestamp": 7363.390000000596 2045 | }, 2046 | { 2047 | "timestamp": 7376.010000005364 2048 | }, 2049 | { 2050 | "timestamp": 7388.094999998808 2051 | }, 2052 | { 2053 | "timestamp": 7400.305000007153 2054 | }, 2055 | { 2056 | "timestamp": 7412.469999998808 2057 | }, 2058 | { 2059 | "timestamp": 7425.260000005364 2060 | }, 2061 | { 2062 | "timestamp": 7437.800000011921 2063 | }, 2064 | { 2065 | "timestamp": 7450.050000011921 2066 | }, 2067 | { 2068 | "timestamp": 7462.550000011921 2069 | }, 2070 | { 2071 | "timestamp": 7475.094999998808 2072 | }, 2073 | { 2074 | "timestamp": 7487.555000007153 2075 | }, 2076 | { 2077 | "timestamp": 7500.135000005364 2078 | }, 2079 | { 2080 | "timestamp": 7512.635000005364 2081 | }, 2082 | { 2083 | "timestamp": 7525.219999998808 2084 | }, 2085 | { 2086 | "timestamp": 7537.800000011921 2087 | }, 2088 | { 2089 | "timestamp": 7549.635000005364 2090 | }, 2091 | { 2092 | "timestamp": 7562.175000011921 2093 | }, 2094 | { 2095 | "timestamp": 7574.675000011921 2096 | }, 2097 | { 2098 | "timestamp": 7587.219999998808 2099 | }, 2100 | { 2101 | "timestamp": 7599.719999998808 2102 | }, 2103 | { 2104 | "timestamp": 7612.260000005364 2105 | }, 2106 | { 2107 | "timestamp": 7627.260000005364 2108 | }, 2109 | { 2110 | "timestamp": 7639.719999998808 2111 | }, 2112 | { 2113 | "timestamp": 7652.300000011921 2114 | }, 2115 | { 2116 | "timestamp": 7663.219999998808 2117 | }, 2118 | { 2119 | "timestamp": 7675.344999998808 2120 | }, 2121 | { 2122 | "timestamp": 7685.555000007153 2123 | }, 2124 | { 2125 | "timestamp": 7696.469999998808 2126 | }, 2127 | { 2128 | "timestamp": 7708.760000005364 2129 | } 2130 | ], 2131 | "stacks": [ 2132 | { 2133 | "frameId": 1 2134 | }, 2135 | { 2136 | "frameId": 0, 2137 | "parentId": 0 2138 | }, 2139 | { 2140 | "frameId": 3 2141 | }, 2142 | { 2143 | "frameId": 2, 2144 | "parentId": 2 2145 | }, 2146 | { 2147 | "frameId": 4, 2148 | "parentId": 3 2149 | }, 2150 | { 2151 | "frameId": 5, 2152 | "parentId": 3 2153 | }, 2154 | { 2155 | "frameId": 6, 2156 | "parentId": 2 2157 | }, 2158 | { 2159 | "frameId": 7, 2160 | "parentId": 2 2161 | }, 2162 | { 2163 | "frameId": 9 2164 | }, 2165 | { 2166 | "frameId": 8, 2167 | "parentId": 8 2168 | } 2169 | ] 2170 | } --------------------------------------------------------------------------------