1. 程式人生 > >系統呼叫之時間開銷

系統呼叫之時間開銷

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.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);
}
上述程式碼中要注意的是#include <unistd> (unix standard)要放在第一行,因為它定義的POSIX規範的有關標誌可能會影響其他的標頭檔案。
        我們可以看一下執行的結果



        這裡我們首先看到有一個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