141 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
| 
								 | 
							
								/* ----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
							 | 
						||
| 
								 | 
							
								 * Atlanta, Georgia 30332-0415
							 | 
						||
| 
								 | 
							
								 * All Rights Reserved
							 | 
						||
| 
								 | 
							
								 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * See LICENSE for the license information
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * -------------------------------------------------------------------------- */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file    timeVirtual.cpp
							 | 
						||
| 
								 | 
							
								 * @brief   Time the overhead of using virtual destructors and methods
							 | 
						||
| 
								 | 
							
								 * @author  Richard Roberts
							 | 
						||
| 
								 | 
							
								 * @date    Nov 6, 2011
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <gtsam/base/timing.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/shared_ptr.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive_ptr.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <iostream>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using namespace std;
							 | 
						||
| 
								 | 
							
								using namespace boost;
							 | 
						||
| 
								 | 
							
								using namespace gtsam;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct DtorTestBase {
							 | 
						||
| 
								 | 
							
								  DtorTestBase() { cout << "  DtorTestBase" << endl; }
							 | 
						||
| 
								 | 
							
								  virtual ~DtorTestBase() { cout << "  ~DtorTestBase" << endl; }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct DtorTestDerived : public DtorTestBase {
							 | 
						||
| 
								 | 
							
								  DtorTestDerived() { cout << "  DtorTestDerived" << endl; }
							 | 
						||
| 
								 | 
							
								  virtual ~DtorTestDerived() { cout << "  ~DtorTestDerived" << endl; }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct VirtualBase {
							 | 
						||
| 
								 | 
							
								  VirtualBase() { }
							 | 
						||
| 
								 | 
							
								  virtual void method() = 0;
							 | 
						||
| 
								 | 
							
								  virtual ~VirtualBase() { }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct VirtualDerived : public VirtualBase {
							 | 
						||
| 
								 | 
							
								  double data;
							 | 
						||
| 
								 | 
							
								  VirtualDerived() { data = rand(); }
							 | 
						||
| 
								 | 
							
								  virtual void method() { data = rand(); }
							 | 
						||
| 
								 | 
							
								  virtual ~VirtualDerived() { }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct NonVirtualBase {
							 | 
						||
| 
								 | 
							
								  NonVirtualBase() { }
							 | 
						||
| 
								 | 
							
								  ~NonVirtualBase() { }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct NonVirtualDerived : public NonVirtualBase {
							 | 
						||
| 
								 | 
							
								  double data;
							 | 
						||
| 
								 | 
							
								  NonVirtualDerived() { data = rand(); }
							 | 
						||
| 
								 | 
							
								  void method() { data = rand(); }
							 | 
						||
| 
								 | 
							
								  ~NonVirtualDerived() { }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main(int argc, char *argv[]) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Virtual destructor test
							 | 
						||
| 
								 | 
							
								  cout << "Stack objects:" << endl;
							 | 
						||
| 
								 | 
							
								  cout << "Base:" << endl;
							 | 
						||
| 
								 | 
							
								  { DtorTestBase b; }
							 | 
						||
| 
								 | 
							
								  cout << "Derived:" << endl;
							 | 
						||
| 
								 | 
							
								  { DtorTestDerived d; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cout << "Heap objects:" << endl;
							 | 
						||
| 
								 | 
							
								  cout << "Base:" << endl;
							 | 
						||
| 
								 | 
							
								  { DtorTestBase *b = new DtorTestBase(); delete b; }
							 | 
						||
| 
								 | 
							
								  cout << "Derived:" << endl;
							 | 
						||
| 
								 | 
							
								  { DtorTestDerived *d = new DtorTestDerived(); delete d; }
							 | 
						||
| 
								 | 
							
								  cout << "Derived with base pointer:" << endl;
							 | 
						||
| 
								 | 
							
								  { DtorTestBase *b = new DtorTestDerived(); delete b; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  int n = 10000000;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  VirtualBase** b = new VirtualBase*[n];
							 | 
						||
| 
								 | 
							
								  gttic_(Virtual);
							 | 
						||
| 
								 | 
							
								  gttic_(new);
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<n; ++i)
							 | 
						||
| 
								 | 
							
								    b[i] = new VirtualDerived();
							 | 
						||
| 
								 | 
							
								  gttoc_(new);
							 | 
						||
| 
								 | 
							
								  gttic_(method);
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<n; ++i)
							 | 
						||
| 
								 | 
							
								    b[i]->method();
							 | 
						||
| 
								 | 
							
								  gttoc_(method);
							 | 
						||
| 
								 | 
							
								  gttic_(dynamic_cast);
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<n; ++i) {
							 | 
						||
| 
								 | 
							
								    VirtualDerived* d = dynamic_cast<VirtualDerived*>(b[i]);
							 | 
						||
| 
								 | 
							
								    if(d)
							 | 
						||
| 
								 | 
							
								      d->method();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  gttoc_(dynamic_cast);
							 | 
						||
| 
								 | 
							
								  gttic_(delete);
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<n; ++i)
							 | 
						||
| 
								 | 
							
								    delete b[i];
							 | 
						||
| 
								 | 
							
								  gttoc_(delete);
							 | 
						||
| 
								 | 
							
								  gttoc_(Virtual);
							 | 
						||
| 
								 | 
							
								  delete[] b;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  NonVirtualDerived** d = new NonVirtualDerived*[n];
							 | 
						||
| 
								 | 
							
								  gttic_(NonVirtual);
							 | 
						||
| 
								 | 
							
								  gttic_(new);
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<n; ++i)
							 | 
						||
| 
								 | 
							
								    d[i] = new NonVirtualDerived();
							 | 
						||
| 
								 | 
							
								  gttoc_(new);
							 | 
						||
| 
								 | 
							
								  gttic_(method);
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<n; ++i)
							 | 
						||
| 
								 | 
							
								    d[i]->method();
							 | 
						||
| 
								 | 
							
								  gttoc_(method);
							 | 
						||
| 
								 | 
							
								  gttic_(dynamic_cast_does_nothing);
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<n; ++i)
							 | 
						||
| 
								 | 
							
								    d[i]->method();
							 | 
						||
| 
								 | 
							
								  gttoc_(dynamic_cast_does_nothing);
							 | 
						||
| 
								 | 
							
								  gttic_(delete);
							 | 
						||
| 
								 | 
							
								  for(int i=0; i<n; ++i)
							 | 
						||
| 
								 | 
							
								    delete d[i];
							 | 
						||
| 
								 | 
							
								  gttoc_(delete);
							 | 
						||
| 
								 | 
							
								  gttoc_(NonVirtual);
							 | 
						||
| 
								 | 
							
								  delete[] d;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  tictoc_finishedIteration_();
							 | 
						||
| 
								 | 
							
								  tictoc_print_();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								}
							 |