CS210 Lab: Computational Complexity and Performance Measurement


Prelab Questions:

For a review of relevant topics click here.

Highlights of This Lab:

Lab Exercise:


Click the little computer above for a detailed description.
In the exercise, the students can add the library, which has been created in this lab, to existing code to test the runtime of three different search algorithms and three different sorting algorithms.

1. Computational Complexity and Performance Measurement

A routine's performance can be judged in many ways. In CS210, you have been/will be learning Big O. The idea is that you can estimate the routine's projected execution times as a function of the number of data items (N) that it manipulates as it performs its task. The results are estimates of the form O(N), O(LogN) and so on.

Big O allows us to group routines based on their projected performance under different conditions (best case, worst case, etc). Remember that Big O is only an estimate. It does not take into account factors specific to a particular environment, such the specific implementation, the type of computer system we are using, and the data that we are processing.

To determine how well or poorly a routine will perform in a particular environment, we need to evaluate the routine in that environment.

In "Part 1" of the laboratory exercise, you will measure the performance of three search routines:

The first two search routines were discussed in CS115. For a review, click here

In summary, for the binary search, you are given a sorted array. The idea is to divide the array into two equal parts and narrow down the range of the array to be searched either to the low part of the array or high part of the array. We will continue narrowing down the range until the value is located, or until we realize that the value searched for is not in the array.

The linear search is also known as the sequential search. The idea is start with the first element, and sequentially search through the array until we find a match.

Before we can measure the performance of these routines, we must first develop a set of tools that allow us to measure the execution time.

The general approach will be the following:

If the routine executes very rapidly, then the difference between startTime and stopTime may be too small for your computer system to measure. If that is the case, we can execute the routine several times (say n) and then divide the resulting time by the number of repetitions (n) as follows: To capture the startTime and stopTime, we will use a class called Timer which has the following member functions: To add some complexity to this lab, we will turn this Timer class into a library and use this library for the lab exercise at the end.

2. Creating a Library and Using it

Our first step will be to download the Timer class and a sample program just to try it out

2.1 Download the C++ programs

Transfer three files to your local PC. Get the files from ftp://ftp.cs.uregina.ca/pub/class/210/ftp/Library

The three files are :

  • complexity.cpp:
  • This is the main program.
  • timer.cpp:
  • This is the implementation of the Timer module.  It can be compiled into a library once it is bug-free.
  • timer.h:
  • This is the header file of the Timer module

    Store the three files where you can easily find them.

    2.2 Compile the C++ programs

    Using the procedures discussed in Lab 1 do the following: Let's have a look at this code:
    Our second step will be to create a library

    2.3 What is a library?

    A library is a collection of object files - .obj files similar to the .o files you saw in Unix. Object files can contain individual functions, collections of functions or an entire class implementation. Each object file is stored individually. When your program references a function or class contained in a library, it links the object it belongs to and adds its code to your program. This way you can have one big file to store related things but only the pieces that you actually use in your program are added to the executable file.

    2.4 What are header files?

    Each function or class defined in the C or C++ standard library has a header file associated with it. The header files that relate to the functions that you use in your programs should be included (using #include) in your program.
    There are two reasons for this:

    1. to get the data types that work with many functions or classes in the standard library. Your program must have access to these data types that are defined in the header file related to each function or class
    2. to obtain the prototypes for the standard library functions

    Interestingly one library may have more than one header file.

    2.5 Why create your own Library

    Libraries can be regarded as pre-compiled functions or classes that do not need to be re-compiled if other parts of your project change. If you have a "bug-free" module (a piece of self-contained code) that could be reused with other projects, you can compile this module to a library. After you link this library to your new project, you will then be able to use any of the functions or classes in this library as if they are defined locally in your project. One major advantage is that the functions or classes in the library will not be recompiled, which saves time compiling your entire project.

    In our example, "timer" is a perfect candidate: it does not contain any bugs and we can use it again in other projects.

    To use "timer" in a new project, we will have to first compile the C++ programs into a library, and then link this library to the new project.

    2.6 Compile the C++ programs using a library.

    In this program, timer.h and timer.cpp define and implement a time measuring class Timer. This class is independent of the kind of program it is measuring. In other words, we can reuse this Timer class to measure the running time of other programs. It naturally follows that once we make this class bug-free, we can compile it into a library.  To use this time-measuring class, we simply include the header file (i.e.timer.h) in the program and link the library to this program.

    The following shows you how we do this:  

    Step 1. Create the library

    Step 2. Add the necessary files to mylibrary and build the library

    Step 3. Build mylibrary 

    The following message should be displayed in the output area:

    1>------ Build started: Project: mylibrary, Configuration: Debug Win32 ------
    1>  timer.cpp
    1>  mylibrary.vcxproj → C:\Users\????\Documents\Visual Studio 2012\Projects\mylibrary\Debug\mylibrary.lib
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    

    The library will be called mylibrary.lib and should be stored in the solution's Debug folder. You can see the path to it in the compiler's output. Go to the folder and look for it.

    Step 4. Link the library to your project

    You now have to do three things to add the library that you created to the "link line".
    1. Add mylibrary.lib to the Project Properties

    2. Add the corresponding path (or location of this library) to the project. The path is used to locate the library files when the VC++ project is being built.

    3. Add the path where the timer.h file is to be found.
    4. Your project should build and run like this if you have followed the above steps correctly.

    3. Lab Exercise

    Part 1

    You will plot and analyse the execution times of three searching routines.

    Part 2

    You will plot and analyse the execution times of three sorting routines.

    4. Postlab Exercises

    For postlab exercises, click here.

    CS Dept Home Page
    CS Dept Class Files
    CS210 Class Files


    Copyright: Department of Computer Science, University of Regina.