0

あるタイミングで Calloc() を使用してメモリ割り当ての時間を計るプログラムに取り組んでいます。プログラムは、1500 MB の RAM を割り当てるまで、50 MB を割り当てて、毎回さらに 50 MB ずつ反復する必要があります。createbigthing() の目的は、大きなものを作成して解放することです。

....
#define oneMeg 1024L*1024L
#define INCREMENT 50

int difftod(struct timeval * tv0, struct timeval * tv1){
return (tv1->tv_sec - tv0->tv_sec)*1000 + (tv1->tv_usec- tv0->tv_usec)/1000;
}


int createbigthing(long int size){

int *test = (int*) calloc(size, (size_t) oneMeg);
if(test == NULL){
    return -1;
}

free(test);
return 0;
}


int main(){
long int i;
int rtn;
struct timeval tv0, tv1;
struct timezone tzp;
for(i=INCREMENT;i<=1500;i=i+INCREMENT){
        rtn = gettimeofday(&tv0, &tzp); /* set timer T0 */
        createbigthing(i);
    rtn = gettimeofday(&tv1, &tzp); /* read time T1 */
    printf("%d msec\n",difftod(&tv0,&tv1));
}
return 0;
}

私が得た唯一の出力は、最初の反復で約 220 ミリ秒の遅延が発生し、その後何もないことです。関数はまだ 0 を返しているため、メモリがいっぱいになることはありません。

出力例:

220 msec
0 msec
0 msec
0 msec
0 msec
...
4

1 に答える 1

0

これは完全に予想される動作です。

  • システム カーネルから 1 メビバイトを 1 回 (内部でcalloc()) 要求していますが、これには時間がかかります (ただし、220 ミリ秒であってはなりません)。

  • このメモリを解放し、(カーネルではなく) libc にもう必要ないことを伝えます。ほとんどの場合、libc はメモリをシステムに返さないため、仮想アドレス空間の一部のままです。

  • libc に 1 メビバイトの RAM が必要であることを再度伝えると、libc は次のように言います。それを取る!を使用しているため、その内容も消去されますcalloc()が、ミリ秒単位の時間はかかりません。

また、時間差コードは、1 ミリ秒未満の時間差を切り捨てることに注意してください。経過したマイクロ秒を出力するように変更したい場合があります。

于 2013-07-25T11:45:55.317 に答える