for 循环中的 If 和Continue 语句

2023-12-25

我有一个forMatlab 中的循环,for 循环内的所有代码都包含在if陈述。例如 :

for p = 1:length(array)
    if array(p) == 1 %// Test positive for condition    
        %// Generic code here that
        %// Only executes if p == 1 
    end;                  
end; 

使用以下方法进行平等测试是否更快if语句,如果 true 则执行内部代码,或者,测试不等式,然后使用 continue 语句,例如:

for p = 1:length(array)
    if array(p) ~= 1 %// Test negative for condition
        continue;   %// Skip if negative
    end;   
    %// Generic code here that
    %// Only executes if p == 1
end; 

或者,无论哪种方式都没有区别,即在执行时优化为相同的结果?

由于它只是一个微观优化,所以并不是非常重要 - 但我很想知道!

编辑:有趣的是,在按照建议分析代码后,后者似乎是分数地更快 - 如果有人愿意解释那就太好了! (毕竟,最多是相同的逻辑,但需要执行额外的指令)


理论上,您提出的两种方法之间不应该存在性能差异,因为if无论如何,每次循环都必须评估语句,但让我们仔细看看一些分析(timeit)。我在 R2014a 到 R2015b 版本上进行了一些测试。

对于每个测试,我创建一个数组p具有不同大小的相同数量的 1 和 0,并且随机化 0 和 1 的顺序。

%// Creates random zeros and ones of size n
p = mod(randperm(n),2);

对于第一次测试,我禁用 JIT 编译器 http://www.mathworks.com/matlabcentral/fileexchange/18510-matlab-performance-measurement/content/Documents/MATLABperformance/configinfo.m feature('JIT', 'off')第二个测试我启用了 JIT 编译器feature('JIT', 'on').

我用于所有版本 MATLAB 的脚本是:

function tests()
    V = ver;

    sz = round(linspace(100, 10000,100));

    hfig = figure('Position', [0 0 900 400]);

    %// Disable JIT
    feature('JIT', 'off')
    runtests(sz, 1, ['JIT Disabled ', V(1).Release]);

    %// Enable JIT
    feature('JIT', 'on')
    runtests(sz, 2, ['JIT Enabled ', V(1).Release]);

    %// Match up ylims on all plots
    ax = findall(hfig, 'type', 'axes');
    ylims = get(ax, 'ylim');
    ylims = cat(1, ylims{:});
    set(ax, 'ylim', [0, max(ylims(:,2))])
end

function out = runtests(sz, n, label)

    times1 = zeros(numel(sz), 1);
    times2 = zeros(numel(sz), 1);

    for k = 1:numel(sz)
        p = mod(randperm(sz(k)),2);
        times1(k) = timeit(@()continueit(p));
        p = mod(randperm(sz(k)),2);
        times2(k) = timeit(@()ifit(p));
    end

    subplot(1,2,n)
    plots(sz, cat(2, times1, times2))
    title(label)
end

function plots(sz, times)
    plot(sz, times * 1000)
    legend({'Continue', 'If'})
    xlabel('Size of Array')
    ylabel('Execution Time (ms)')
end

function continueit(p)
    c = 1;
    for k = 1:numel(p)
        if p(k) ~= 1
            continue;
        end

        c = c * k;
    end
end

function ifit(p)
    c = 1;
    for k = 1:numel(p)
        if p(k) == 1
            c = c * k;
        end
    end
end

    
    

R2014a

正如你在这里看到的,continueif声明有very在未打开 JIT 加速的情况下,性能类似。但是,当您打开加速(MATLAB 的默认设置)时,only the if声明似乎正在加速。的速度continue方法保持相对不变。结果,if语句会执行得更快。

这可能是由于 JIT 编译器加速了执行的指令块连续多次。通过将分支逻辑与continue在那里,您根据条件更改程序的流程,这会更改每次循环运行的指令。这显然会阻止 JIT 编译。

R2014b

与 R2014a 类似。

R2015a

与 R2014a 类似。

R2015b (新的执行引擎 http://www.mathworks.com/products/matlab/matlab-execution-engine/介绍)

不幸的是,在 R2015b 中,您似乎无法以相同的方式禁用 JIT(如果有人知道如何,请告诉我,我会更新),因此这两个图都启用了加速,但似乎新的执行引擎消除 JIT 编译器先前创建的执行时间差异。这是因为新的执行引擎能够进行JIT编译all代码(显然包括continue)

来自 MATLAB 文档:

所有 MATLAB 代码的即时编译

重新设计的 MATLAB 执行引擎对所有 MATLAB 代码使用 JIT 编译,而之前的执行引擎在某些情况下使用 JIT 编译。 JIT 编译生成本机机器级代码,该代码针对正在执行的 MATLAB 代码和特定硬件平台进行了优化。

当 MATLAB 代码被额外执行多次并且可以重用已编译的代码时,JIT 编译的性能优势最大。这种情况发生在常见情况下,例如 for 循环,或者当应用程序在 MATLAB 会话中额外运行多次且至少部分应用程序的 MATLAB 文件在后续运行之间保持不变时。

Summary

在旧版本的 MATLAB(R2015a 及更早版本)中,continue语句阻止了 JIT 加速,导致if启用 JIT 时(默认情况下)执行速度更快的版本。随着R2015b中新执行引擎的引入,all代码是 JIT 加速的,因此,差异实际上已经消失。

正如您所指出的,if声明只是barely还更快。这可能是由于以下开销造成的actually呼叫continue。从总体来看,这种差异可以忽略不计。此外,如果 for 循环的整体性能really取决于这种差异,这意味着速度contents循环的速度非常快,你的瓶颈是for循环本身,你应该考虑向量化你的代码(即,如果我放一个magic(3)在我的内心呼唤for循环而不是这里显示的简单乘法,差异完全消失)。

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

for 循环中的 If 和Continue 语句 的相关文章

  • 了解 Matlab 中的 DEL2 函数以便用 C++ 对其进行编码

    为了用 C 编写 DEL2 matlab 函数 我需要了解该算法 我已经成功地为不在边界或边缘上的矩阵元素编写了函数 我已经看过几个有关它的主题 并通过输入 edit del2 或 type del2 来阅读 MATLAB 代码 但我不明白
  • aspx页面中的if语句

    我想在我的网站上编写一个基本的 if 语句 以根据变量是否设置为 true 来显示项目 1 或项目 2 我对 NET 不太熟悉 需要一些关于如何让 if 语句在 aspx 页面上工作的基本结构的帮助 如果目的是显示或隐藏页面的一部分 那么您
  • MATLAB:MEX 矩阵除法给出的结果与 m 文件不同

    我使用 MATLAB 的编码器工具创建了矩阵指数函数的 MEX 版本 以在另一组函数中使用 问题是 MEX 版本给出的结果与原始 m 文件不同 经过调试 我认为这是因为MEX文件和m文件没有做相同的矩阵除法 或者 MEX 文件首先就有问题
  • MATLAB 中的内存映射文件?

    我决定使用 memmapfile 因为我的数据 通常为 30Gb 到 60Gb 太大 无法放入计算机内存中 我的数据文件由两列数据组成 对应于两个传感器的输出 并且它们采用 bin 和 txt 格式 m memmapfile G E Str
  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 浏览器如何异步执行Javascript并渲染

    这是jsfiddle上的代码
  • AtomicInteger 实现和代码重复

    警告 问题有点长 但分隔线以下的部分仅供好奇 Oracle 的 JDK 7 实现原子整数 http docs oracle com javase 7 docs api java util concurrent atomic AtomicIn
  • CoreAnimation 性能分析 - CAReplicatorLayer 与 CAShapeLayer

    我正在制作一个依赖 CoreAnimation 的应用程序 它有一个 CAReplicatorLayer 和一个 CAShapeLayer 作为子层 当进行 12 次复制 然后对路径进行动画处理 在 touchMoved 上更改它 时 一旦
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • Java中精确的时间测量

    Java 提供了两种获取当前时间的方法 System nanoTime and System currentTimeMillis 第一个给出的结果以纳秒为单位 但实际精度比这要差得多 许多微秒 JVM 是否已经为每台特定机器提供了最佳的价值
  • 这个for循环是什么意思? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions for S
  • 为什么对本地列表求和比用“GHC -O2”对教会编码列表求和慢?

    为了测试教会编码的列表如何针对用户定义的列表和本机列表执行 我准备了 3 个基准测试 用户定义的列表 data List a Cons a List a Nil deriving Show lenumTil n go n Nil where
  • zk 与 gwt zk 请求太多

    您好 我正在尝试比较 zk 和 gwt 的性能 在我的比较中 如果框架本身将一些代码转换为js 那么我自己无法编写任何javascript 如get 但我无法自己编写js 在以上述方式编写代码时 几乎所有在浏览器上完成的操作都会将请求发送到
  • 我应该如何获取 IEnumerable 的长度? [复制]

    这个问题在这里已经有答案了 我正在编写一些代码 然后去获取 IEnumerable 的长度 当我写的时候myEnumerable Count 令我惊讶的是 它没有编译 看完之后IEnumerable Count 和 Length 之间的区别
  • 当我使用并行代码时,为什么我的计算机没有显示加速?

    所以我意识到这个问题听起来很愚蠢 是的 我使用的是双核 但我尝试了两个不同的库 Grand Central Dispatch 和 OpenMP 并且当使用 clock 来对带有和不带有使平行的话 速度是一样的 根据记录 他们都使用自己的并行
  • 什么是粗网格搜索和细网格搜索?

    我正在读这个答案 用于 2D 碰撞检测的四叉树的高效 且解释良好 实现 https stackoverflow com questions 41946007 efficient and well explained implementati
  • 循环中的递归算法复杂度(运行时间)

    我想了解您对如何检测以下递归算法的 T n 运行时间 的意见 Charm 是一种用于发现事务数据库中频繁闭项集的算法 频繁闭项集列表是在一组交易 tids 中多次出现的频繁项 例如面包和牛奶是经常一起购买的物品 它们是通过将索引为 i 的当
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • 如何以编程方式打开 Bootstrap 下拉菜单

    当我单击另一个下拉列表中的项目时 我试图打开 Bootstrap 下拉列表 这个想法是从第一个下拉列表中选择一个城市 然后脚本将自动打开第二个包含区域的下拉列表 并仅显示与所选城市相对应的区域 这是我的JS sidebar filter c
  • UTF-8 文本到剪贴板 C

    我一直在寻找如何带一根绳子 const char output 到剪贴板 SetClipboardData CF UNICODETEXT hMem 我尝试过 MultiByteToWideChar 但我只收到噪音和相互矛盾的声明 即您无法将
  • SQL 连接 - 对不同值的 COUNT 求和

    假设我有两个表 org 和 states orgs 是 o ID state abbr states 是 state abbr state o ID state abbr 1 CT 2 OH 3 OH state abbr state CT
  • BASH 语法错误接近意外标记“完成”[重复]

    这个问题在这里已经有答案了 知道问题出在哪里吗 我的代码是 bin bash while do echo Press CTRL C to stop sleep 1 done 将其另存为 sh 并运行 bash file sh CentOS
  • 如果没有创建该类的对象,该类的静态成员是否会占用内存?

    假设我有一个类 并且其中有一个静态成员 但我不创建该类型的任何对象 静态变量会占用内存吗 如果它会被占用 那么将它放在一个类中还有什么意义呢 No 静态成员不属于类的实例 它们甚至不会增加实例和类大小 1 位 struct A int i
  • 谷歌 php api 应用程序引擎上的 PHP 致命错误

    当我尝试实现 Google PHP API 时 我的应用程序引擎出现问题 它在curl 文件 Goolge IO php 中给了我一个致命错误 它是提供的库文件之一https code google com p google api php
  • 保存动作之间的状态

    我想请教一下解决办法 例如我们有一个页面 我有一个链接到该页面的另一个操作 我希望能够保存页面上输入的数据值 例如 我转到另一个页面输入数据然后返回 就像巫师一样 但问题是我们可以从不同的页面进行操作 并且需要保存多种数据类型 明白了吗 有
  • 时间顺序(小时)

    I tried seq from as POSIXct 2012 1 1 0 tz UTC to as POSIXct 2012 1 3 23 tz UTC by hour 但我只得到最后一天的 1 小时 0 00 00 而不是 24 小时
  • 错误:[Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序

    将 NET 连接到 sybase 服务器时 我收到以下错误消息 Microsoft ODBC 驱动程序管理器 未找到数据源名称且未指定默认驱动程序 这以前工作正常 具有相同细节的系统 DSN 可以工作 并且通过 vs net 的数据连接也可
  • 在当前队列上同步调度

    我知道你可能会觉得这是一个奇怪的问题 但我刚刚学习 GCD 我想完全理解它的所有方面 所以这里是 是否有任何理由在当前队列上分派任务同步 例如 dispatch queue t concurrentQueue dispatch get gl
  • Vue JS with bootstrap carousel如何将图像传递到carousel

    我的要求是这样的 我从后端获取了图像列表 我想将这些图像名称传递给carousel显示图像 这是我的代码
  • 测试工具中的 Chisel 运行时错误

    This Chisel https chisel eecs berkeley edu 代码工作正常 chiselMainTest Array String backend c genHarness gt Module new Cache n
  • 使 JSpinner 只读取数字但也检测退格键

    我正在尝试制作一个仅接受数字的 JSpinner 但我也希望它能够读取 响应退格键 public class test JFrame frame JPanel panel JSpinner spinner public test frame
  • 脚本在命令行中成功执行,但未作为 cronjob 执行

    我有一个 bash 脚本 它运行一个 ruby 脚本来获取我的 Twitter feed home username twittercron bin bash cd home username twitter ruby twitter rb
  • 何时调用 SaveChanges

    假设我有类似的东西被调用Controller using var context new SqlContext context Items Add new Item item1 我应该打电话吗context SaveChanges 实体框架
  • MPRemoteCommandCenter 暂停/播放按钮未切换?

    我在 MPRemoteCommandCenter 中切换播放和暂停按钮时遇到问题 无论出于何种原因 音频和事件都将正常工作 但命令中心不会将播放按钮更改为暂停按钮 这是我的代码 void setupMPRemoteCommandCenter
  • Makefile 中的 $${HOME} 或 ${HOME} ?

    cat Makefile all echo VAR is HOME echo VAR is HOME Gives make echo VAR is home abc VAR is home abc echo VAR is HOME VAR
  • 从函数中获取经度和纬度值

    请问我如何在其函数之外获取 lat 和 lon 的值以在页面上的其他位置使用 navigator geolocation getCurrentPosition handle geolocation query handle errors f
  • 同时播放库中的视频并通过相机录制视频 - Objective c

    我正在构建一个应用程序 它可以播放库中的视频 同时使用相机录制视频 是否可以同时观看视频和录制视频 这里是链接 iPhone 媒体库中的示例 支持图像和视频here https github com yfujiki FGallery wit
  • for 循环中的 If 和Continue 语句

    我有一个forMatlab 中的循环 for 循环内的所有代码都包含在if陈述 例如 for p 1 length array if array p 1 Test positive for condition Generic code he