我正在編寫一個(gè)從stdin讀取并寫入stdout的C程序。但它會(huì)緩沖數(shù)據(jù),以便僅在讀取特定數(shù)量的字節(jié)后才執(zhí)行寫操作(= SIZE)#include<stdio.h>#include<stdlib.h>#define SIZE 100int main(){ char buf[SIZE]; int n=0; //printf("Block size = %d\n", BUFSIZ); while( ( n = read(0, buf, sizeof(buf)) ) > 0 ) write(1, buf, n); exit(0);}Iam在Oracle Virtual Box(4GB RAM,2個(gè)內(nèi)核)上托管的Ubuntu 18.04上運(yùn)行該程序,并測(cè)試該程序的緩沖區(qū)大小是否不同。我已經(jīng)將標(biāo)準(zhǔn)輸入重定向到來自文件(包含動(dòng)態(tài)創(chuàng)建的隨機(jī)數(shù))的文件,并將標(biāo)準(zhǔn)輸出重定向到/ dev / null。這是用于運(yùn)行測(cè)試的shell腳本:#!/bin/bash# $1 - step size (bytes)# $2 - start size (bytes)# $3 - stop size (bytes)echo "Changing buffer size from $2 to $3 in steps of $1, and measuring time for copying."buff_size=$2echo "Test Data" >testDataecho "Step Size:(doubles from previous size) Start Size:$2 Stop Size:$3" >>testDatawhile [ $buff_size -le $3 ]do echo "" >>testData echo -n "$buff_size," >>testData gcc -DSIZE=$buff_size copy.c # Compile the program for cat, with new buffer size dd bs=1000 count=1000000 </dev/urandom >testFile #Create testFile with random data of 1GB (/usr/bin/time -f "\t%U, \t%S," ./a.out <testFile 1>/dev/null) 2>>testData buff_size=$(($buff_size * 2)) rm -f a.out rm -f testFiledone我正在測(cè)量執(zhí)行程序并將其制成表格所需的時(shí)間。測(cè)試運(yùn)行將產(chǎn)生以下數(shù)據(jù):Test DataStep Size:(doubles from previous size) Start Size:1 Stop Size:5242881, 5.94, 17.81,2, 5.53, 18.37,4, 5.35, 18.37,8, 5.58, 18.78,16, 5.45, 18.96,32, 5.96, 19.81,64, 5.60, 18.64,128, 5.62, 17.94,256, 5.37, 18.33,512, 5.70, 18.45,1024, 5.43, 17.45,2048, 5.22, 17.95,4096, 5.57, 18.14,8192, 5.88, 17.39,16384, 5.39, 18.64,由于我們使用不同的塊大小,因此我看不到用戶+系統(tǒng)時(shí)間有任何重大變化。但是從理論上講,隨著塊大小變小,對(duì)于相同的文件大小會(huì)生成許多系統(tǒng)調(diào)用,并且執(zhí)行起來將花費(fèi)更多時(shí)間。我在理查德·史蒂文斯(Richard Stevens)的《 Unix環(huán)境中的高級(jí)編程》一書中看到了類似測(cè)試的測(cè)試結(jié)果,該結(jié)果表明,如果復(fù)制中使用的緩沖區(qū)大小接近塊大小,則用戶+系統(tǒng)時(shí)間將大大減少。 ext4分區(qū)上的塊大小為4096字節(jié))為什么我無法重現(xiàn)這些結(jié)果?我在這些測(cè)試中是否缺少一些因素?
1 回答

千萬里不及你
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
您沒有#define SIZE 100
在源代碼中禁用該行,因此通過option(-DSIZE=1000
)進(jìn)行的定義僅在此之上有影響#define
。在我的編譯器上,我<command-line>:0:0: note: this is the location of the previous definition
在編譯時(shí)收到有關(guān)此()的警告。
如果您將其注釋掉,則#define
應(yīng)該可以修復(fù)此錯(cuò)誤。
我想到的另一個(gè)方面是:
如果您在計(jì)算機(jī)上創(chuàng)建文件并隨后立即讀取文件,則該文件將位于操作系統(tǒng)的磁盤緩存中(該磁盤足夠存儲(chǔ)所有文件),因此實(shí)際磁盤塊大小不會(huì)占用太多空間。影響在這里。
史蒂文斯(Stevens)的書寫于1992年,當(dāng)時(shí)RAM的價(jià)格要比今天貴得多,因此其中的某些信息可能已經(jīng)過時(shí)了。我也懷疑本書的新版本是否將此類內(nèi)容排除在外,因?yàn)榭偟膩碚f它們?nèi)匀皇钦_的。
添加回答
舉報(bào)
0/150
提交
取消