此代码中 Matlab 与 C++ 速度比较

2024-06-24

我编写了简单的 C++ 代码并在 C++ 中对其进行了测试,然后我通过以下方式为 MATLAB 调整了相同的代码mex file_name.cpp并在 MATLAB 中运行相同的代码,该代码使用与 C++ 相同的编译器。这是代码:

int k;
for(int j = 0; j < 100;j++){
    for(int i = 0; i < 10000000; i++){
        k++;
    }
    k/=10000000
}

这是 MATLAB 代码:

double a;int j;int i;
double* k;

for(j = 0; j < 100;j++){
    for(i = 0; i < 10000000; i++){
        a = a+1;
    }
    a = a / 10000000;
}

plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
k = mxGetPr(plhs[0]);
*k = (double)a;

我为 MATLAB 编辑了这段代码,即更改为合适的类型、添加 MEX 函数等,结果在 MATLAB 中约为 900 毫秒,而在 C++ 中为 3100 毫秒。

我不明白的是两者都运行相同的代码并使用相同的编译器(在 MATLAB 中我写mex -setup在命令行中并选择 Visual Studio 编译器作为 MEX 编译器),但是 MATLAB 就在附近快 3.5 倍.

MATLAB 做了什么才能变得更快,而 C++ 没有做什么?有人可以解释一下为什么会有这么大的差异吗?我尝试过其他一些代码,在 MATLAB 中都快了 3-6 倍。

我的PC是64位Windows 7,C++使用的是Visual Studio 2010,MATLAB是R2012b。

这可能是因为我的 Visual Studio 版本吗?如果换成VS2012是不是会更快?

mex -v https://dl.dropboxusercontent.com/u/78608149/mex_v.txt输出在这里。

Thanks,


性能高度依赖于平台、操作系统、编译器等。无论 Matlab 在这种情况下做什么,它都设法找到了 VS2010 编译器没有找到的优化。我大胆猜测升级到 VS2012 不会产生实质性的变化,但我可能是错的。毕竟,它是一个不同的编译器。

我承认这有点令人惊讶,但请检查您的编译标志并尝试使用不同的配置进行分析。如果您安装的 Matlab 是 32 位的,这也可能会产生影响。

您的代码中也可能存在细微的差异,可能细微到您可能没有注意到。您的代码可能会链接到其他库,这些库的性能也可能存在很大差异。

这里的教训是,很难确定exactly为什么一件事比另一件事表现得更好。

编辑:您已经提到代码是为了调试而编译的。这只会进一步增加编译器输出内容的变化,因为激活调试选项也可能会关闭其他优化,并且每个编译器对于哪种调试信息重要且值得保留在代码中都有不同的想法。

我建议关闭所有调试选项以获得更一致的输出。我还建议确保您使用类似的优化级别进行编译,可能是尽可能最高的优化级别,也可能根本不使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

此代码中 Matlab 与 C++ 速度比较 的相关文章

  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 外部剃刀视图看不到外部模型

    我对外部剃刀视图有疑问 在我的项目中 我有主 mvc Web 程序集和动态加载的外部类库程序集 来自 DB 及其自己的控制器 视图和模型 这些程序集在运行时不会直接引用和加载 我能够通过为控制器创建自定义控制器工厂 为视图创建自定义虚拟路径
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • matlab:使用 GPU 保存图形中的图像

    我使用 matlab 渲染复杂的网格 使用 trimesh 材质 camlight 视图 不需要将其显示给用户 只需获取渲染图像即可 这在另一个问题中讨论过 https stackoverflow com questions 4137628
  • Visual Studio 2010:嵌入互操作类型

    我在上找到了一些关于此的信息斯科特 汉塞尔曼斯博客 http www hanselman com blog CLRAndDLRAndBCLOhMyWhirlwindTourAroundNET4AndVisualStudio2010Beta1
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 内存不足异常

    我正在使用 C 和 asp net 开发一个网络应用程序 我一直收到内存不足的异常 该应用程序的作用是从数据源读取一堆记录 产品 可能是数百 数千 通过向导中的设置处理这些记录 然后使用处理的产品信息更新不同的数据源 虽然有多个 DB 类
  • 嘲笑会员用户

    我目前正在开发一个 asp net mvc 2 应用程序 它使用默认的 SqlMembershipProvider 进行身份验证 我已经实现了一个控制器方法 通过调用读取当前用户的 ProviderUserKeyMembership Get
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • 在 R 中提取栅格的最快方法(提高我的可重现代码的时间)

    我想知道我是否已最大化提取栅格中某个点周围缓冲区域平均值的速度 本地的性能可以进一步提高吗 I use parallel mclapply已经 我知道我可以通过在集群上设置和运行它来获得进一步的收益 使用集群或获得更多的CPU不是我正在寻找
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState
  • 如何从与 C# lambda 集成(而非代理集成)的 Amazon API 网关获取正确的 http 状态代码?

    我正在使用 C lambda 与 API 网关集成 我希望 API 网关返回正确的错误代码 例如 400 404 500 等 API网关模块tf文件 provider aws version lt 2 70 0 region var aws
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • jQuery 承诺是否符合 Promises/A+

    我读过了本文 http thewayofcode wordpress com 2013 01 22 javascript promises and why jquery implementation is broken 这是基于著名的多梅尼
  • Eclipse 无法识别智能卡库

    从 Sun 的 jdk 1 8 迁移到 Openjdk12 后 Eclipse 无法识别 javax smartcardio 的整个库 例如 import javax smartcardio Card 会导致错误 Card cannot b
  • 如何有条件地使用 Perl 中的模块?

    我想在 Perl 中做这样的事情 Module1 ReportHashFile1 ReportHashFile1 pm Module2 ReportHashFile2 ReportHashFile2 pm if Condition1 use
  • 从 `.` `data.table` 导入,以便 lintr 识别它

    跑步时lintr https github com jimhester lintr在 R 函数上使用data table我收到以下警告 warning no visible global function definition for Di
  • 带有 dcast data.table 的宽格式[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想转换这样的表 set seed 1 mydata lt data frame ID rep 1 4 each 3 R rep
  • 将 IIFE 的公共成员分配给变量与返回对象有什么区别

    我最近查看了大量 JavaScript 代码 并且看到了使用分配 IIFE 的 公共 属性的两种不同方法 第一个是创建一个变量并将该变量分配给 IIFE 内部的属性 如下所示 var public1 function var foo Foo
  • 在 Microsoft Graph 中查找 Azure AD 架构扩展 AppId

    如果通过 Azure AD Connect 同步自定义属性 则会对 Azure AD 进行架构扩展 并且在 Azure AD 中创建一个关联的应用程序 其中包含DisplayName 租户架构扩展应用程序 不幸的是 这些扩展名都是唯一的 并
  • 使用 R 将逗号分隔的列表值转换为稀疏矩阵

    在新的数据结构中 每个segmentId应该变成一个列名 每个 personId 仍应有一行 id SegmentId 单元格是分段 ID 在逗号分隔列表中出现的次数的计数 下面的例子 按原样 我正在尝试以这种形式转换数据 PersonID
  • Android - 通过更新进度栏下载文件

    我的 Dropbox 帐户中有多个文件 我成功下载文件 但我想显示带有百分比的进度条 以便在下载所有文件时 进度条完成 我正在使用 AsyncTask 下载文件 这是我的代码 public void onPreExecute mDialog
  • 数据结构格式(YAML 或其他)的往返解析保留注释,用于编写配置

    我一直在多个应用程序中使用 YAML 作为配置文件格式 一切都很顺利 除了一件事 当我的程序需要在 YAML 配置文件中写入 修改配置变量时 它会通过加载和转储整个文件来破坏格式和注释 结构 嗯 实际上 YAML 还有另一个问题 大多数用户
  • 在 C# 中设置树节点的父节点的正确方法?

    我正在研究一棵定制树 每个节点 BindingNode 是我对它们的称呼 都包含一个 BindingNodeCollection 它实现收藏 http msdn microsoft com en us library 92t2ye13 as
  • Android sqlite 日志报告和 db.close()

    日志报告数据库或游标未关闭 我基本上有一个带有自定义表面视图的活动 并使用处理程序向活动报告 当我收到消息时 我会显示一个警报对话框并更新数据库 private Handler handler new Handler public void
  • QImage 转换为 QML

    我的应用程序通过网络接收 JPEG 实时流 每秒 16 帧 直播流应使用 QML 显示 接收部分是用C 编写的 所有UI都是用QML编写的 如何将图像数据输入 QML 窗口 我已经研究过如何显示 QImage 但还没有找到解决方案 实现 Q
  • 当恰好有一个选项非空时执行某项操作

    如果两个选项之一非空 我想计算一些东西 显然这可以通过模式匹配来完成 但是有更好的方法吗 o1 o2 match case Some o None gt Some compute o case None Some o gt Some com
  • project.parent.name 和parent.name 之间的区别以及在pom.xml 中使用finalName

    对线程的研究具有显式 FinalName 的 Maven 将无法正常工作 https stackoverflow com questions 40336878 maven with an explicit finalname wont wo
  • ASP.NET锁定线程的方法

    我正在使用 C 开发 ASP NET 表单 Web 应用程序 我有一种为客户创建新订单的方法 它看起来与此类似 private string CreateOrder string userName Fetch current order O
  • C++ for 循环和基于范围的循环性能

    我读到基于范围的循环在某些编程语言上具有更好的性能 C 中也是这样吗 例如 int main vector
  • 将 RenderTargetBitmap 转换为 System.Drawing.Image

    我有 3D WPF 视觉对象 我想将其传递到 Excel 单元格 通过剪贴板缓冲区 对于 普通 BMP 图像 它可以工作 但我不知道如何转换RenderTargetBitmap 我的代码如下所示 System Windows Media I
  • 如何在 C# 中检查对象是否可序列化

    我正在寻找一种简单的方法来检查 C 中的对象是否可序列化 正如我们所知 您可以通过实现以下方式使对象可序列化可序列化接口或通过放置 可序列化 在班级中名列前茅 我正在寻找一种快速的方法来检查这一点 而不必反映该类来获取其属性 使用界面会很快
  • 此代码中 Matlab 与 C++ 速度比较

    我编写了简单的 C 代码并在 C 中对其进行了测试 然后我通过以下方式为 MATLAB 调整了相同的代码mex file name cpp并在 MATLAB 中运行相同的代码 该代码使用与 C 相同的编译器 这是代码 int k for i