Add compiler timing diagnostics to mjsCompiler, printed by compile.cc

For example, `compile mujoco_menagerie/robotis_op3/scene.xml` now outputs

```
Compile 1 (cold cache):
  total:      317.2 ms
  assets:     284.8 ms (wall clock)
    load:     616.1 ms
    hull:      26.4 ms
    poly:     137.8 ms
    inert:    177.8 ms
    bvh:      568.2 ms
    octr:       1.6 ms
    tex:       25.3 ms
  other:       32.4 ms

Compile 2 (warm cache):
  total:       79.9 ms
  assets:      54.5 ms (wall clock)
    load:     888.5 ms
    hull:       0.0 ms
    poly:       0.0 ms
    inert:      0.0 ms
    bvh:        0.0 ms
    octr:       0.0 ms
    tex:       21.4 ms
  other:       25.3 ms
```

PiperOrigin-RevId: 917850214
Change-Id: Iaec86230bec0faf2e47820e20cbff61de5b2621e
This commit is contained in:
Yuval Tassa
2026-05-19 08:27:35 -07:00
committed by Copybara-Service
parent f712eed4ce
commit bdf00966f9
23 changed files with 309 additions and 43 deletions
+17
View File
@@ -5612,6 +5612,7 @@ struct MjSpec {
std::unique_ptr<MjSpec> copy();
mjSpec* get() const;
void set(mjSpec* ptr);
emscripten::val timer() const;
mjString modelname() const {
return (ptr_ && ptr_->modelname) ? *(ptr_->modelname) : "";
}
@@ -8402,6 +8403,10 @@ MjSpec::~MjSpec() {
mjSpec *MjSpec::get() const { return ptr_; }
void MjSpec::set(mjSpec *ptr) { ptr_ = ptr; }
emscripten::val MjSpec::timer() const {
return emscripten::val(emscripten::typed_memory_view(9, mjs_getTimer(ptr_)));
}
std::unique_ptr<MjModel> mj_loadXML_wrapper_1(std::string filename) {
char error[1000];
mjModel *model = mj_loadXML(filename.c_str(), nullptr, error, sizeof(error));
@@ -10911,6 +10916,17 @@ EMSCRIPTEN_BINDINGS(mujoco_bindings) {
.value("mjBUTTON_LEFT", mjBUTTON_LEFT)
.value("mjBUTTON_RIGHT", mjBUTTON_RIGHT)
.value("mjBUTTON_MIDDLE", mjBUTTON_MIDDLE);
enum_<mjtCTimer>("mjtCTimer")
.value("mjCTIMER_TOTAL", mjCTIMER_TOTAL)
.value("mjCTIMER_ASSETS", mjCTIMER_ASSETS)
.value("mjCTIMER_TEXTURE", mjCTIMER_TEXTURE)
.value("mjCTIMER_MESH_LOAD", mjCTIMER_MESH_LOAD)
.value("mjCTIMER_MESH_HULL", mjCTIMER_MESH_HULL)
.value("mjCTIMER_MESH_POLYGON", mjCTIMER_MESH_POLYGON)
.value("mjCTIMER_MESH_INERTIA", mjCTIMER_MESH_INERTIA)
.value("mjCTIMER_MESH_BVH", mjCTIMER_MESH_BVH)
.value("mjCTIMER_MESH_OCTREE", mjCTIMER_MESH_OCTREE)
.value("mjNCTIMER", mjNCTIMER);
enum_<mjtCamLight>("mjtCamLight")
.value("mjCAMLIGHT_FIXED", mjCAMLIGHT_FIXED)
.value("mjCAMLIGHT_TRACK", mjCAMLIGHT_TRACK)
@@ -12371,6 +12387,7 @@ EMSCRIPTEN_BINDINGS(mujoco_bindings) {
.property("nupdate", &MjSolverStat::nupdate, &MjSolverStat::set_nupdate, reference());
emscripten::class_<MjSpec>("MjSpec")
.constructor<const MjSpec &>()
.property("timer", &MjSpec::timer)
.property("comment", &MjSpec::comment, &MjSpec::set_comment, reference())
.property("compiler", &MjSpec::compiler, reference())
.property("element", &MjSpec::element, reference())
+1
View File
@@ -176,6 +176,7 @@ _SKIPPED_GETTERS_AND_SETTERS: tuple[str, ...] = (
"mjs_getDouble",
"mjs_getPluginAttributes",
"mjs_getString",
"mjs_getTimer",
"mjs_getUserValue",
"mjs_setBuffer",
"mjs_setDouble",
+4
View File
@@ -381,6 +381,9 @@ def build_struct_header(
builder.line(f"{s}* get() const;")
builder.line(f"void set({s}* ptr);")
if w == "MjSpec":
builder.line("emscripten::val timer() const;")
# field declarations
for field in wrapped_fields:
if field.declaration and field not in member_inits:
@@ -598,6 +601,7 @@ def _build_struct_bindings(
#undef X_ACCESSOR""".lstrip())
elif w == "MjSpec":
builder.line(".constructor<const MjSpec &>()")
builder.line('.property("timer", &MjSpec::timer)')
elif w == "MjvScene":
builder.line(".constructor<MjModel *, int>()")
builder.line(".constructor<>()")
+4
View File
@@ -715,6 +715,10 @@ MjSpec::~MjSpec() {
mjSpec *MjSpec::get() const { return ptr_; }
void MjSpec::set(mjSpec *ptr) { ptr_ = ptr; }
emscripten::val MjSpec::timer() const {
return emscripten::val(emscripten::typed_memory_view(9, mjs_getTimer(ptr_)));
}
std::unique_ptr<MjModel> mj_loadXML_wrapper_1(std::string filename) {
char error[1000];
mjModel *model = mj_loadXML(filename.c_str(), nullptr, error, sizeof(error));