127 lines
3.0 KiB
HTML
127 lines
3.0 KiB
HTML
|
<!doctype html>
|
||
|
<html>
|
||
|
<head>
|
||
|
<meta charset="utf-8">
|
||
|
<title>Zones Profiling</title>
|
||
|
<link rel="stylesheet" href="css/style.css">
|
||
|
<script>
|
||
|
__Zone_disable_Error = true;
|
||
|
__Zone_disable_on_property = true;
|
||
|
__Zone_disable_geolocation = true;
|
||
|
__Zone_disable_toString = true;
|
||
|
__Zone_disable_blocking = true;
|
||
|
__Zone_disable_PromiseRejectionEvent = true;
|
||
|
</script>
|
||
|
<script src="../dist/zone.js"></script>
|
||
|
<script src="../dist/long-stack-trace-zone.js"></script>
|
||
|
</head>
|
||
|
<body>
|
||
|
|
||
|
<h1>Profiling with Zones</h1>
|
||
|
|
||
|
<button id="b1">Start Profiling</button>
|
||
|
|
||
|
<script>
|
||
|
/*
|
||
|
* Let's say we want to know the CPU cost from some action
|
||
|
* that includes async tasks. We can do this with zones!
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* For this demo, we're going to sort an array using an async
|
||
|
* algorithm when a button is pressed.
|
||
|
*/
|
||
|
function sortAndPrintArray (unsortedArray) {
|
||
|
profilingZoneSpec.reset();
|
||
|
asyncBogosort(unsortedArray, function (sortedArray) {
|
||
|
console.log(sortedArray);
|
||
|
console.log('sorting took ' + profilingZoneSpec.time() + ' of CPU time');
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* This is a really efficient algorithm.
|
||
|
*
|
||
|
* First, check if the array is sorted.
|
||
|
* - If it is, call the wrapCallback
|
||
|
* - If it isn't, randomize the array and recur
|
||
|
*
|
||
|
* This implementation is async because JavaScript
|
||
|
*/
|
||
|
function asyncBogosort (arr, cb) {
|
||
|
setTimeout(function () {
|
||
|
if (isSorted(arr)) {
|
||
|
cb(arr);
|
||
|
} else {
|
||
|
var newArr = arr.slice(0);
|
||
|
newArr.sort(function () {
|
||
|
return Math.random() - 0.5;
|
||
|
});
|
||
|
asyncBogosort(newArr, cb);
|
||
|
}
|
||
|
}, 0);
|
||
|
}
|
||
|
|
||
|
function isSorted (things) {
|
||
|
for (var i = 1; i < things.length; i += 1) {
|
||
|
if (things[i] < things[i - 1]) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Bind button
|
||
|
*/
|
||
|
function main () {
|
||
|
var unsortedArray = [3,4,1,2,7];
|
||
|
b1.addEventListener('click', function () {
|
||
|
sortAndPrintArray(unsortedArray);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* This zone starts a timer at the start of each taskEnv,
|
||
|
* and stops it at the end. It accumulates the total run
|
||
|
* time internally, exposing it via `zone.time()`
|
||
|
*
|
||
|
* Note that this is the time the CPU is spending doing
|
||
|
* bogosort, as opposed to the time from the start
|
||
|
* of the algorithm until it's completion.
|
||
|
*/
|
||
|
var profilingZoneSpec = (function () {
|
||
|
var time = 0,
|
||
|
// use the high-res timer if available
|
||
|
timer = performance ?
|
||
|
performance.now.bind(performance) :
|
||
|
Date.now.bind(Date);
|
||
|
return {
|
||
|
onInvokeTask: function (delegate, current, target, task, applyThis, applyArgs) {
|
||
|
this.start = timer();
|
||
|
delegate.invokeTask(target, task, applyThis, applyArgs);
|
||
|
time += timer() - this.start;
|
||
|
},
|
||
|
time: function () {
|
||
|
return Math.floor(time*100) / 100 + 'ms';
|
||
|
},
|
||
|
reset: function () {
|
||
|
time = 0;
|
||
|
}
|
||
|
};
|
||
|
}());
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Bootstrap the app
|
||
|
*/
|
||
|
Zone.current.fork(profilingZoneSpec).run(main);
|
||
|
|
||
|
</script>
|
||
|
|
||
|
</body>
|
||
|
</html>
|