0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在STM32中的func1和func2函数,哪个效率高?

玩转单片机与嵌入式 来源:玩转单片机与嵌入式 2023-11-08 09:20 次阅读

先看下面的两个函数:

函数1


int array[10240][10240];


int func1()
{
    int x,int y;


    for(x=0;x<10240;x++)
    {
        for(y=0;y<10240;y++)
        {
            array[x][y]=1234;
        }
    }
}

函数2

intarray[10240][10240];


int func2()
{
    int x,int y;


    for(x=0;x<10240;x++)
    {
        for(y=0;y<10240;y++)
        {
            array[y][x]=1234;
        }
    }
}

看出差异了吗? 在STM32单片机中,上面的func1和func2函数,哪个效率高?这是一个非常有趣的问题。我们知道,STM32单片机是一种嵌入式系统,因此在编写代码时,需要考虑到代码的效率。

在这种情况下,我们需要比较两个函数的效率,以确定哪个函数更适合在STM32单片机中使用。

函数的功能

首先,让我们看一下这两个函数的代码。func1函数将数组array的所有元素设置为1234,而func2函数将数组array的所有元素设置为1234。这两个函数的区别在于它们如何遍历数组。func1函数按行遍历数组,而func2函数按列遍历数组。

效率比较

1、func1的效率

让我们首先来看看 func1。在 func1 中,我们使用两个嵌套的循环按行顺序访问数组元素。这意味着我们首先遍历数组的第一行,然后是第二行,以此类推。这种访问模式有助于数据局部性,因为它使得连续内存地址中的数据可以在缓存中更容易获取。当处理大型数组时,这种连续性可以显著提高性能。

2、func2的效率

与此相反,func2 使用两个嵌套的循环按列顺序访问数组元素。这意味着我们首先遍历数组的第一列,然后是第二列,以此类推。这种访问模式会导致不连续的内存访问,因为数组的不同列不一定存储在相邻的内存位置上。这可能导致较低的效率,因为不连续的内存访问通常会导致较长的内存访问延迟

接下来我们来探讨一下二维数组按行访问比按列访问效率更高的原因。在计算机科学中,二维数组可以按行或按列存储。在C语言中,二维数组是按行存储的。这意味着,如果您要访问二维数组中的元素,按行访问比按列访问更快。

这是因为计算机内存是按照地址顺序存储的。当您访问一个内存地址时,计算机会将该地址附近的内存地址预先加载到缓存中。这是因为,如果您正在访问一个内存地址,那么您很可能会在不久的将来访问该地址附近的内存地址。因此,预先加载这些地址可以提高程序的性能。

当您按行访问二维数组时,您会按顺序访问内存地址。这意味着,计算机可以预先加载与您正在访问的内存地址相邻的内存地址。这样,当您访问下一个内存地址时,它已经在缓存中了。这使得按行访问二维数组比按列访问二维数组更快。

总之,按行访问二维数组比按列访问二维数组更快,因为它利用了计算机内存的物理结构







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3430

    浏览量

    128221
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128705
  • STM32单片机
    +关注

    关注

    58

    文章

    545

    浏览量

    57934

原文标题:用两个函数讲解一下STM32中二维数组“按行访问”与“按列访问”的差异!

文章出处:【微信号:玩转单片机与嵌入式,微信公众号:玩转单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C++中非常有用的设计模式

    假设我们在开发一个SDK,或者设计某个模块,需要暴露出去一个MyClass.h头文件,并向用户提供func1func2两个功能。
    的头像 发表于 02-21 14:21 701次阅读

    公式节点的效率高吗?

    如题,完成一个功能, 公式节点效率高,还是用VI函数效率高? 相信labview是用C++写的程序.
    发表于 11-20 11:30

    关于主函数whil循环调用多个函数执行,和直接代码执行,哪个效率高的问题。

    函数while多段代码,是将代码封装成多个函数,去调用多个函数执行,还是直接贴代码函数w
    发表于 06-24 10:14

    用keil 编写STC单片机程序,用人使用过__func__宏吗?

    使用keil version5编写STM32程序可以使用__func__宏,写STC程序的时候也想用一下__func__,提示__func
    发表于 12-01 21:41

    真心请教,a=b=1和a=1;b=1;这两种写法c语言中执行起来哪个效率高

    小白我真心请教,a=b=1和a=1;b=1;这两种写法c语言中执行起来哪个效率高?求高手们赐教
    发表于 01-01 12:30

    Autosar Apply Func Safe to ECu

    Autosar Apply Func Safe to ECu
    发表于 01-25 10:17

    超声波测距-AVR程序代码

    // Func7=In Func6=In Func5=In Func4=In Func3=In Fu
    发表于 06-26 02:47

    将结构缓冲区指针转换为struct不起作用?

    );}调试时,一切看起来都很好,但是当我进入函数2时,程序跳转到StuttuppPoSoC63YMCMPLUS S的故障处理程序。有没有人理解这为什么不起作用? 以上来自于百度翻
    发表于 09-28 15:39

    如何写UCOSII才能保护全局变量?

    全局变量 global_var1,不允许写全局变量 global_var1 func2(); //任务退出临界区 func3(); delay();}}中断
    发表于 09-12 04:35

    c语言初始化变量

    给了应用程序零页。接下来func1将其赋值12345之后函数返回,接下来调用func2的时候,
    发表于 03-29 09:25

    ARMv8架构栈的布局简析

    栈的布局函数调用栈由连续的栈帧组成。每个栈帧记录一个函数调用的信息,这些信息包括函数参数,函数变量,函数运行地址。假设
    发表于 05-13 11:17

    LS1028A两块板之间如何通过PCIe进行SoC到SoC通信?

    /vendorid sudo echo 2 > functions/pci_epf_test/func1/msi_interrupts root@TinyLinux:/sys/kernel
    发表于 05-06 08:33

    为什么不能在esp8266 sdk_v1.4.0使用PIN_FUNC_SELECT宏?

    。我像这样调用这个宏 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); 我是说错了还是这是 sdk 的错误。 如果我不能使用
    发表于 06-12 07:39

    请问s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;是函数调用吗?

    在看新唐IIC例程时,这行不明白什么意思,特请教一下,这是函数调用吗? s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;怎么不用写参数吗? /* I
    发表于 06-25 07:18

    从裸奔到操作系统,我们将面对什么挑战

    在超级循环中,分别调用了func1~func5这5个函数,他们的栈需求分别是10K、5K、9K、8K、9K。调用func1时,系统分配10K的ram作为栈,
    的头像 发表于 07-16 14:13 4489次阅读