[Webkit-unassigned] [Bug 61873] New: Poor performance of XHR streaming.

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Wed Jun 1 11:10:23 PDT 2011


https://bugs.webkit.org/show_bug.cgi?id=61873

           Summary: Poor performance of XHR streaming.
           Product: WebKit
           Version: 528+ (Nightly build)
          Platform: Unspecified
        OS/Version: Unspecified
            Status: UNCONFIRMED
          Severity: Normal
          Priority: P2
         Component: WebKit API
        AssignedTo: webkit-unassigned at lists.webkit.org
        ReportedBy: goberman at msn.com


I am not sure if XHR implementation is part of WebKit or Chrome, but I will try it...

My application has a server that streams market data. One of the mechanisms uses XMLHttpRequest to stream data. As you know responseText property of XHR keeps growing till response is completed. I implemented periodic server disconnects to avoid memory leak, but encountered another problem: with Chrome cpu steadily keeps climbing as size of the responseText increases. 
If I stream couple MEG, CPU reaches close to 100%, but once server closes connection, CPU drops to 0. I stream about 300 messages per second.
Clearly this is something that is not efficient in this implementation (I do not rule out JavaScript enefficiency).

The test to duplicate this is below:
SERVER 

package test;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class WebFrameworkServletXHRReconnects extends HttpServlet {
    private static final String message = "<activ>{\"m\":4,\"r\":0,\"e\":1,\"s\":[\"MSFT.\",0],\"f\":[[55,6,317,2],[54,6,825,3],[52,4,54705518],[12,6,26865,3]]}</activ>";
    private static int iteration;
    private SimpleDateFormat formatter = new SimpleDateFormat("hh:mm:ss");

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("begin " + iteration++);
        //System.out.println("Begin for session: " + request.getSession(true).getId() + " " + response.getWriter());

        response.setHeader("pragma", "no-cache,no-store");
        response.setHeader("cache-control", "no-cache,no-store,max-age=0,max-stale=0");
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setContentType("text/json");

        PrintWriter out = response.getWriter();

        int sentBytes = 0;
        int i = 0;
        while (sentBytes < 1024 * 1024 * 10) {
            out.print(message);
            out.flush();

            sentBytes += message.length();

            i++;

            if (i % 10 == 0) {
                try {
                    Thread.sleep(40);
                } catch (InterruptedException e) {}
            }

            if (i % 100 == 0) {
                System.out.println(formatter.format(new Date()) + " " + i);
            }
        }
    }
}

CLIENT:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
    <title>test</title>
</head>
<body>
    <input type="button" value="TEST" onclick="test(); return false;" />

    <script type="text/javascript">
        var api;

        var domElement = document.getElementsByTagName('body')[0];

        function test() {
            api = new XMLHttpRequest;

            api.onreadystatechange = onreadystatechange;
            api.onerror = onerror;

            debug('connect');
            api.open("GET", "http://172.16.16.250/Test/Controller", true);

            api.send("");
        }

        function onreadystatechange() {
            //debug('readyState' + api.readyState);
            switch (api.readyState) {
                case 4:
                    debug('done: ');
                test();
                    break;
                case 3:
                    processMessage();
                    break;
            }
        }

        function onerror() {
            debug('onerror');
        test();
    }

    function processMessage() {
            var buffer = api.responseText;
    }

        function debug(message) {
            var currentTime = new Date();
            var hours = currentTime.getHours();
          var minutes = currentTime.getMinutes();
          var seconds = currentTime.getSeconds();

            var oText = document.createTextNode(hours + ":" + minutes + ":" + seconds + " " + message);
            var oDiv = document.createElement('div');
            oDiv.appendChild(oText);

            domElement.insertBefore(oDiv, domElement.hasChildNodes() ? domElement.childNodes[0] : null);
        }
    </script>
</body>
</html>

-- 
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.



More information about the webkit-unassigned mailing list