Вы можете использовать профилировщик Dev Tools.
console.time('Timer name');
//do critical time stuff
console.timeEnd('Timer name');
«Имя таймера» должно быть одинаковым. Вы можете использовать несколько экземпляров таймера с разными именами.
Это, в общем, самый простой метод.
Помните также, что вам нужно будет использовать extern "C"
также для всех ваших "оболочек" методов C.
Вы почти у цели. Приставьте к автономным функциям префикс extern «C»
, чтобы отключить изменение имени компилятора C ++ .
Например:
extern "C" void *make_foo(...){
Foo *ptr = new Foo(..)
return static_cast<void *>(ptr);
}
На самом деле нет более простого способа сделать это. Вы можете использовать SWIG , чтобы перейти на другой язык с определяемыми пользователем типами, которые представляют собой нечто большее, чем совокупность данных, но при преобразовании в C вам придется использовать идею объектов C.
Вы можете использовать Verrazano / Fetter для создания привязок CFFI для кода C ++. Но для этого требуется GCC-XML, и я не уверен в его переносимости.
Если возможно, пусть ваши классы будут производными от структуры. Затем вы можете использовать указатели на эту структуру в коде C:
// C++ code
extern "C" struct Cfoo {};
extern "C" struct Cbar {};
class foo : public Cfoo {};
class bar : public Cbar {};
// C API
extern "C" {
struct Cfoo;
struct Cbar;
}
Это не совсем ошибка, однако gcc, по крайней мере, предупреждает о преобразовании между указателями с разными типами.
void foo (void) {
struct Cfoo * pf;
struct Cbar * pb;
pf = pb; // gcc warns
}
Если вы не можете наследовать, используйте аналогичную идею, но у вас есть структура C хранит указатель на объект C ++ и снова просто объявляет структуры в C API:
// C++ code
class foo {};
class bar {};
extern "C" struct Cfoo { foo * pFoo; };
extern "C" struct Cbar { bar * pBar; };
// C API
extern "C" {
struct Cfoo;
struct Cbar;
}
Недостатком здесь является то, что необходимо позаботиться о времени жизни объектов Cfoo и Cbar.