You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何OnnxRuntime在C++中运行速度比Python慢2-3倍?

ONNX Runtime C++版本Windows真机性能异常问题

现象描述

  • 一段依次运行3个推理会话的代码,在Mac及Mac上的Windows虚拟机(VMWare)中性能最佳,测试集运行耗时58-68秒。
  • 但在硬件规格相似的Windows真机(Intel i7 6-8核)上测试时,C++版本耗时150秒;而等效Python脚本的速度快2-3倍,性能与Mac相当。

相关代码片段

#include "onnxruntime-osx-universal2-1.13.1/include/onnxruntime_cxx_api.h"
// ...
Ort::Env OrtEnv;
Ort::Session objectNet{OrtEnv, objectModelBuffer.constData(), (size_t) objectModelBuffer.size(), Ort::SessionOptions{}}; // 共3个实例,对应每个模型

std::vector<uint16_t> inputTensorValues;
normalize(img, {aiPanoWidth, aiPanoHeight}, inputTensorValues); // 将cv::Mat图像转换为std::vector<uint16_t>

std::array<int64_t, 4> input_shape_{ 1, 3, aiPanoHeight, aiPanoWidth };

auto allocator_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_tensor_ = Ort::Value::CreateTensor(allocator_info, inputTensorValues.data(), sizeof(uint16_t) * inputTensorValues.size(), input_shape_.data(), input_shape_.size(), ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16);

const char* input_names[] = { "images" };
const char* output_names[] = { "output" };
std::vector<Ort::Value> ort_outputs = objectNet.Run(Ort::RunOptions{ nullptr }, input_names, &input_tensor_, 1, output_names, 1);

//... 后续读取输出,但上述Run步骤的速度已经比Python慢2-3倍

补充细节

  • 代码在后台工作线程运行(主线程用于GUI)
  • 使用float16格式以减少AI模型占用空间
  • 使用微软提供的原生onnxruntime dlls(v1.13.1)
  • 分别用Mingw Gcc和VC2022编译,结果相近,VC编译版本略有性能优势
  • 不希望使用GPU运行推理
  • 编译参数为/arch:AVX /openmp -O2及-lonnxruntime

内容的提问来源于stack exchange,提问作者Adriel Jr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:01:04