関数呼び出しのコスト
ちょっと気になったので計測
//functions.h #pragma once void f(__int64& i); struct normal_function { void f(__int64& i); }; struct virtual_function_base { virtual void f(__int64& i)=0; }; struct virtual_function :public virtual_function_base { virtual void f(__int64& i); };
// functions.cpp #include "functions.h" void f(__int64& i) { ++i; } void normal_function::f(__int64& i) { ++i; } void virtual_function::f(__int64& i) { ++i; }
//main.cpp #include <cstdio> #include <conio.h> #include <tchar.h> #include <windows.h> #include <mmsystem.h> #pragma comment(lib,"winmm.lib") #include <boost/function.hpp> #include <boost/bind.hpp> #include "functions.h" void time_check() { unsigned long start_time=timeGetTime(); __int64 target=0; for(__int64 i=0;i<100000000;++i) f(target); std::printf("time=%d target=%d\n\n",timeGetTime()-start_time,target); } template <typename T> void time_check_member(T& t) { unsigned long start_time=timeGetTime(); __int64 target=0; for(__int64 i=0;i<100000000;++i) t.f(target); std::printf("time=%d target=%d\n\n",timeGetTime()-start_time,target); } template <typename T> void time_check_member_pointer(T* t) { unsigned long start_time=timeGetTime(); __int64 target=0; for(__int64 i=0;i<100000000;++i) t->f(target); std::printf("time=%d target=%d\n\n",timeGetTime()-start_time,target); } template <typename T> void time_check_functor(const T& t) { unsigned long start_time=timeGetTime(); __int64 target=0; for(__int64 i=0;i<100000000;++i) t(target); std::printf("time=%d target=%d\n\n",timeGetTime()-start_time,target); } int _tmain(int argc, _TCHAR* argv[]) { timeBeginPeriod(1); Sleep(3000); printf("global function\n"); time_check(); normal_function normaltype; printf("member function\n"); time_check_member(normaltype); virtual_function virtualtype; printf("virtual member function\n"); time_check_member(virtualtype); printf("virtual_base member function\n"); time_check_member_pointer((virtual_function_base*)&virtualtype); printf("global member functor\n"); boost::function<void (__int64&)> functor_global=boost::bind(&f,_1); time_check_functor(functor_global); printf("member functor\n"); boost::function<void (__int64&)> functor_normal=boost::bind(&normal_function::f ,normaltype,_1); time_check_functor(functor_normal); printf("virtual member functor\n"); boost::function<void (__int64&)> functor_virtual=boost::bind(&virtual_function::f ,virtualtype,_1); time_check_functor(functor_normal); printf("virtual_base member functor\n"); boost::function<void (__int64&)> functor_virtual_base=boost::bind(&virtual_function_base::f ,(virtual_function_base*)&virtualtype,_1); time_check_functor(functor_virtual_base); timeEndPeriod(1); _getch(); return 0; }
global function time=215 target=100000000 member function time=216 target=100000000 virtual member function time=475 target=100000000 virtual_base member function time=479 target=100000000 global member functor time=562 target=100000000 member functor time=647 target=100000000 virtual member functor time=648 target=100000000 virtual_base member functor time=689 target=100000000
WindowsXP SP3
QuadCore Q8200
DDR3 4GB
これを気にするほどクリティカルな処理を書いたことはないでござる