2013-04-08 22 views
6

Tôi muốn chạy thử nghiệm đơn giản về hiệu suất đĩa trên nền tảng rhel 6. Nó chỉ để ghi 1G byte vào đĩa. Tôi tìm thấy nếu tập tin đã được bỏ liên kết đầu tiên, nó sẽ nhanh hơn nhiều so với nó đã bị cắt ngắn. Đó là khoảng 1,5s so với 15s.fwrite() nhanh hơn nếu hủy liên kết() tệp trước khi cắt bớt nó

Tại sao? Tôi nghĩ unlink() liên kết cứng cuối cùng sẽ cắt bớt tệp thành 0 và xóa inode. Tại sao fwrites nhanh hơn với unlink() hơn cắt ngắn?

#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; 
} 

Trả lời

5

Xóa tệp có thể xuất hiện nhanh hơn cắt bớt tệp khi bạn có đủ dung lượng trống trên đĩa và hệ thống tệp có thể xóa tệp và xác nhận lại không gian của chúng. Nó chỉ có thể đánh dấu inode là bị xóa và xóa các tập tin trong nền hoặc tại một thời gian sau đó và tạo ra một inode mới gần như ngay lập tức, sẵn sàng cho viết mới.

+0

Alexey, cảm ơn câu trả lời của bạn. Tôi đã có cùng suy nghĩ về điều này mặc dù tôi không chắc chắn. Nhưng tôi vẫn không hiểu tại sao truncate lại không được thực hiện như thế này. Nếu một tập tin được cắt ngắn về 0, tại sao không di chuyển các khối cắt ngắn đến một inode mới và giữ cho inode hiện tại sạch sẽ để viết tiếp theo? – Zhongzhi

+0

Tôi không biết chắc chắn. Thực sự, câu trả lời cho câu hỏi của bạn phụ thuộc vào việc triển khai hệ thống tệp. Bạn có thể muốn nghiên cứu thêm về điều này, xem tài liệu hệ thống tệp hoặc mã nguồn và tìm kiếm các thảo luận hiệu suất trên web. –

+1

@Zhongzhi "tại sao không di chuyển các khối cắt ngắn đến một inode mới" - Điều gì mới inode? Phân bổ một inode chỉ để làm cho chương trình của bạn nhanh hơn với chi phí của phần còn lại của hệ thống là một ý tưởng tồi tệ và một biến chứng vô nghĩa của mã FS. Điều đó hoàn toàn khác với thực tế là việc khôi phục khối khi xóa liên kết cuối cùng tới một tệp không bị tính phí cho deleter vì các khối được khôi phục không đồng bộ. –

Các vấn đề liên quan