CSC/ECE 517 Fall 2010/ch5 5c ck: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
Line 46: Line 46:
===Double Dispatch===
===Double Dispatch===
This method uses single dispatch and the [http://en.wikipedia.org/wiki/Visitor_pattern visitor pattern pg(526-530)][3] to simulate a special form of multiple dispatch where the run time types of two arguments are taken into account.
This method uses single dispatch and the [http://en.wikipedia.org/wiki/Visitor_pattern visitor pattern pg(526-530)][3] to simulate a special form of multiple dispatch where the run time types of two arguments are taken into account.
===Multi Dispatch Simulation===
===Multiple Dispatch Simulation===
[http://www.laputan.org/reflection/Foote-Johnson-Noble-ECOOP-2005.pdf Efficient multimethods in a single dispatch Language][2] is a paper that describes several methods that can be used to simulate multi dispatch in a single dispatch language. It also compares the relative performance of each method.
[http://www.laputan.org/reflection/Foote-Johnson-Noble-ECOOP-2005.pdf Efficient multimethods in a single dispatch Language][2] is a paper that describes several methods that can be used to simulate multi dispatch in a single dispatch language. It also compares the relative performance of each method.



Revision as of 22:32, 30 October 2010

Dynamic Dispatch

Introduction

Dynamic dispatch means there is a determination of which method to execute at run time, when a class and one of it's subclasses have the same method signature. Evaluation of Control Structures for Dynamic Dispatch in JAVA (pg 5)[1]
Dynamic dispatch occurs when a class is downcast to one of its super classes and a method is called on that super class object.

Generic Example

Using Dynamic Dispatch

We have a set of objects that can be rendered to the display.
Each object implements the IRenderable interface as seen below:



Utilizing the ability of dynamic dispatch it is very simple to render a collection of IRenderable[] objects for the display:

IRenderable[] irCollection = {new Circle(0,0,.5), new Polygon(0,0,1,1,2,2,0,0)}
foreach (IRenderable ir in irCollection)
{
   ir.render();
}

Note: This example would be the same if IRenderable were a class or abstract class object.<br/

Static Simulation of Dynamic Dispatch

Without dynamic dispatch we would have to test the type of the object, cast it to a subtype and make the call.

IRenderable[] irCollection = {new Circle(0,0,.5), new Polygon(0,0,1,1,2,2,0,0)}
foreach (IRenderable ir in irCollection)
{
   if (ir is Circle) ((Circle)ir).render();
   if (ir is Polygon) ((Polygon)ir).render();
}

This is more complicated than using dynamic dispatch and it also requires us to alter this code every time we add a new class.

Single and Multiple Dispatch

Single Dispatch

At a minimum, all Object Oriented languages implement a dynamic dispatch process known as single dispatch (pg2)[2].
In single dispatch a method call considers the dynamic type of only the class that the message is sent to. The source argument is the only one that is accessed at run time, all parameters are treated as static types.

Multiple Dispatch

A few Object Oriented languages implement a more complete dynamic dispatch process known as multiple dispatch (pg2)[2].
In multiple dispatch more than one or all objects are accessed dynamically at run time. The source object is accessed at run time, and one or more parameters are dynamically accessed at run time.

Double Dispatch

This method uses single dispatch and the visitor pattern pg(526-530)[3] to simulate a special form of multiple dispatch where the run time types of two arguments are taken into account.

Multiple Dispatch Simulation

Efficient multimethods in a single dispatch Language[2] is a paper that describes several methods that can be used to simulate multi dispatch in a single dispatch language. It also compares the relative performance of each method.

Performance

According to Technical Report on C++ Performance (pg 26)[4] "Calling a virtual function is roughly equivalent to calling a function through a pointer stored in an array"
I interpret this to mean that the speed of single dispatch is roughly the same as the speed of calling a non dispatched method.

Efficient multimethods in a single dispatch Language (pg 16,17)[2] tested the performance of their simulated multiple dispatch methods showing (pg 17): Performanace Comparison

Method Speed
Single Dispatch 0.20
Double Dispatch 1.00
Multidispatch (3 args) 1.35
Multidispatch (7 args) 2.32

It also shows that other methods such as case statements or dictionary lookup are significantly slower.

MultiJava is a Java language that support multiple dispatch. MultiJava: Design, implementation, and evaluation (pg 89 table 6)[5] shows that in MultiJava the native multiple dispatch methods are 62% faster than simulated double dispatch and 59% faster than simulated multiple dispatch.

Conclusion

The information presented in this article demonstrates that the trade off between simulated multiple dispatch and native multiple dispatch is only a factor in an application where a very large number of iterations involving multiple dispatch operations are present.

References

[1] Evaluation of Control Structures for Dynamic Dispatch in Java by Inira Lorraine and Karel Drieson(pg 5)
[2] Efficient Multimethods in a single dispatch Language Brian Foote, Ralph E. Johnson and James Noble
[3] Visitor by Robert C. Martin 2002 pg(526-520)
[4] Technical Report on C++ Performance ISO/IEC TR 18015:2006(E) 2006-02-15 (pg. 26)
[5] MultiJava: Design, implementation, and evaluation Curtis Charles Clifton November 2001(pg 89 table 6)