2013-04-08 4 views
6

Chcę uruchomić prosty test wydajności dysku na platformie rhel 6. Chodzi tylko o zapisanie 1 GB bajtów na dysk. Zauważyłem, że jeśli plik został najpierw rozłączony, byłby znacznie szybszy, niż został obcięty. Było to około 1,5s w porównaniu z 15s.fwrite() jest szybszy, jeśli rozłączymy() plik przed obcięciem go

Dlaczego? Myślałem, że odłączyć() ostatni twardy link skróci plik do 0 i usunie i-węzeł. Dlaczego fwrites były szybsze z unlink() niż obcięcie?

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int 
main(int argc, char* argv[]) 
{ 
    if (argc < 2) { 
     return -1; 
    } 

    char buf[1024]; 

    srand(time(0)); 

    int i; 
    for (i = 0; i < 1024; ++i) { 
     buf[i] = rand(); 
    } 

    /* unlink(argv[1]); */ 
    FILE* fp = fopen(argv[1], "wb+"); 
    if (fp == NULL) { 
     perror("fopen"); 
     return -1; 
    } 

    for (i = 0; i < 1024 * 1024; ++i) { 
     if (fwrite(buf, 1024, 1, fp) != 1) { 
      perror("fwrite"); 
      return -1; 
     } 
    } 

    return 0; 
} 

Odpowiedz

5

Usuwanie pliku może pojawić się szybciej niż obcinanie go, gdy masz wystarczająco dużo wolnego miejsca na dysku i systemu plików można usunąć plików i odzyskać swoje miejsce leniwie. Może po prostu zaznaczyć i-węzeł jako usunięty i usunąć plik w tle lub w późniejszym czasie i natychmiast utworzyć nowy i-węzeł, gotowy do nowych zapisów.

+0

Alexey, dzięki za odpowiedź. Miałem tę samą myśl o tym, chociaż nie jestem pewien. Ale nadal nie rozumiem, dlaczego przycinanie nie jest realizowane w ten sposób. Jeśli plik jest obcięty do zera, to dlaczego nie przenieść przeniesionych bloków do nowego i-węzła i zachować bieżący i-węzeł czysty dla następnego zapisu? – Zhongzhi

+0

Nie wiem na pewno. Naprawdę odpowiedź na twoje pytanie zależy od implementacji systemu plików. Możesz chcieć zbadać to dalej, zobaczyć dokumentację systemu plików lub kod źródłowy i sprawdzić dyskusje dotyczące wydajności w Internecie. –

+1

@Zhongzhi "dlaczego nie przenieść skróconych bloków do nowego i-węzła" - Co nowego i-węzła? Przydzielanie i-węzła tylko po to, by uczynić program szybszym kosztem reszty systemu, jest kiepskim pomysłem i bezsensowną komplikacją kodu FS. Różni się to od tego, że rekultywacja bloku po usunięciu ostatniego linku do pliku nie jest obciążona deleterem, ponieważ bloki są odzyskiwane asynchronicznie. –

Powiązane problemy