先看下面的兩個函數:
函數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語言中,二維數組是按行存儲的。這意味著,如果您要訪問二維數組中的元素,按行訪問比按列訪問更快。
這是因為計算機內存是按照地址順序存儲的。當您訪問一個內存地址時,計算機會將該地址附近的內存地址預先加載到緩存中。這是因為,如果您正在訪問一個內存地址,那么您很可能會在不久的將來訪問該地址附近的內存地址。因此,預先加載這些地址可以提高程序的性能。
當您按行訪問二維數組時,您會按順序訪問內存地址。這意味著,計算機可以預先加載與您正在訪問的內存地址相鄰的內存地址。這樣,當您訪問下一個內存地址時,它已經在緩存中了。這使得按行訪問二維數組比按列訪問二維數組更快。
總之,按行訪問二維數組比按列訪問二維數組更快,因為它利用了計算機內存的物理結構。
審核編輯:劉清
-
嵌入式系統
+關注
關注
41文章
3587瀏覽量
129435 -
C語言
+關注
關注
180文章
7604瀏覽量
136685 -
STM32單片機
+關注
關注
59文章
549瀏覽量
58701
原文標題:用兩個函數講解一下STM32中二維數組“按行訪問”與“按列訪問”的差異!
文章出處:【微信號:玩轉單片機與嵌入式,微信公眾號:玩轉單片機與嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論