系統呼叫之時間開銷
ps:寫了很長時間,所以轉載請著名作者(程式圓圓圓) !!!還有這句話!!!
再ps一個:轉載註明本空間地址呀!!!http://blog.csdn.net/lancegentry/article/details/8937514
一個程式使用系統呼叫的次數會很大程度上影響系統的效能,因為在執行系統時,會從使用者程式碼切換執行核心程式碼,然後返回使用者程式碼。優化手段就是儘量減少系統呼叫。一下實驗用來驗證系統會付出巨大d呃開支,所用時間與電腦配置、所用的系統的核心有關,故在不同的電腦或同一電腦的不同系統上會有一些差異,但是結果一定是相同的。
本人使用的系統是Mac OS X 10.8.3 。
1.首先我們建立一個約1Mb的檔案(file.in)用於測試。建立程式碼如下,當然方法有很多這只是其中的一種。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *file;
file = fopen("file.in", "w");
int i = 0xfffff;
while (i--) {
fprintf(file,"%c",i%26 + 'a');
if (i%26 == 0)
fprintf(file,"\n");
}
exit(0);
}
2.然後編譯copy_system.c
上述程式碼中要注意的是#include <unistd> (unix standard)要放在第一行,因為它定義的POSIX規範的有關標誌可能會影響其他的標頭檔案。#include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> int main() { char c; int in, out; in = open("file.in", O_RDONLY); out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); while (read(in,&c,1) == 1) write(out,&c,1); exit(0); }
我們可以看一下執行的結果
這裡我們首先看到有一個1.0M的檔案file.in。然後喔們編譯了copy_system.c,之後使用time命令檢視執行時間。
3.編譯copy_system2.c
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define BLOCK 1024
int main()
{
char block[BLOCK];
int in, out;
int nread;
in = open("file.in", O_RDONLY);
out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
while ((nread = read(in,block,sizeof(block))) > 0)
write(out,block,nread);
exit(0);
}
這裡我們通過複製資料塊的方式來減少系統呼叫(每次複製1K),看看結果(順道驗證剛才檔案確實生成了。。。)
我把上一次的執行也截取了下來以便比較,現在我們可以看到時間差距還是非常明顯了,我們這是減少約2000次(2048)的系統呼叫所節省的時間。並且我們看到這兩個程式執行時間的差距還是巨大的。那麼是不是越大越好呢?
為了實驗放便我們將 copy_system2.c中的#define BLOCK 1024刪除即為下面程式碼
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
char block[BLOCK];
int in, out;
int nread;
in = open("file.in", O_RDONLY);
out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
while ((nread = read(in,block,sizeof(block))) > 0)
write(out,block,nread);
exit(0);
}
這樣我們就可以很方便的進行實驗了。實驗結果如下
這裡我們使用
-Dname=value 的命令選項在編譯時定義BLOCK變數。因為我使用的是64位系統所以在後期這個時間依舊在有減小的趨勢,不過可以看出在256後這個值已經變化很小了。在1024後這些值開始了擺動,並且失去了之前的規律(system time每次減小一倍,2048和4096的資料(倒數第3個和倒數第1個))。這是因為硬體會限制對底層系統呼叫一次能讀寫的資料塊大小。
最後希望大家能從本文中有所收穫。2013.05.16 23:00
End