Это не меняет способ вызова функции.Вероятно, не очень полезно, если вы хотите иметь возможность профилировать каждую функцию.
static inline int real_function() {
// previous contents of function(), with no tic or toc
}
int function() {
tic();
int r = real_function();
toc();
return r;
}
Как и все остальные говорят: используйте профилировщик, это сэкономит вам много усилий в долгосрочной перспективе.Как они не говорят: если у вашей платформы есть такая.
Если ее нет, то проще всего было бы сказать (как правило кодирования), что функции должны иметь только одну точку выхода, и этот выходточка должна быть через ваш макрос.Затем вы можете вручную оборудовать все свои функции кодом при входе и выходе.Устаревшие функции с множественными возвратами можно свернуть, как указано выше.
Также имейте в виду, что когда вы делаете что-то подобное, ваш компилятор может вас испортить.Вы могли бы написать это:
tic();
do_something();
int i = something_else();
toc();
return i;
Если компилятор определит, чтоthing_else не имеет побочных эффектов, то даже несмотря на то, что somebody_else занимает значительное время, он может превратить код в это:
tic();
do_something();
toc();
return something_else();
А данные вашего профиля будут недооценивать время, потраченное на вашу функцию.Еще одна причина, по которой так хорошо иметь настоящий профилировщик - он может взаимодействовать с компилятором.