0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在STM32中的func1和func2函數(shù),哪個(gè)效率高?

玩轉(zhuǎn)單片機(jī)與嵌入式 ? 來(lái)源:玩轉(zhuǎn)單片機(jī)與嵌入式 ? 2023-11-08 09:20 ? 次閱讀

先看下面的兩個(gè)函數(shù):

函數(shù)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;
        }
    }
}

函數(shù)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單片機(jī)中,上面的func1和func2函數(shù),哪個(gè)效率高?這是一個(gè)非常有趣的問題。我們知道,STM32單片機(jī)是一種嵌入式系統(tǒng),因此在編寫代碼時(shí),需要考慮到代碼的效率。

在這種情況下,我們需要比較兩個(gè)函數(shù)的效率,以確定哪個(gè)函數(shù)更適合在STM32單片機(jī)中使用。

函數(shù)的功能

首先,讓我們看一下這兩個(gè)函數(shù)的代碼。func1函數(shù)將數(shù)組array的所有元素設(shè)置為1234,而func2函數(shù)將數(shù)組array的所有元素設(shè)置為1234。這兩個(gè)函數(shù)的區(qū)別在于它們?nèi)绾伪闅v數(shù)組。func1函數(shù)按行遍歷數(shù)組,而func2函數(shù)按列遍歷數(shù)組。

效率比較

1、func1的效率

讓我們首先來(lái)看看 func1。在 func1 中,我們使用兩個(gè)嵌套的循環(huán)按行順序訪問數(shù)組元素。這意味著我們首先遍歷數(shù)組的第一行,然后是第二行,以此類推。這種訪問模式有助于數(shù)據(jù)局部性,因?yàn)樗沟眠B續(xù)內(nèi)存地址中的數(shù)據(jù)可以在緩存中更容易獲取。當(dāng)處理大型數(shù)組時(shí),這種連續(xù)性可以顯著提高性能。

2、func2的效率

與此相反,func2 使用兩個(gè)嵌套的循環(huán)按列順序訪問數(shù)組元素。這意味著我們首先遍歷數(shù)組的第一列,然后是第二列,以此類推。這種訪問模式會(huì)導(dǎo)致不連續(xù)的內(nèi)存訪問,因?yàn)閿?shù)組的不同列不一定存儲(chǔ)在相鄰的內(nèi)存位置上。這可能導(dǎo)致較低的效率,因?yàn)椴贿B續(xù)的內(nèi)存訪問通常會(huì)導(dǎo)致較長(zhǎng)的內(nèi)存訪問延遲。

接下來(lái)我們來(lái)探討一下二維數(shù)組按行訪問比按列訪問效率更高的原因。在計(jì)算機(jī)科學(xué)中,二維數(shù)組可以按行或按列存儲(chǔ)。在C語(yǔ)言中,二維數(shù)組是按行存儲(chǔ)的。這意味著,如果您要訪問二維數(shù)組中的元素,按行訪問比按列訪問更快。

這是因?yàn)橛?jì)算機(jī)內(nèi)存是按照地址順序存儲(chǔ)的。當(dāng)您訪問一個(gè)內(nèi)存地址時(shí),計(jì)算機(jī)會(huì)將該地址附近的內(nèi)存地址預(yù)先加載到緩存中。這是因?yàn)?,如果您正在訪問一個(gè)內(nèi)存地址,那么您很可能會(huì)在不久的將來(lái)訪問該地址附近的內(nèi)存地址。因此,預(yù)先加載這些地址可以提高程序的性能。

當(dāng)您按行訪問二維數(shù)組時(shí),您會(huì)按順序訪問內(nèi)存地址。這意味著,計(jì)算機(jī)可以預(yù)先加載與您正在訪問的內(nèi)存地址相鄰的內(nèi)存地址。這樣,當(dāng)您訪問下一個(gè)內(nèi)存地址時(shí),它已經(jīng)在緩存中了。這使得按行訪問二維數(shù)組比按列訪問二維數(shù)組更快。

總之,按行訪問二維數(shù)組比按列訪問二維數(shù)組更快,因?yàn)樗昧擞?jì)算機(jī)內(nèi)存的物理結(jié)構(gòu)。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3606

    瀏覽量

    129595
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7609

    瀏覽量

    137219
  • STM32單片機(jī)
    +關(guān)注

    關(guān)注

    59

    文章

    549

    瀏覽量

    58749

原文標(biāo)題:用兩個(gè)函數(shù)講解一下STM32中二維數(shù)組“按行訪問”與“按列訪問”的差異!

文章出處:【微信號(hào):玩轉(zhuǎn)單片機(jī)與嵌入式,微信公眾號(hào):玩轉(zhuǎn)單片機(jī)與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++中非常有用的設(shè)計(jì)模式

    假設(shè)我們開發(fā)一個(gè)SDK,或者設(shè)計(jì)某個(gè)模塊,需要暴露出去一個(gè)MyClass.h頭文件,并向用戶提供func1func2兩個(gè)功能。
    的頭像 發(fā)表于 02-21 14:21 ?931次閱讀

    公式節(jié)點(diǎn)的效率高嗎?

    如題,完成一個(gè)功能, 公式節(jié)點(diǎn)效率高,還是用VI函數(shù)效率高? 相信labview是用C++寫的程序.
    發(fā)表于 11-20 11:30

    關(guān)于主函數(shù)whil循環(huán)調(diào)用多個(gè)函數(shù)執(zhí)行,和直接代碼執(zhí)行,哪個(gè)效率高的問題。

    函數(shù)while多段代碼,是將代碼封裝成多個(gè)函數(shù),去調(diào)用多個(gè)函數(shù)執(zhí)行,還是直接貼代碼函數(shù)w
    發(fā)表于 06-24 10:14

    真心請(qǐng)教,a=b=1和a=1;b=1;這兩種寫法c語(yǔ)言中執(zhí)行起來(lái)哪個(gè)效率高?

    小白我真心請(qǐng)教,a=b=1和a=1;b=1;這兩種寫法c語(yǔ)言中執(zhí)行起來(lái)哪個(gè)效率高?求高手們賜教
    發(fā)表于 01-01 12:30

    Autosar Apply Func Safe to ECu

    Autosar Apply Func Safe to ECu
    發(fā)表于 01-25 10:17

    超聲波測(cè)距-AVR程序代碼

    // Func7=In Func6=In Func5=In Func4=In Func3=In Fu
    發(fā)表于 06-26 02:47

    將結(jié)構(gòu)緩沖區(qū)指針轉(zhuǎn)換為struct不起作用?

    );}調(diào)試時(shí),一切看起來(lái)都很好,但是當(dāng)我進(jìn)入函數(shù)2時(shí),程序跳轉(zhuǎn)到StuttuppPoSoC63YMCMPLUS S的故障處理程序。有沒有人理解這為什么不起作用? 以上來(lái)自于百度翻
    發(fā)表于 09-28 15:39

    如何寫UCOSII才能保護(hù)全局變量?

    全局變量 global_var1,不允許寫全局變量 global_var1 func2(); //任務(wù)退出臨界區(qū) func3(); delay();}}中斷
    發(fā)表于 09-12 04:35

    c語(yǔ)言初始化變量

    給了應(yīng)用程序零頁(yè)。接下來(lái)func1將其賦值12345之后函數(shù)返回,接下來(lái)調(diào)用func2的時(shí)候,
    發(fā)表于 03-29 09:25

    ARMv8架構(gòu)棧的布局簡(jiǎn)析

    棧的布局函數(shù)調(diào)用棧由連續(xù)的棧幀組成。每個(gè)棧幀記錄一個(gè)函數(shù)調(diào)用的信息,這些信息包括函數(shù)參數(shù),函數(shù)變量,函數(shù)運(yùn)行地址。假設(shè)
    發(fā)表于 05-13 11:17

    請(qǐng)問s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;是函數(shù)調(diào)用嗎?

    在看新唐IIC例程時(shí),這行不明白什么意思,特請(qǐng)教一下,這是函數(shù)調(diào)用嗎? s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;怎么不用寫參數(shù)嗎? /* I
    發(fā)表于 06-25 07:18

    Python的三種函數(shù)應(yīng)用及代碼

    1.filter的用法 函數(shù)filter(function,list)提供一種優(yōu)雅的方式過濾出列表函數(shù)值返回為True的函數(shù),
    發(fā)表于 11-15 13:07 ?1363次閱讀
    Python的三種<b class='flag-5'>函數(shù)</b>應(yīng)用及代碼

    從裸奔到操作系統(tǒng),我們將面對(duì)什么挑戰(zhàn)

    超級(jí)循環(huán)中,分別調(diào)用了func1~func5這5個(gè)函數(shù),他們的棧需求分別是10K、5K、9K、8K、9K。調(diào)用func1時(shí),系統(tǒng)分配10K
    的頭像 發(fā)表于 07-16 14:13 ?4638次閱讀

    以MTV412微控制器為核心的1對(duì)8ISP系統(tǒng)設(shè)計(jì)

    放置與從設(shè)備通信的程序,模擬ISP過程。main函數(shù)通過調(diào)用func0和func1,把對(duì)應(yīng)的Bank0和Bank
    發(fā)表于 08-21 16:53 ?1322次閱讀
    以MTV412微控制器為核心的<b class='flag-5'>1</b>對(duì)8ISP系統(tǒng)設(shè)計(jì)

    labview和vb哪個(gè)效率高

    。但是,關(guān)于哪個(gè)效率高,一直是程序員爭(zhēng)論的話題。本文將詳細(xì)介紹LabVIEW和VB兩種編程語(yǔ)言的特點(diǎn),并比較它們的優(yōu)勢(shì)和劣勢(shì),以確定哪種語(yǔ)言的效率更高。 一、LabVIEW的特點(diǎn) 1.
    的頭像 發(fā)表于 08-31 17:36 ?1276次閱讀