python - CPP 调用比 Python 接口(interface)调用慢

标签 python c++ windows dll caffe

Caffe 的 Github 页面包含一个 Windows 分支。我选择了这个分支并创建了一个 Windows DLL。它是基于 https://github.com/BVLC/caffe/blob/master/examples/cpp_classification/classification.cpp 的。 .

DLL 工作并输出正确的分类结果。但是比pyCaffe接口(interface)慢1.5-5倍。非常有趣的是,pyCaffe 接口(interface)在所有测试的计算机上使用 AlexNet 处理四张图像大约需要 1 秒。 DLL时间从1.5秒到2秒到4秒不等。

我们测量了循环前后的时间(使用Easily measure elapsed time)

template <typename Dtype> Dtype Net<Dtype>::ForwardFromTo(int start, int end)

此函数位于 https://github.com/BVLC/caffe/blob/master/src/caffe/net.cpp 中并由 CPP 和 Python 代码调用。

我们使用 Visual Studio 2013 将 Caffe 编译为 32 位程序,没有 GPU 支持

到目前为止我们已经检查过的可能的事情。

  • 编译器优化
  • 数据
  • 操作系统和计算机配置(如 CPU/内存等)
  • 我们在一次执行中进行了多次测量,因此基准测试更加稳定。
  • 我们还使用 CodeXL 分析了代码,但我没有发现任何异常,但那当然有点模糊。

最佳答案

我们得出以下结论:Caffe 使用 GLog。 GLog 有致命警告,可能看起来像这样

CHECK(a<=b) << "a must be bigger than b";

这些警告让程序崩溃并且难以捕捉。为此,我们创建了一个类来替换 GLog。它相当简单并使用 std::stringstream。谷歌做了一些聪明的事情。只要条件为真,就不会评估右侧。

https://github.com/google/glog/blob/de6149ef8e67b064a433a8b88924fa9f606ad5d5/src/windows/glog/logging.h#L569

他们使用 (void) 0 解决了这个问题。我们错过了那部分。当我想在这里发布分析数据时,我意识到 << 运算符会浪费一些时间。我们开始更仔细地查看分析数据并增加函数调用的次数,这样每个数字都会变得更大更清晰。这让我们找到了解决方案。

关于python - CPP 调用比 Python 接口(interface)调用慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37984768/

相关文章:

c++ - InnoSetup - 检查是否安装了 visual studio 2010 crt redist,如果没有则运行安装程序

c++ - .template (dot-template) 构造用法

c++ - 提示输入 CreateFile 的凭据

windows - 如何向我的 schtask 命令添加随机时间偏移量?

java - 将 java -version 的结果打印到文件 -> 为什么结果文件为空?

c++ - 如何调试 C++ 运行时错误

python - 不必要地循环遍历文件名

python - Django 过滤来自自定义聚合函数的注释

python - 为什么 'python3 -m venv myenv' 将旧版本的 pip 安装到 myenv 中,而不是我在系统上任何地方都能找到的任何版本的 pip?

python - 在colab上-class_weight导致ValueError : The truth value of an array with more than one element is ambiguous.使用a.any()或a.all()