2009-11-10 12 views
12

पुन: http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspxफ़ाइल है। एक महंगा ऑपरेशन करता है?

क्या किसी को पता है कि यह एक विशेष रूप से धीमा या लॉकिंग ऑपरेशन है जो बड़े वातावरण में सर्वर प्रदर्शन को प्रभावित कर सकता है?

+3

परिभाषित "बड़े पर्यावरण" – jldupont

+1

यह भी ध्यान रखें कि File.Exists() लगभग कभी भी कॉल करने की आवश्यकता नहीं है।इसका उपयोग आमतौर पर भविष्य के आईओ ऑपरेशन को प्रमाणित करने के लिए किया जाता है, लेकिन यह वास्तव में ऐसा नहीं कर सकता है, क्योंकि फ़ाइल के अस्तित्व को समय के बीच बदल दिया जा सकता है और समय IO ऑपरेशन किया जाता है। आमतौर पर ऑपरेशन की कोशिश करने के लिए बेहतर होता है, और यह देखता है कि यह काम करता है या नहीं। जाहिर है, इसके कई काउंटर-उदाहरण हैं, और आपका ऐप उनमें से एक के रूप में योग्य हो सकता है। –

+1

IO.File.Exists का एक और उदाहरण यह देखने के लिए है कि यह प्रदर्शित करने से पहले कोई छवि मौजूद है या नहीं, और यदि कोई विकल्प नहीं दिखता है तो यह प्रदर्शित करना है। – SteveGSD

उत्तर

5

लॉकिंग नंबर। धीमा, इस बात पर निर्भर करता है कि आप इसकी तुलना किस प्रकार कर रहे हैं। जहां तक ​​I/O जाता है, यह काफी सस्ते है, लेकिन अन्य ऑपरेशन की तुलना में I/O आम तौर पर धीमा होता है। इसलिए, यदि आपको इसका उपयोग करना चाहिए, तो इससे बहुत बुरा नहीं होगा। हालांकि, मैं वास्तव में आवश्यक से अधिक बार इसे कॉल करने की कोशिश नहीं करता! :-)

7

मुझे नहीं लगता कि यह है (फ़ाइल ऑपरेशंस को अत्यधिक अनुकूलित किया जाता है और अधिकांश ओएस पर कैश किया जाता है) और अधिकांश अन्य परिचालनों में यहां अपराधी होने की संभावना अधिक होती है (सॉकेट, डीबी एक्सेस, सामान्य प्रसंस्करण, आदि)। लेकिन, सामान्य रूप से, सबसे अच्छा तरीका वास्तव में आपके आवेदन को प्रोफ़ाइल करना है और देखें कि यह एक हॉटस्पॉट है या नहीं।

1

File.Exisits kernel32.dll के साथ फ़ाइल को फर्स्टफाइल खुले हैंडलर के साथ खोजें। यदि परिणामी हैंडल अमान्य है, तो यह झूठी वापसी करता है। यदि मान्य है तो यह सभी सामग्री जैसे LastAccessTime, CreationTime, फ़ाइल आकार आदि के साथ डेटा संरचना भरें। और फिर सच हो जाओ। कुछ भी अवरुद्ध नहीं है।

2

सर्वश्रेष्ठ आपके पर्यावरण में कुछ परीक्षण चलाने के लिए होगा। मेरे पास एक ऐप है जो मेरे सिस्टम में हिचकी के बिना प्रति सेकंड 10,000+ कर सकता है। मैं बहुत तेज़ मानता हूं।

9

कंप्यूटिंग में, वास्तव में "महंगा ऑपरेशन" जैसी कोई चीज़ नहीं है, जब तक कि आप इस बात पर विचार न करें कि यह महंगा है।

उदाहरण के लिए, वास्तविक दुनिया में, किसी ऑब्जेक्ट के लिए $ 2.000.000 महंगा होगा? क्या होगा यदि यह बहामा की कीमत है? क्या यह महंगा होगा? दूध के एक दफ़्ती के बारे में क्या? क्या यह महंगा है?

आपको जिस चीज पर विचार करने की आवश्यकता है वह यह है कि File.Exists आपके द्वारा किए जाने वाले समग्र संचालन के मामले में महंगा है, और क्या आपके पास वास्तव में कोई विकल्प है या नहीं।

यदि आपके पास कोई विकल्प नहीं है, तो क्या इससे कोई फर्क पड़ता है कि यह महंगा है या नहीं?

उदाहरण के लिए, यदि आप 1 जांच करते हैं कि फ़ाइल मौजूद है या नहीं, और फिर यदि ऐसा होता है, तो आप इसे लोड करते हैं, और इसे एक घंटे तक संसाधित करते हैं, तो मुझे लगता है कि इसे महंगा नहीं माना जाएगा।

हालांकि, अगर आप एक लूप में इसे 10 बार कहते हैं, तो यह पता लगाने के लिए कि कोई फ़ाइल मौजूद है या नहीं, और फिर यदि ऐसा होता है, तो बस एक संख्या में वृद्धि करें, तो यह आपके द्वारा किया जाने वाला सबसे महंगा एकल ऑपरेशन हो सकता है।

एकमात्र तरीका जिसे आप निश्चित रूप से जान सकते हैं, यह वास्तव में मापना है कि विधि कॉल कितनी देर तक चलती है, इसकी तुलना में आप एक ही ऑपरेशन में और क्या करते हैं।

7

वर्ष 2016 में यह बहुत महंगा प्रतीत नहीं होता है और File.Exists और PathFileExists (Why is File.Exists() much slower when the file does not exist?) के बीच कोई वास्तविक अंतर नहीं लगता है। फर्क सिर्फ इतना है कि मैं का आकलन कर सकता है कि यह तो एक गैर मौजूदा फ़ाइल के लिए जाँच करने के लिए तेज है एक एक मौजूदा है:

(एक एसएसडी पर परीक्षण किया गया)

[DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)] 
private extern static bool PathFileExists(StringBuilder path); 

void Main() 
{ 
    var sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 10000; i++) 
    { 
     File.Exists(@"c:\Home\Temp\test_.log"); 
    } 
    sw.Stop(); 
    sw.Dump("File.Exists = false"); 

    sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 10000; i++) 
    { 
     File.Exists(@"c:\Home\Temp\test.log"); 
    } 
    sw.Stop(); 
    sw.Dump("File.Exists = true"); 

    var sb = new StringBuilder(@"c:\Home\Temp\test_.log"); 
    sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 10000; i++) 
    { 
     PathFileExists(sb); 
    } 
    sw.Stop(); 
    sw.Dump("PathFileExists = false"); 

    sb = new StringBuilder(@"c:\Home\Temp\test.log"); 
    sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 10000; i++) 
    { 
     PathFileExists(sb); 
    } 
    sw.Stop(); 
    sw.Dump("PathFileExists = true"); 

} 

Results

संबंधित मुद्दे