| /** | |
| * This example shows how easy it is to use the profiler tool | |
| * in Epsilon. | |
| * | |
| * The fibonacci number can be calculated by using a simple recursive | |
| * algorithm which uses an exponentially growing number of executions. | |
| * | |
| * This example is taken from | |
| * http://www.eclipse.org/epsilon/doc/EpsilonProfilingTools.pdf | |
| * See also | |
| * http://epsilonblog.wordpress.com/2007/12/16/cached-operations-in-eol/ | |
| * | |
| * HOW TO RUN THIS EXAMPLE: | |
| * | |
| * 1. Open the Epsilon Profiling window: | |
| * In Eclipse, open Window->Show View->Other.. and search for | |
| * "Profiling" in order to open the Epsilon Profiling view. | |
| * | |
| * 2. Launch the program: | |
| * Select fibonacci.launch | |
| * Open the context-menu (right-click) and select Run As-> fibonacci | |
| * | |
| * 3. Refresh the data in the profiler window: | |
| * In the top right corner of the profiling window, click | |
| * "Refresh view". You should now see that target "Program" has | |
| * been called once and "fib" has been called 1973 times. | |
| * | |
| * 4. Repeat with @cached annotation | |
| * Reset the profiler (top right corner of profiling window) and | |
| * uncomment the @cached annotation located just before the | |
| * fib operation. | |
| * | |
| * Repeat step 1 - 3. You should now see that "fib" has | |
| * been called only 16 times. | |
| **/ | |
| // Instantiate the profiler through its native type | |
| var profiler : new Native('org.eclipse.epsilon.eol.tools.ProfilerTool'); | |
| // Start profiling for a target called "Program" | |
| profiler.start('Program'); | |
| // Calculate the 15th fibonacci number | |
| 15.fib(); | |
| // Stop profiling for the current target | |
| profiler.stop(); | |
| /* | |
| * With caching, the fib operation is executed 1973 times, but when | |
| * Epsilon is instructed to cache the return value for each combination | |
| * of object and input parameters, it is only executed 16 times. | |
| * | |
| **/ | |
| // Uncomment the annotation @cached to stop Epsilon | |
| // from recalculating known values | |
| // @cached | |
| operation Integer fib() : Integer { | |
| // Start profiling for target "fib" with this integer as context | |
| profiler.start('fib', self); | |
| var fib : Integer; | |
| // Base cases for the fibonacci number | |
| if (self = 1 or self = 0) { | |
| fib = 1; | |
| } else { | |
| // Recursively calculate the fibonacci number | |
| // (i.e. f(n) = f(n-1) + f(n-2) ) | |
| fib = (self-1).fib() + (self-2).fib(); | |
| } | |
| // Stop profiling for the current target | |
| profiler.stop(); | |
| return fib; | |
| } |