轉自:https://blog.csdn.net/lancegentry/article/details/8937514性能
版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/lancegentry/article/details/8937514
ps:寫了很長時間,因此轉載請著名做者(程序圓圓圓) !!!還有這句話!!!測試
再ps一個:轉載註明本空間地址呀!!!http://blog.csdn.net/lancegentry/article/details/8937514優化
一個程序使用系統調用的次數會很大程度上影響系統的性能,由於在執行系統時,會從用戶代碼切換執行內核代碼,而後返回用戶代碼。優化手段就是儘可能減小系統調用。一下實驗用來驗證系統會付出巨大d呃開支,所用時間與電腦配置、所用的系統的內核有關,故在不一樣的電腦或同一電腦的不一樣系統上會有一些差別,可是結果必定是相同的。
本人使用的系統是Mac OS X 10.8.3 。.net
1.首先咱們創建一個約1Mb的文件(file.in)用於測試。創建代碼以下,固然方法有不少這只是其中的一種。unix
#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);
}blog
2.而後編譯copy_system.c get
#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規範的有關標誌可能會影響其餘的頭文件。
咱們能夠看一下運行的結果it
這裏咱們首先看到有一個1.0M的文件file.in。而後喔們編譯了copy_system.c,以後使用time命令查看執行時間。io
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:00End ————————————————版權聲明:本文爲CSDN博主「程序圓圓圓」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/lancegentry/article/details/8937514