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>
							 |