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