2012-02-07 10 views
21

मैं fs.Length का उपयोग कर रहा हूं, जहां fsFileStream है।फ़ाइल की लंबाई पढ़ने के लिए सबसे तेज़ तरीका सी #

क्या यह O(1) ऑपरेशन है? मुझे लगता है कि यह फाइल के गुणों से सिर्फ पढ़ेगा, क्योंकि फाइल के माध्यम से जाने के विरोध में यह पता लगाने के लिए कि खोज स्थिति अंत तक पहुंच गई है। जिस फ़ाइल को मैं लंबाई ढूंढने की कोशिश कर रहा हूं वह आसानी से 1 एमबी से 4-5 जीबी तक हो सकती है।

हालांकि मैंने देखा कि FileInfo वर्ग है, जिसमें Length संपत्ति भी है।

क्या इन दोनों Length गुण सैद्धांतिक रूप से समान समय लेते हैं? या fs.Length धीमा है क्योंकि इसे पहले FileStream खोलना होगा?

उत्तर

30

.NET में फ़ाइल का आकार प्राप्त करने का प्राकृतिक तरीका FileInfo.Length संपत्ति है जिसका आपने उल्लेख किया है।

मुझे यकीन है कि Stream.Length धीमी है (यह पूरी फ़ाइल वैसे भी पढ़ा नहीं होगा) नहीं हूँ, लेकिन यह निश्चित रूप से एक FileStream के बजाय FileInfo उपयोग करने के लिए यदि आप फ़ाइल को पढ़ने की योजना नहीं है और अधिक स्वाभाविक है।

private static void Main(string[] args) 
{ 
    string filePath = ...; // Path to 2.5 GB file here 

    Stopwatch z1 = new Stopwatch(); 
    Stopwatch z2 = new Stopwatch(); 

    int count = 10000; 

    z1.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     long length; 
     using (Stream stream = new FileStream(filePath, FileMode.Open)) 
     { 
      length = stream.Length; 
     } 
    } 

    z1.Stop(); 

    z2.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     long length = new FileInfo(filePath).Length; 
    } 

    z2.Stop(); 

    Console.WriteLine(string.Format("Stream: {0}", z1.ElapsedMilliseconds)); 
    Console.WriteLine(string.Format("FileInfo: {0}", z2.ElapsedMilliseconds)); 

    Console.ReadKey(); 
} 

परिणाम:

Stream: 886 
FileInfo: 727 
+0

दुष्ट, समय की जानकारी के लिए धन्यवाद! – jpints14

+1

उस तरह से बेंचमार्किंग एक अंतर के लिए परीक्षण का सबसे प्रभावी तरीका नहीं हो सकता है (यदि कोई है तो)। मुझे लगता है कि डिस्क कैशिंग/ओएस कारक समय को कम रखने में काफी भूमिका निभाएंगे। – PaulG

+0

@PaulG आप बहुत सही हैं। बेंचमार्किंग ** हमेशा ** दिखता है उससे कहीं अधिक जटिल है। ** ** से ऊपर का सरल बेंचमार्क वास्तविक परिणाम के बारे में _ कुछ संकेत देता है। चूंकि यह वापस नहीं आता है 100000 बनाम 250, मुझे लगता है कि यह निष्कर्ष निकालना संभव है कि दोनों विधियां बहुत अलग नहीं हैं_ (गणना समय के संदर्भ में)। – ken2k

23

दोनों पूरी फ़ाइल पढ़ने के बजाय फ़ाइल सिस्टम मेटाडेटा तक पहुंचेंगे। मुझे नहीं पता कि अंगूठे के नियम के रूप में कौन सा अधिक कुशल है, मैं कहूंगा कि यदि आप केवल लंबाई (और अन्य मेटाडाटा) जानना चाहते हैं, तो FileInfo का उपयोग करें - जबकि यदि आप फ़ाइल को एक के रूप में खोल रहे हैं वैसे भी स्ट्रीम, FileStream.Length का उपयोग करें।

+0

धन्यवाद श्री स्कीट


यहां एक छोटा बेंचमार्क है कि कुछ संख्यात्मक मान प्रदान करेगा है! – jpints14