Standalone C++ example: measure ONNX loading time#
This page documents examples/load_onnx_time, a self-contained CMake
project that benchmarks ONNX model loading using the standard onnx
C++ library (protobuf-based). It is intended as a reference comparison
against the Standalone C++ example: load an ONNX file with onnx_light.
Step 1 – Obtain the standard ONNX C++ library#
Option A – system package (Ubuntu / Debian):
sudo apt-get install -y libonnx-dev libprotobuf-dev
On Windows via vcpkg:
vcpkg install onnx
Option B – build from source (explicit):
Set ONNX_GIT_TAG to the desired git tag or branch. The script pre-clones
onnx, then cmake builds onnx and all its transitive dependencies (protobuf,
abseil, utf8_range, …) inline via FetchContent — no separate protobuf
install step is needed:
ONNX_GIT_TAG=v1.17.0 bash examples/load_onnx_time/build.sh
On Windows:
set ONNX_GIT_TAG=v1.17.0
examples\load_onnx_time\build.bat
Option C – automatic (no variables needed):
The helper script probes for the onnx CMake package at startup. If not found,
it automatically switches to a from-source build. The onnx git tag is derived
from the Python onnx package in site-packages (import onnx) when
available, falling back to ONNX_DEFAULT_GIT_TAG (default v1.17.0).
All transitive dependencies are handled by cmake automatically.
# Just run; the script figures out what to build
bash examples/load_onnx_time/build.sh
The onnx source is pre-cloned to build/load-onnx-time-lib/onnx-src.
Subsequent invocations reuse the existing clone and skip the git step.
Step 2 – Build the example#
When using the system onnx library directly with CMake:
cmake -S examples/load_onnx_time -B build-load-onnx-time \
-DCMAKE_BUILD_TYPE=Release
cmake --build build-load-onnx-time
To build onnx from source (cmake fetches it automatically), pass
ONNX_GIT_TAG and optionally point FETCHCONTENT_SOURCE_DIR_ONNX at a
pre-cloned source tree to skip the download:
cmake -S examples/load_onnx_time -B build-load-onnx-time \
-DCMAKE_BUILD_TYPE=Release \
-DONNX_GIT_TAG=v1.17.0 \
-DFETCHCONTENT_SOURCE_DIR_ONNX=/path/to/onnx-src
cmake --build build-load-onnx-time
Or use the helper scripts (fully automatic):
bash examples/load_onnx_time/build.sh
examples\load_onnx_time\build.bat
The helper scripts build the executable under build/load-onnx-time-example
(build\load-onnx-time-example\Release on Windows with a multi-config
generator).
Step 3 – Run the example#
The optional second argument controls the number of timed iterations. When omitted, the example runs five load passes.
./build-load-onnx-time/load_onnx_time path/to/model.onnx 10
When using the helper script defaults:
./build/load-onnx-time-example/load_onnx_time path/to/model.onnx 10
Example output:
Loaded: path/to/model.onnx
File size (MB) : 12.345
Iterations : 10
Num threads : 1
Total load (ms) : 123.456
Average load (ms): 12.346
Min load (ms) : 11.876
Max load (ms) : 13.420
IR version : 9
Producer name : my_framework
Graph name : my_graph
Nodes : 42
Inputs : 2
Outputs : 1
Initializers : 10
CMakeLists.txt#
The example CMake project tries find_package(ONNX) first (system package).
When not found, it falls back to FetchContent to build onnx and all its
transitive dependencies (protobuf, abseil, utf8_range, …) inline:
cmake_minimum_required(VERSION 3.15)
project(load_onnx_time LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(protobuf CONFIG QUIET)
if(NOT TARGET protobuf::libprotobuf)
find_package(Protobuf QUIET)
endif()
find_package(ONNX QUIET)
if(NOT TARGET onnx)
if(NOT DEFINED ONNX_GIT_TAG)
set(ONNX_GIT_TAG "v1.17.0")
endif()
if(NOT DEFINED ONNX_GIT_URL)
set(ONNX_GIT_URL "https://github.com/onnx/onnx.git")
endif()
set(ONNX_ML ON CACHE BOOL "" FORCE)
set(ONNX_BUILD_TESTS OFF CACHE BOOL "" FORCE)
include(FetchContent)
FetchContent_Declare(onnx
GIT_REPOSITORY "${ONNX_GIT_URL}"
GIT_TAG "${ONNX_GIT_TAG}"
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(onnx)
endif()
add_executable(load_onnx_time main.cc)
target_compile_definitions(load_onnx_time PRIVATE ONNX_ML=1)
target_link_libraries(load_onnx_time PRIVATE onnx onnx_proto)
main.cc#
The program opens the ONNX file with std::ifstream, parses it with
onnx::ModelProto::ParseFromIstream, measures each iteration with
std::chrono::steady_clock, and prints aggregate timing statistics
together with a short model summary.
Key API types#
onnx::ModelProtoTop-level ONNX model container from the standard protobuf-based onnx library. Loaded via
ParseFromIstream.onnx::GraphProtoGraph container accessed via
onnx::ModelProto::graph().
See also#
Standalone C++ example: load an ONNX file with onnx_light – standalone example that loads a model with the onnx_light C++ API (no protobuf dependency) and reports timing.