<html>
    <head>
        <meta charset="utf-8">
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
                margin: 0;
            }
        </style>
        <div id="timing"></div>
        <script>

            require([
                'echarts'
                // 'echarts/chart/bar',
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/dataZoom',
                // 'echarts/component/tooltip'
            ], function (echarts) {
                var myChart;
                var lineCount = 20;
                var pointCount = 1000;
                var chartCount = 50;

                var option = {
                    tooltip : {
                        trigger: 'axis',
                        axisPointer: {
                            animation: false
                        }
                    },
                    legend: {
                        data:[]
                    },
                    dataZoom: [{
                        show: true,
                        realtime: true,
                        // showDataShadow: false,
                        start: 50,
                        end: 60
                    }],
                    xAxis : [
                        {
                            type : 'time'
                        }
                    ],
                    yAxis : [
                        {
                            type : 'value'
                        }
                    ],
                    series: [],
                    animation: false
                };

                var lineStyle = {
                    normal: {
                        width: 2,
                        opacity: 1
                    }
                };

                var date = [];
                var oneDay = 24 * 3600 * 1000;
                var base = +new Date(1897, 9, 3);
                for (var j = 0; j < pointCount; j++) {
                    var now = new Date(base += oneDay);
                    date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('-'));
                }
                for (var i = 0; i < lineCount; i++) {
                    var y = Math.random() * 1000;
                    var values = [];
                    for (var j = 0; j < pointCount; j++) {
                        y += Math.round(10 + Math.random() * (-10 - 10));
                        values.push(
                            [
                                date[j],
                                // Math.random() < 0.1 ? '-' : y
                                y
                            ]
                        );
                    }

                  option.legend.data.push( 'line' + i );
                  option.series.push({
                    name: 'line' + i,
                    type: 'line',
                    sampling: 'average',
                    hoverAnimation: false,
                    showSymbol: false,
                    data: values,
                    lineStyle: lineStyle
                  });
                }

                function refresh(isBtnRefresh){
                    var start = new Date();
                    for( var n = 0; n < chartCount; n++ ) {
                        var el = document.createElement('div');
                      el.innerHTML = '<h1>'+n+'</h1><div id="chart'+n+'" style="width: 860px; height: 320px"></div>';
                      document.body.appendChild(el);

                      myChart = echarts.init(document.getElementById('chart'+n));
                      myChart.setOption(option, true);
                    }
                    var end = new Date();

                    document.getElementById('timing').innerHTML = 'Graphs loaded in ' + ( end - start ) + ' ms.';
                };

                refresh();
            });
        </script>
    </body>
</html>