簡體   English   中英

C 代碼 - memory 訪問/搶占

[英]C code - memory access / preemption

我寫了一段代碼,其中有一個數據:

unsigned char buf[4096]; // data in chunks of size 4k
unsigned counter[256];

我將每 3 個連續字節的 i/p 數據相加並存儲 ans。 例如:溫度[4096]; 臨時[0] = buf[0] + buf[1] + buf[2]; ... 直到 4096

然后使用以下代碼從 temp 的結果生成直方圖:

for(i = 0; i < 4096; i++)
counter[temp[i]]++;

對直方圖進行排序(冒泡排序),然后取前 8 個最常出現的值。 代碼運行在 linux kernel (2.6.35)

我面臨的問題是,如果我刪除排序部分,執行代碼所需的時間非常快(在我的筆記本電腦上為 6 微秒,使用 gettimeofday func 測量)。 但是在引入排序之后,這個過程在很大程度上減慢了(44微秒)。 排序 function 本身需要 20 微秒,我不明白為什么時間會增加這么多。 我使用 cachegrind 進行了 memory 分析,結果正常,我什至嘗試禁用搶占,但仍然沒有顯示任何差異。 如果有人可以在這里幫助我。 謝謝!

冒泡排序很慢,它比較和交換您的值高達 4096*4096 = 16,777,216 次。 如果您只需要 8 個最佳值,那么選擇 1 個掃描肯定會更快。 類似的東西。

 const uint_t n = 8;
 uint_t best[n] = {0};
 uint_t index[n] = {0};
 uint_t j;

 for(uint_t i=0; i<4096; i++) {

   if(counter[i] > best[n-1]) {
     for(j=n-2; j && counter[i] > best[j]; j--);           /* Find the insertion position, as our value might be bigger than the value at position n-1. */
     memmove(&best [j+1], &best[j] , (n-1 -j) * sizeof best[0]);      /* Shift the values beyond j up 1  */
     memmove(&index[j+1], &index[j], (n-1 -j) * sizeof index[0]);
     best[j] = counter[i];                                 /* Put the current best value at the top */
     index[j] = i;                                         /* Store the index in the second array to know where the best value was. */
   }
 }

這樣,您只需比較一次您的值,並且memmove的成本可以忽略不計,因為您的選擇數組很小。 無需對數組進行排序,此算法為 O(nm),其中 n 是數組的大小,m 是您選擇的大小。 最好的排序是 O((n.log2 n).m)。 因此,如果 m 小而 n 大,任何通用排序算法都無法擊敗它。

編輯:我為索引添加了數組。

EDIT2 :引入第二個以糾正我在第一個實例中遇到的基本錯誤。

EDIT3 :評論:允許使用大小為 0 的memmove ,基本上是一個 nop。

冒泡排序很慢... O(N^2) 復雜度...如果您想要更快的性能,請使用像堆這樣的數據結構,或者在您的數組上運行快速排序算法,這兩者都會給您 O (N log N) 排序過程的復雜度。 此外,這兩種方法也適用於固定長度的 arrays。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM