我正在從program1訪問共享庫(共享數組數據結構),並查找訪問時間以讀取該陣列的所有元素。我只有17000個刻度,而只有Program1單獨執行。與單進程場景相比,在多進程場景中意外降低訪問時間
現在,當我在另一個選項卡中先執行program2(具有空的while循環來終止它)時,然後運行program1並測量訪問時間以讀取該數組的所有元素。 令我驚訝的是,與以前只有Program1執行的場景相比,我獲得了8000ticks。
看起來像只有program1正在執行,與有2個程序時相比,讀取數組需要更多時間,program1執行與上一個相同的任務,而program2通過while循環保持CPU繁忙。期望的是存在program1時訪問時間更長,而實際結果則相反。
爲什麼會發生這種情況?
下面是共享庫
#include <stdio.h>
static const int DATA[1024]={1 ,2 ,3,.....1024];
inline void foo(void)
{
int j, k=0,count=0;
for(j=0;j<1024;j++)
{
k=DATA[j];
}
k+=0;
}
PROGRAM1
int main(void)
{
foo();
start=timer();
foo();
end=timer();
printf("Time1=%llu\n",end-start);
start=timer();
foo();
end=timer();
printf("Time2=%llu\n",end-start);
start=timer();
foo();
end=timer();
printf("Time3=%llu\n",end-start);
sleep(1);
start=timer();
foo();
end=timer();
printf("after sleep(1)\n");
printf("Time4=%llu\n",end-start);
start=timer();
foo();
end=timer();
printf("Time5=%llu\n",end-start);
sleep(2);
start=timer();
foo();
end=timer();
printf("after sleep(2)\n");
printf("Time6=%llu\n",end-start);
return 0;
}
程序2
int main(void)
{
while(1)
{}
return 0;
}
CASE1(僅PROGRAM1運行)
輸出
Time1=17918
Time2=17672
Time3=17816
after sleep(1)
**Time4= 20716 ** // Is it due to wake up from sleep mode ?
Time5=17722
after sleep(2)
**Time6=20910** // Is it due to wake up from sleep mode ?
CASE1(Program2中運行,然後再PROGRAM1開始運行)
輸出
Time1 =7483
Time2=7205
Time3=7399
after sleep(1)
**Time4= 8734 ** // Is it due to wake up from sleep mode ?
Time5=7326
after sleep(2)
**Time6=9070** // Is it due to wake up from sleep mode ?
按我理解而使用CPU僅通過program1讀取數組所需的時間必須少於Program1和Program2使用CPU時的時間。
我在哪裏犯錯誤?我有i7機器,只有一個內核,超線程被禁用,禁用ASLR。
編輯1:
按Mysticial的建議下,我的CPU進入省電模式,而只有程序1是存在的,那麼CPU進入省電模式,然後從省電模式下喚醒它需要更長的訪問時間。所以他的建議是多次訪問DATA數組。
這是我修改的共享庫。 Program1和Program2沒有改變。
#include <stdio.h>
static const int DATA[1024]={1 ,2 ,3,.....1024];
inline void foo(void)
{
int j, k=0,count=0;
while(count++<10000)
{
for(j=0;j<1024;j++)
{
k=DATA[j];
}
}
k+=0;
}
現在的輸出是如下
CASE1(僅PROGRAM1運行)
輸出
Time1=75186246
Time2=77570299
Time3=80548529
after sleep(1)
**Time4= 92608363 ** // Is it due to wake up from sleep mode ?
Time5=75616487
after sleep(2)
**Time6=97021338** // Is it due to wake up from sleep mode ?
CASE1(Program2中運行,然後再PROGRAM1開始正在競選)
輸出
Time1 =139337099
Time2=155801957
Time3=146586856
after sleep(1)
**Time4= 130558062 ** // Why lower access time after sleep mode ?
Time5=145250551 // Time5 is expected lower than Time4 as other run . Why lower here ?
after sleep(2)
**Time6=130940183** // Again Why lower access time after sleep mode ?
這裏是我的關於修改共享庫
新問題,當沒有程序2,然後睡眠訪問時間後(與先前的訪問時間(t3/t5,在進入睡眠之前)相比較,更高的更高的。我能說,這是由於Mysticial解釋,從睡眠狀態喚醒CPU嗎?
現在,程序2在另一個選項卡運行時,睡眠訪問時間(T4/T6)之後是低相比於先前訪問時間(t3/T5,睡覺前)。我的q(1)和q(2)的原因是矛盾的。從睡眠中醒來後訪問時間縮短的原因是什麼(t4 < t3)?雖然我沒有多次訪問DATA數組(原始共享庫),但睡眠後的訪問時間更長。
爲什麼
t2<t1 and t3<t2
因爲共享庫已經加載到內存和緩存中而始終保持爲真。這是由於頁面切換?
我在linux下使用gcc。任何幫助理解這一點將不勝感激。提前致謝。
除非您運行多次迭代,否則基準幾乎沒有意義。(足夠的迭代,以便基準測試持續幾秒鐘而不是瞬時)。如同單次迭代一樣,您可能會看到program2的影響,迫使CPU退出節能狀態。 – Mysticial
@Mysticial感謝您的回答。你的意思是說,當我使用單次迭代來讀取相同的陣列CPU進入省電狀態,這就是爲什麼我得到更高的訪問時間(17000ticks)。當Program2使用while循環並保持CPU繁忙時,它會阻止CPU進入省電狀態。可能你是對的,因爲當我在程序2中使用睡眠(100)時,我也得到了更高的(17000個滴答聲)訪問時間。讓我檢查多個迭代,然後我會在這裏發佈結果。 – bholanath
@Mysticial我通過多次迭代(10000)獲得預期結果(更高的訪問時間,而program2在場景中)。你能寫這個答案,以便我能接受這個。謝謝 。 – bholanath