diff --git a/gtsam/base/Makefile.am b/gtsam/base/Makefile.am index 9f22c36e8..eed25d600 100644 --- a/gtsam/base/Makefile.am +++ b/gtsam/base/Makefile.am @@ -37,7 +37,7 @@ sources += DSFVector.cpp check_PROGRAMS += tests/testBTree tests/testDSF tests/testDSFVector # Timing tests -noinst_PROGRAMS = tests/timeMatrix tests/timeublas +noinst_PROGRAMS = tests/timeMatrix tests/timeublas tests/timeVirtual #---------------------------------------------------------------------------------------------------- # Create a libtool library that is not installed diff --git a/gtsam/base/tests/timeVirtual.cpp b/gtsam/base/tests/timeVirtual.cpp new file mode 100644 index 000000000..f989dbca2 --- /dev/null +++ b/gtsam/base/tests/timeVirtual.cpp @@ -0,0 +1,145 @@ +/** + * @file timeVirtual.cpp + * @brief Time the overhead of using virtual destructors and methods + * @author Richard Roberts + * @created Dec 3, 2010 + */ + +#include + +#include +#include + +#include + +using namespace std; +using namespace boost; + +struct Plain { + size_t data; + Plain(size_t _data) : data(_data) {} + void setData(size_t data) { this->data = data; } +}; + +struct Virtual { + size_t data; + Virtual(size_t _data) : data(_data) {} + virtual void setData(size_t data) { this->data = data; } + virtual ~Virtual() {} +}; + +struct VirtualCounted { + size_t data; + size_t refCount; + VirtualCounted(size_t _data) : data(_data) {} + virtual void setData(size_t data) { this->data = data; } + virtual ~VirtualCounted() {} +}; + +void intrusive_ptr_add_ref(VirtualCounted* obj) { ++ obj->refCount; } +void intrusive_ptr_release(VirtualCounted* obj) { + assert(obj->refCount > 0); + -- obj->refCount; + if(obj->refCount == 0) + delete obj; +} + +int main(int argc, char *argv[]) { + + size_t trials = 10000000; + + tic_("heap plain alloc, dealloc"); + for(size_t i=0; i obj(new Plain(i)); + } + toc_("shared plain alloc, dealloc"); + + tic_("shared virtual alloc, dealloc"); + for(size_t i=0; i obj(new Virtual(i)); + } + toc_("shared virtual alloc, dealloc"); + + + tic_("heap plain alloc, dealloc, call"); + for(size_t i=0; isetData(i+1); + delete obj; + } + toc_("heap plain alloc, dealloc, call"); + + tic_("heap virtual alloc, dealloc, call"); + for(size_t i=0; isetData(i+1); + delete obj; + } + toc_("heap virtual alloc, dealloc, call"); + + tic_("stack plain alloc, dealloc, call"); + for(size_t i=0; i obj(new Plain(i)); + obj->setData(i+1); + } + toc_("shared plain alloc, dealloc, call"); + + tic_("shared virtual alloc, dealloc, call"); + for(size_t i=0; i obj(new Virtual(i)); + obj->setData(i+1); + } + toc_("shared virtual alloc, dealloc, call"); + + tic_("intrusive virtual alloc, dealloc, call"); + for(size_t i=0; i obj(new VirtualCounted(i)); + obj->setData(i+1); + } + toc_("intrusive virtual alloc, dealloc, call"); + + tictoc_print_(); + + return 0; +} +