मैं एक रेल 6 प्लेटफॉर्म पर डिस्क प्रदर्शन का एक सरल परीक्षण चलाने के लिए चाहता हूं। यह सिर्फ डिस्क पर 1 जी बाइट लिखना है। मैंने पाया कि फ़ाइल पहले अनलिंक की गई थी, तो इसे छोटा कर दिया गया था जितना तेज़ होगा। यह लगभग 1.5 बनाम 15s बनाम था।fwrite() तेज़ी से है अगर फ़ाइल को छिड़कने से पहले फ़ाइल में
क्यों? मैंने सोचा कि अनलिंक() आखिरी हार्ड लिंक फ़ाइल को 0 पर छोटा कर देगा और इनोड को हटा देगा। क्यों trwrites truncate से अनलिंक() के साथ तेजी से थे?
#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;
}
एलेक्सी, आपके उत्तर के लिए धन्यवाद। मुझे इस बारे में एक ही विचार था हालांकि मुझे यकीन नहीं है। लेकिन फिर भी मुझे समझ में नहीं आता कि इस तरह का कटाव क्यों लागू नहीं किया जाता है। यदि फ़ाइल को शून्य पर छोटा कर दिया गया है, तो क्यों न छंटनी वाले ब्लॉक को एक नए इनोड में ले जाएं और वर्तमान इनोड को अगले लिखने के लिए साफ रखें? – Zhongzhi
मुझे निश्चित रूप से पता नहीं है। वास्तव में, आपके प्रश्न का उत्तर फ़ाइल सिस्टम के कार्यान्वयन पर निर्भर करता है। आप इसे और अधिक शोध करना चाहते हैं, फ़ाइल सिस्टम दस्तावेज़ या स्रोत कोड देखें और वेब पर प्रदर्शन चर्चाएं देखें। –
@ झोंगज़ी "क्यों न किए गए ब्लॉक को एक नए इनोड में नहीं ले जाएं" - नया नया इनोड क्या है? सिस्टम के बाकी हिस्सों के खर्च पर अपने कार्यक्रम को तेजी से बनाने के लिए एक इनोड आवंटित करना एक लुभावनी विचार और एफएस कोड की एक व्यर्थ जटिलता है। यह इस तथ्य से काफी अलग है कि फाइल के आखिरी लिंक को हटाने पर पुनर्विचार को हटाने के लिए शुल्क नहीं लिया जाता है क्योंकि ब्लॉक को असीमित रूप से पुनः प्राप्त किया जाता है। –