0

여기에 펑키 한 문제가 있습니다. 몇 가지 간단한 타이머를 사용하여 객체 생성을 벤치마킹합니다. 내 코드 기반은 프로토 타입이 아니고 완전한 프레임 워크가 될 때가 서서히 멀어지고 있습니다. 이를 위해서는 최상위 레벨에서 간단한 구조체를 초기화해야한다. 즉, 개체 초기화를 벤치마킹 할 수있는 방법을 찾을 수 없다는 것을 의미합니다. 이는 매우 중요합니다. 이상적인 세계에서는 멤버 초기화 목록에서 일반 void 함수를 호출 하시겠습니까?

, 나는의 라인을 따라 뭔가 할 수있는 :

struct Potato { 
    Potato() 
     : benchmark::start() 
     , some_int(42) 
    { 
     /* Some more stuffs */ 

     benchmark::stop(); 
    } 

    int some_int; 
}; 

당신은 아이디어를 얻을를, 나는 멤버 초기화리스트는 벤치 마크 바랍니다. 누구든지 소프트웨어 전체에서 전역 (정적) 인 객체를 사용하는 방법에 대한 팁이 있습니까? constexpr 함수를 사용하여 아무 소용이 실험했다. 또한 간단한 함수에서 객체 컬렉션을 반환 할 때 (make_tuple에서) 복사 생성자 문제가 발생합니다.

감사의 말씀 감사합니다.

답변

1

생성자가 benchmark::start() 만 호출하도록 벤치 마크에 대한 래퍼 구조체를 만든 다음 Patato의 생성자 본문에서 수동으로 중지합니다. 하지만 래퍼 인스턴스가 Patato의 첫 번째 객체인지 확인해야합니다 (C++의 멤버 초기화 순서를 이용함). 삽화 :

struct Benchmarker{ 
    Benchmarker(){ benchmark::start(); } 
}; 

struct Potato { 
    Potato() 
     : //Benchmark's ctor will be implicitly called first 
      some_int(42) 
    { 
     benchmark::stop(); 
    } 

    Benchmarker benchmark; //NOTE: Make sure its the first 
    int some_int; 
}; 
+0

니스! 고마워. 또한 흥미로운 http://stackoverflow.com/questions/17375114/c-temporary-variables-in-initilization-list를 발견했습니다. 이 둘의 혼합은 내가 믿는 트릭을 수행해야하며, 동작을 해제하기위한 일종의 정의가 있어야합니다. 좋은 날 :) – scx

+1

개인 상속도 유용 할 수 있습니다 (상속 벤치마킹의 경우.) – Jarod42

관련 문제