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