C++ 或呼叫数和响铃缓冲区。当然,您不会从所有调用中得到结果,但这两个调用应该可以帮助您缩小占用大部分时间的函数范围。哦,如果你能以某种方式捕获函数调用,那么你就可以使其自动执行。 void a() sleep ( rand() % 10 + 10 ) v

C++ 或呼叫数和响铃缓冲区。当然,您不会从所有调用中得到结果,但这两个调用应该可以帮助您缩小占用大部分时间的函数范围。哦,如果你能以某种方式捕获函数调用,那么你就可以使其自动执行。 void a() sleep ( rand() % 10 + 10 ) v,c++,c,profiling,C++,C,Profiling,或呼叫数和响铃缓冲区。当然,您不会从所有调用中得到结果,但这两个调用应该可以帮助您缩小占用大部分时间的函数范围。哦,如果你能以某种方式捕获函数调用,那么你就可以使其自动执行。 void a() sleep ( rand() % 10 + 10 ) void b() sleep ( rand() % 14 + 2 ) main for (1 .. 100) a() b() // code profile.cpp : Defines the entry point

或呼叫数和响铃缓冲区。当然,您不会从所有调用中得到结果,但这两个调用应该可以帮助您缩小占用大部分时间的函数范围。哦,如果你能以某种方式捕获函数调用,那么你就可以使其自动执行。
void a()
  sleep ( rand() % 10 + 10 )

void b()
  sleep ( rand() % 14 + 2 )

main
  for (1 .. 100)
    a()
    b()
// code profile.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

class cProfile
{
public:
    // construct profiler for a particular scope
    // call at begining of scope to be timed
    // pass unique name of scope
    cProfile( const char* name )
    {
        myName = string( name );
        QueryPerformanceCounter( (LARGE_INTEGER *)&myTimeStart );
    }
    // destructor - automatically called when scope ends
    ~cProfile();

    // constructor - produces report when called without parameters
    cProfile();


private:
    typedef accumulator_set<__int64, stats<tag::variance(lazy)> > acc_t;
    static map < string, acc_t > myMap;
    string myName;
    __int64 myTimeStart;
};
map < string, accumulator_set<__int64, stats<tag::variance(lazy)> > > cProfile::myMap;


cProfile::~cProfile()
{
    __int64 t=0;
    QueryPerformanceCounter( (LARGE_INTEGER *)&t );
    t -= myTimeStart;


    map < string, acc_t >::iterator p = myMap.find( myName );
    if( p == myMap.end() ) {
        // this is the first time this scope has run
        acc_t acc;
        pair<string,acc_t > pr(myName,acc);
        p = myMap.insert( pr ).first;
    }
    // add the time of running to the accumulator for this scope
    (p->second)( t );

}
// Generate profile report
cProfile::cProfile()
{
    __int64 f;
    QueryPerformanceFrequency( (LARGE_INTEGER *)&f );

    printf("%20s Calls\tMean (secs)\tStdDev\n","Scope");
    for( map < string, accumulator_set<__int64, stats<tag::variance(lazy)> > >::iterator p = myMap.begin();
        p != myMap.end(); p++ )
    {
        float av = mean(p->second) / f;
        float stdev = sqrt( ((double) variance(p->second))  ) / f;
        printf("%20s %d\t%f\t%f\n",p->first.c_str(),
            boost::accumulators::count(p->second), av, stdev);
    }
}
void a()
{
    cProfile profile("a"); 

    Sleep ( rand() % 10 + 10 );
}
void b()
{
    cProfile profile("b");

    Sleep ( rand() % 20 + 5 );
}


int _tmain(int argc, _TCHAR* argv[])
{
    for (int k=1;k<=100;k++) {
        a();
        b();
    }

    cProfile profile_report;

    return 0;
}
       Scope Calls      Mean (secs)     StdDev
           a 100        0.014928        0.002827
           b 100        0.015254        0.005671
#include <stdio.h>
#include <stdlib.h>

void __cyg_profile_func_enter(void *fn, void *call)
    __attribute__ ((no_instrument_function));
void __cyg_profile_func_exit(void *fn, void *call)
    __attribute__ ((no_instrument_function));

void __cyg_profile_func_enter(void *fn, void *call) {
  printf("Enter %x,%x\n",fn,call);
}
void __cyg_profile_func_exit(void *fn, void *call) {
  printf("Exit %x,%x\n",fn,call);
}

int foo(int i) {
  printf("inside foo\n");
}

int main(int argc, char *argv[]) {
  printf("inside main 1\n");
  foo(123);
  printf("inside main 2\n");
  exit(0);
}