mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@2011 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
		
			
				
	
	
		
			443 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			443 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE HTML>
 | 
						|
<html>
 | 
						|
    <head>
 | 
						|
        <title>Performance Tests (2)</title>
 | 
						|
        <style>
 | 
						|
            body { font-family: Tahoma, Serif; font-size: 9pt; }
 | 
						|
 | 
						|
            .left { text-align: left; }
 | 
						|
            .right { text-align: right; }
 | 
						|
            .center { text-align: center; }
 | 
						|
 | 
						|
            table.resultTable 
 | 
						|
            {
 | 
						|
                border: 1px solid black;
 | 
						|
                border-collapse: collapse;
 | 
						|
                empty-cells: show;
 | 
						|
                width: 100%;
 | 
						|
            }
 | 
						|
            table.resultTable td
 | 
						|
            {
 | 
						|
                padding: 2px 4px;
 | 
						|
                border: 1px solid black;
 | 
						|
            }
 | 
						|
            table.resultTable > thead > tr
 | 
						|
            {
 | 
						|
                font-weight: bold;
 | 
						|
                background: lightblue;
 | 
						|
            }
 | 
						|
            table.resultTable > tbody > tr:nth-child(odd)
 | 
						|
            {
 | 
						|
                background: white;
 | 
						|
            }
 | 
						|
            table.resultTable > tbody > tr:nth-child(even)
 | 
						|
            {
 | 
						|
                background: lightgray;
 | 
						|
            }
 | 
						|
 | 
						|
            .hide { display: none; }
 | 
						|
        </style>
 | 
						|
    </head>
 | 
						|
    <body bgcolor="white">
 | 
						|
        <h1>Performance Tests (2)</h1>
 | 
						|
 | 
						|
        <form id="sForm" onsubmit="runTestSuite();return false">
 | 
						|
            <table>
 | 
						|
                <tr>
 | 
						|
                    <td colspan="2">Settings:</td>
 | 
						|
                </tr>
 | 
						|
                <tr>
 | 
						|
                    <td class="right">Iterations:</td>
 | 
						|
                    <td><input id="sIterations" type="text" value="1000" required pattern="[0-9]+" /></td>
 | 
						|
                </tr>
 | 
						|
                <tr>
 | 
						|
                    <td class="right">Samples:</td>
 | 
						|
                    <td><input id="sSamples" type="text" value="100" required pattern="[0-9]+" /></td>
 | 
						|
                </tr>
 | 
						|
                <tr>
 | 
						|
                    <td class="right">Mode:</td>
 | 
						|
                    <td><input id="sAsync" name="sMode" type="radio" value="async" checked>Asynchronous</input>
 | 
						|
                        <input id="sSync" name="sMode" type="radio" value="sync">Synchronous</input>
 | 
						|
                    </td>
 | 
						|
                </tr>
 | 
						|
                <tr>
 | 
						|
                    <td colspan="2"><button type="submit" id="sRun" autofocus>Run!</button></td>
 | 
						|
                </tr>
 | 
						|
            </table>
 | 
						|
        </form>
 | 
						|
 | 
						|
 | 
						|
        <div><span id="statusBox"></span> <progress id="progressBox" value="0" style="display:none"></progress></div>
 | 
						|
 | 
						|
        <div style="padding-top:10px; padding-bottom:10px">
 | 
						|
        <table id="resultTable" class="resultTable">
 | 
						|
            <thead>
 | 
						|
                <tr>
 | 
						|
                    <td class="center" style="width:1%">Enabled</td>
 | 
						|
                    <td class="center" style="width:10%">Name</td>
 | 
						|
                    <td class="center" style="width:5%">Samples x Iterations</td>
 | 
						|
                    <td class="center" style="width:5%">Min, ms</td>
 | 
						|
                    <td class="center" style="width:5%">Avg, ms</td>
 | 
						|
                    <td class="center" style="width:5%">Max, ms</td>
 | 
						|
                    <td class="center" style="width:5%">Average calls/sec</td>
 | 
						|
                    <td class="center" style="width:5%">Measuring Inacurracy</td>
 | 
						|
                    <td class="center hide" style="width:5%">Memory, MB</td>
 | 
						|
                    <td class="center hide" style="width:5%">Memory delta, MB</td>
 | 
						|
                    <td class="center" style="width:55%">Description</td>
 | 
						|
                </tr>
 | 
						|
            </thead>
 | 
						|
            <tbody>
 | 
						|
                <!-- result rows here -->
 | 
						|
            </tbody>
 | 
						|
        </table>
 | 
						|
        </div>
 | 
						|
 | 
						|
<script type="text/javascript">
 | 
						|
(function () {
 | 
						|
    function getPrivateWorkingSet() {
 | 
						|
        return 0; // TODO: window.PerfTestGetPrivateWorkingSet();
 | 
						|
    }
 | 
						|
 | 
						|
    var disableWarmUp = true;
 | 
						|
 | 
						|
    var asyncExecution = true;
 | 
						|
    var testIterations = 1000;
 | 
						|
    var totalSamples = 100;
 | 
						|
    var sampleDelay = 0;
 | 
						|
 | 
						|
    var collectSamples = false;
 | 
						|
 | 
						|
    var tests = [];
 | 
						|
    var testIndex = -1;
 | 
						|
 | 
						|
    function execTestFunc(test) {
 | 
						|
        try {
 | 
						|
            var begin = new Date();
 | 
						|
            test.func(test.totalIterations);
 | 
						|
            var end = new Date();
 | 
						|
            return (end - begin);
 | 
						|
        } catch (e) {
 | 
						|
            test.error = e.toString();
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function execTest(test) {
 | 
						|
        if (disableWarmUp) { test.warmedUp = true; }
 | 
						|
 | 
						|
        function nextStep() {
 | 
						|
            if (asyncExecution) {
 | 
						|
                setTimeout(function () { execTest(test); }, sampleDelay);
 | 
						|
            } else {
 | 
						|
                execTest(test);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        function nextTest() {
 | 
						|
            updateStatus(test);
 | 
						|
            appendResult(test);
 | 
						|
 | 
						|
            return execNextTest();
 | 
						|
        }
 | 
						|
 | 
						|
        updateStatus(test);
 | 
						|
        if (!test.warmedUp) {
 | 
						|
            execTestFunc(test);
 | 
						|
            if (!test.error) {
 | 
						|
                test.warmedUp = true;
 | 
						|
                test.beginMemory = getPrivateWorkingSet();
 | 
						|
                return nextStep();
 | 
						|
            } else {
 | 
						|
                return nextTest();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (test.sample >= test.totalSamples) {
 | 
						|
            test.avg = test.total / test.totalSamples;
 | 
						|
            test.endMemory = getPrivateWorkingSet();
 | 
						|
            return nextTest();
 | 
						|
        }
 | 
						|
 | 
						|
        if (test.skipped) return nextTest();
 | 
						|
 | 
						|
        var elapsed = execTestFunc(test);
 | 
						|
        if (!test.error) {
 | 
						|
            test.total += elapsed;
 | 
						|
            if (!test.min) test.min = elapsed;
 | 
						|
            else if (test.min > elapsed) test.min = elapsed;
 | 
						|
            if (!test.max) test.max = elapsed;
 | 
						|
            else if (test.max < elapsed) test.max = elapsed;
 | 
						|
            if (collectSamples) {
 | 
						|
                test.results.push(elapsed);
 | 
						|
            }
 | 
						|
            test.sample++;
 | 
						|
            return nextStep();
 | 
						|
        } else {
 | 
						|
            return nextTest();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function updateStatus(test) {
 | 
						|
        var statusBox = document.getElementById("statusBox");
 | 
						|
        var progressBox = document.getElementById("progressBox");
 | 
						|
 | 
						|
        if (test.skipped || test.error || test.sample >= test.totalSamples) {
 | 
						|
            statusBox.innerText = "";
 | 
						|
            progressBox.style.display = "none";
 | 
						|
        } else {
 | 
						|
            statusBox.innerText = (testIndex + 1) + "/" + tests.length + ": " + test.name + " (" + test.sample + "/" + test.totalSamples + ")";
 | 
						|
            progressBox.value = (test.sample / test.totalSamples);
 | 
						|
            progressBox.style.display = "inline";
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function appendResult(test) {
 | 
						|
        if (test.name == "warmup") return;
 | 
						|
 | 
						|
        var id = "testResultRow_" + test.index;
 | 
						|
 | 
						|
        var nearBound = (test.max - test.avg) < (test.avg - test.min) ? test.max : test.min;
 | 
						|
        var memoryDelta = test.endMemory - test.beginMemory;
 | 
						|
        if (memoryDelta < 0) memoryDelta = "-" + Math.abs(memoryDelta).toFixed(2);
 | 
						|
        else memoryDelta = "+" + Math.abs(memoryDelta).toFixed(2);
 | 
						|
 | 
						|
        var markup = ["<tr id='" + id + "'>",
 | 
						|
                      "<td class='left'><input type='checkbox' id='test_enabled_", test.index ,"' ", (!test.skipped ? "checked" : "") ," /></td>",
 | 
						|
                      "<td class='left'>", test.name, "</td>",
 | 
						|
                      "<td class='right'>", test.totalSamples, "x", test.totalIterations, "</td>",
 | 
						|
                      "<td class='right'>", test.skipped || test.error || !test.prepared ? "-" : test.min.toFixed(2), "</td>",
 | 
						|
                      "<td class='right'>", test.skipped || test.error || !test.prepared ? "-" : test.avg.toFixed(2), "</td>",
 | 
						|
                      "<td class='right'>", test.skipped || test.error || !test.prepared ? "-" : test.max.toFixed(2), "</td>",
 | 
						|
                      "<td class='right'>", test.skipped || test.error || !test.prepared ? "-" : (test.totalIterations * 1000 / test.avg).toFixed(2), "</td>",
 | 
						|
                      "<td class='right'>", test.skipped || test.error || !test.prepared ? "-" : ("± " + (Math.abs(test.avg - nearBound) / (test.avg) * (100)).toFixed(2) + "%"), "</td>",
 | 
						|
                      "<td class='right hide'>", test.skipped || test.error || !test.prepared ? "-" : test.endMemory.toFixed(2), "</td>",
 | 
						|
                      "<td class='right hide'>", test.skipped || test.error || !test.prepared ? "-" : memoryDelta, "</td>",
 | 
						|
                      "<td class='left'>", test.description, test.error ? (test.description ? "<br/>" : "") + "<span style='color:red'>" + test.error + "</span>" : "", "</td>",
 | 
						|
                      "</tr>"
 | 
						|
                      ].join("");
 | 
						|
        // test.results.join(", "), "<br/>",
 | 
						|
 | 
						|
        var row = document.getElementById(id);
 | 
						|
        if (row) {
 | 
						|
            row.outerHTML = markup;
 | 
						|
        } else {
 | 
						|
            var tbody = document.getElementById("resultTable").tBodies[0];
 | 
						|
            tbody.insertAdjacentHTML("beforeEnd", markup);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function prepareQueuedTests() {
 | 
						|
        testIndex = -1;
 | 
						|
        for (var i = 0; i < tests.length; i++) {
 | 
						|
            var test = tests[i];
 | 
						|
            test.index = i;
 | 
						|
            test.prepared = false;
 | 
						|
            test.warmedUp = false;
 | 
						|
            test.sample = 0;
 | 
						|
            test.total = 0;
 | 
						|
            test.results = [];
 | 
						|
            test.error = false;
 | 
						|
            test.min = null;
 | 
						|
            test.avg = null;
 | 
						|
            test.max = null;
 | 
						|
            test.beginMemory = null;
 | 
						|
            test.endMemory = null;
 | 
						|
            test.totalIterations = parseInt(testIterations / test.complex);
 | 
						|
            test.totalSamples = parseInt(totalSamples / test.complex);
 | 
						|
 | 
						|
            var skipElement = document.getElementById('test_enabled_' + test.index);
 | 
						|
            test.skipped = skipElement ? !skipElement.checked : (test.skipped || false);
 | 
						|
 | 
						|
            if (test.totalIterations <= 0) test.totalIterations = 1;
 | 
						|
            if (test.totalSamples <= 0) test.totalSamples = 1;
 | 
						|
 | 
						|
            appendResult(test);
 | 
						|
            test.prepared = true;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function queueTest(func, name, description) {
 | 
						|
        var test;
 | 
						|
        if (typeof func === "function") {
 | 
						|
            test = {
 | 
						|
                name: name,
 | 
						|
                func: func,
 | 
						|
                description: description
 | 
						|
            };
 | 
						|
        } else {
 | 
						|
            test = func;
 | 
						|
        }
 | 
						|
        test.warmedUp = false;
 | 
						|
        test.complex = test.complex || 1;
 | 
						|
        tests.push(test);
 | 
						|
    }
 | 
						|
 | 
						|
    function execNextTest() {
 | 
						|
        testIndex++;
 | 
						|
        if (tests.length <= testIndex) {
 | 
						|
            return testSuiteFinished();
 | 
						|
        } else {
 | 
						|
            return execTest(tests[testIndex]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function execQueuedTests() {
 | 
						|
        prepareQueuedTests();
 | 
						|
        execNextTest();
 | 
						|
    }
 | 
						|
 | 
						|
    function setSettingsState(disabled) {
 | 
						|
        document.getElementById('sIterations').disabled = disabled;
 | 
						|
        document.getElementById('sSamples').disabled = disabled;
 | 
						|
        document.getElementById('sAsync').disabled = disabled;
 | 
						|
        document.getElementById('sSync').disabled = disabled;
 | 
						|
        document.getElementById('sRun').disabled = disabled;
 | 
						|
    }
 | 
						|
 | 
						|
    function testSuiteFinished() {
 | 
						|
        setSettingsState(false);
 | 
						|
    }
 | 
						|
 | 
						|
    window.runTestSuite = function () {
 | 
						|
        setSettingsState(true);
 | 
						|
 | 
						|
        testIterations = parseInt(document.getElementById('sIterations').value);
 | 
						|
        totalSamples = parseInt(document.getElementById('sSamples').value);
 | 
						|
        asyncExecution = document.getElementById('sAsync').checked;
 | 
						|
 | 
						|
        setTimeout(execQueuedTests, 0);
 | 
						|
    }
 | 
						|
 | 
						|
    setTimeout(prepareQueuedTests, 0);
 | 
						|
 | 
						|
    // Test queue.
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue Default",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue();
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "No arguments, returns int32 value.",
 | 
						|
        skipped: true,
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (0, Undefined)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(0);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns undefined value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (1, Null)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(1);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns null value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (2, Bool)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(2);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns bool value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (3, Int)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(3);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns int value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (4, UInt)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(4);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns uint value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (5, Double)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(5);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns double value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (6, Date)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(6);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns date value.",
 | 
						|
        skipped: true,
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (7, String)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(7);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns string value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (8, Object)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(8);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns object value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (9, Array)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(9);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns array value."
 | 
						|
    });
 | 
						|
 | 
						|
    queueTest({
 | 
						|
        name: "PerfTestReturnValue (10, Function)",
 | 
						|
        func: function (count) {
 | 
						|
            for (var i = 0; i < count; i++) {
 | 
						|
                window.PerfTestReturnValue(10);
 | 
						|
            }
 | 
						|
        },
 | 
						|
        description: "Int argument, returns function value.",
 | 
						|
        skipped: true,
 | 
						|
    });
 | 
						|
    // add more tests to queueTest
 | 
						|
 | 
						|
})();
 | 
						|
</script>
 | 
						|
 | 
						|
    </body>
 | 
						|
</html>
 |