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;
}
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
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. –
@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. –