2008.11.26 17:53 연구실/Boost.org

바인드 성능 테스트 : update 2014.06.12

Bind는 언제 사용 해야 하는가?

bind 자체는 성능 향상이 아닌, 생산성 향상을 위한 유틸리티라고 나는 생각한다. 

왜냐하면 bind로 만든 콜백 등은 더 많은 수행 자원을 사용하기 때문이다. 60 frame 갱신 프로그램에서 10,000 객체가 각각 20번씩 호출 될 때, 초당 12,000,000번 호출 되는데, 바인딩 함수 호출만으로, 프레임 하락이 생긴다.

그러므로 이벤트 발생에 따른 콜백등에 사용하는게 제일 좋다.

테스트 환경

VS2012, Release이며, 결과는 32bit 실행 파일

테스트 코드


총평

테스트 환경도 쓸걸 그랬다. 그리고 테스트 코드를 좀 더 간결하게 할걸 그랬다. 왜냐하면, 테스트 환경이나, 테스트 코드 자체에 문제가 있나 없나 확인을 더 빨리 할 수 있기 때문이다. 그리고 쓸때 없는 말은 하지 말걸 그랬다. 왜냐하면, 정보 전달이 제대로 되기 힘들기 때문이다.

신고
posted by 농사를 짓는 게임 프로그래머 최익필
TAG ,

댓글을 달아 주세요

  1. Favicon of http://ikpil.com 농사를 짓는 게임 프로그래머 최익필 2009.04.16 23:16 신고  Addr  Edit/Del  Reply

    지금은 boost::lambda 에 쏠리고 있다.. 멋진 경험이였다.

  2. 나그네 2014.06.08 10:56 신고  Addr  Edit/Del  Reply

    안녕하세요. 포스트을 잘 보았습니다. 고맙습니다. ^^

    올려주신 코드을 돌려봤는데,
    저와 다른 결과가 나와서 글을 남깁니다.

    환경은 msvc2010, x64, release 입니다.

    ------------------------------------------------------
    올린 코드 그대로 돌렸더니, 결과는 아래와 같았습니다.
    (boost::progress_display는 제거하고 했습니다)
    ------------------------------------------------------
    test()
    elapsed : 1.75

    CFunc()
    elapsed : 0 <--- ????

    TemplateFunObject<CFunc>()
    elapsed : 0 <--- ????

    boost::bind(stand)
    elapsed : 1.735

    boost::bind(member)
    elapsed : 2.027

    test의 pointer()
    elapsed : 1.737

    boost::boost::function
    elapsed : 2.607
    ------------------------------------------------------

    CFunc()와 TemplateFunObject<CFunc>()에 결과값이 이상하여
    아래와 같이 코드을 수정했습니다.
    (이유을 짐작해보면, 컴파일러 최적화 때문이 아닌가 싶습니다)

    void test( void )
    {
    volatile int b = 0; //<- volatile 키포인트
    for( int i = 0; i < 1000; ++i ) //loop count을 낮춘 이유와 중첩 for문을 제거한 이유 : 시간이 너무 오래 걸리네요
    {
    b += 10;
    b += 1;
    b -= 1;
    b -= 10;
    b = i;
    }
    }

    ...

    int main( void )
    {
    ...
    func_elapsed_time<100> 로 변경 : 이유 : 시간이 너무 오래 걸리네요
    ...
    }

    결과는 다음과 같았습니다.
    ------------------------------------------------------
    test()
    elapsed : 2.248

    CFunc()
    elapsed : 2.249

    TemplateFunObject<CFunc>()
    elapsed : 2.245

    boost::bind(stand)
    elapsed : 2.272

    boost::bind(member)
    elapsed : 2.274

    test의 pointer()
    elapsed : 2.262

    boost::boost::function
    elapsed : 2.246
    ------------------------------------------------------

    저는 성능 차이가 발생하지 않았습니다.