The goal of this lab is to study the efficiency of sorting algorithms experimentally and to compare the results with the theoretical findings of complexity analysis.
In engineering, instrumentation refers to the methods and techniques of measuring and controlling physical systems. Software engineering has its own methods for instrumenting applications and other pieces of software. The two main attributes that software developers measure is time and space (ie, computer memory usage).
The main use of instrumentation in software development is in optimizing software for which we already have a working version (so, this would come logically after design, implementation, and testing in the software development process). Usually software developers are interested in finding parts of the application that would most benefit from optimization. To do this, parts of the program are monitored to keep track of how much time is spent (in a given method, for example), or how much memory is consumed (by a given class or group of classes).
Suppose an application contains a function a
whose
algorithm is found to be slow---suppose its running time grows
quadratically with the size of the input---and another function b
whose algorithm has linear time growth (that is, the time it takes is
merely proportional to the size of the input).
From a theoretical analysis, it may seem like function a
should be subject to closer inspection.
However, after running experiments, a developer might discover that
80% of the application's running is spent in b
(because it is called frequently with large amounts of data)
but only 2% in a
(because it is called rarely, and always
with small amounts of data).
These experimental results suggest that the developer's efforts would
be much better spent improving b
's complexity even a little bit
than improving a
's complexity a lot.
Similarly there are tools that monitor program executions to determine which classes are instantiated most often and in total take up the most memory-- to identify which classes could most use to be streamlined.
Last week we measured the number of comparisons that our methods made. We will still use that, but this time we also will use a more concrete measure: actual running time in milliseconds. While this might seem like the definitive measurement, some care needs to be taken to ensure that the data collected is useful-- something you will need to be thinking about as you conduct these experiments.
You have the following tools/pieces at your disposal for use in the experiments assigned below.
arrayUtil
, a library that contains functions
randomArray()
, blankArray()
,
displayArray()
, arrayFromFile()
,
getTimeMillis()
,
copyArray()
, and isSorted()
.
getTimeMillis()
reads
from the system clock and reports that value.
In this lab, you will perform two experiments (or three, if time permits). You and your partner will propose a question to ask and an experiment which will answer that question, then write code to perform the experiments, run the experiments, and analyze the result. Here are the questions from which you should choose: