tag:
clinux
一. 檔案一次讀入速度
linux下讀檔案這東西最後都是要通過系統呼叫sys_read(fd,buf,count)來實現的,所以如果要提高速度,就是最簡單地呼叫sys_read的封裝,比如直接用read()或fread()。下面是我在linux下的幾個測試。
首先建立乙個130m資料檔案 dd if=/dev/zero of=data bs=1024k count=130
分別用fread,read和fgets一次讀入全部大小檔案所消耗時間對比,其中
size=130*1024*1024
char *buf=new char[size];
下面是測試結果(機器intel(r) pentium(r) 4 cpu 3.20ghz, mem 1g):
1.fread(buf,size,1,fp)一次讀入
real 0m0.187s
user 0m0.000s
sys 0m0.180s
2.read(fdin,(void *)buf,size)一次讀入
real 0m0.187s
user 0m0.000s
sys 0m0.184s
3.多次fgets(buf,size,fp),每次1k
real 0m0.356s
user 0m0.136s
sys 0m0.220s
4.fgets(buf,size,fp)一次讀入
real 0m0.305s
user 0m0.072s
sys 0m0.232s
上面看到越簡單的函式(read()和fread()),速度越快,其他的輸入封裝函式只不過是為了方便滿足特殊需要,並不見得讀的速度會很快。對於3和4,因為在sys_read()內部有對讀入大小的判斷和while迴圈,所以大檔案讀取也沒必要像3那樣分多次呼叫fgets()來讀檔案.
另外用mmap()記憶體對映來讀入檔案的時間如下:
real 0m0.231s
user 0m0.068s
sys 0m0.164s
也並沒有比直接read()快,網上找到一種解釋是對於需要頻繁讀寫操作的,mmap效率才會顯著提高。下面來模擬頻繁讀寫操作。
二. 檔案頻繁讀寫速度測試
1. 這乙個測試模擬頻繁檔案讀寫操作,500m大小的資料檔案data.in,每次從中讀入1k個位元組對每個位元組做加1簡單計算,再寫到另乙個檔案data.out中。
#define size 1024*1024*500
#define len 1024
#include
int main()
lseek(fdout,size-1,seek_set);
write(fdout,"\0",1);
//因為data.out是空檔案,必須建立乙個空洞讓其大小成為size來進行下面的mmap
if((dst=mmap(0,size,prot_read|prot_write,map_shared,fdout,0))==map_failed)
memcpy(dst,src,size);
p=(char*)dst;
for(i=0;i
#include
#include
#include
#include
#define size 1024*1024*500
#define len 1024
int main()
p=(char*)src;
for(i=0;i對於頻繁地隨機改寫某個檔案內的某些部分位元組內容的情況來說,這是乙個有效的選擇。
Linux下讀寫速度測試
一.檔案一次讀入速度 linux下讀檔案這東西最後都是要通過系統呼叫sys read fd,buf,count 來實現的,所以如果要提高速度,就是最簡單地呼叫sys read的封裝,比如直接用read 或fread 下面是我在linux下的幾個測試。首先建立乙個130m資料檔案 dd if dev ...
linux下硬碟讀寫速度測試
haparm tt dev fdisk l disk dev xvdf 365.0 gb,365041287168 bytes 255 heads,63 sectors track,44380 cylinders units cylinders of 16065 512 8225280 bytes ...
linux下測試磁碟的讀寫IO速度
有時候我們在做維護的時候,總會遇到類似於io特別高,但不能判定是io瓶頸還是軟體引數設定不當導致熱盤的問題.這時候通常希望能知道磁碟的讀寫速度,來進行下一步的決策.下面是兩種測試方法 1 使用hdparm命令 這是乙個是用來獲取ata ide硬碟的引數的命令,是由早期linux ide驅動的開發和維...