2010-11-04 12 views
7

मैंने दोनों कार्यों की गति की तुलना करने और मापने के लिए कुछ परीक्षण किए हैं। is_file कई गुना तेजी से file_exists से (मैं दोनों के लिए 10000 पुनरावृत्तियों प्रयुक्त) हो रहा है। मुझे आश्चर्य है कि क्या PHP या ओएस इन कार्यों के लिए कुछ कैश का उपयोग करते हैं या हमेशा एचडीडी तक पहुंचते हैं? मुझे पता नहीं लगता है, लेकिन मुझे आश्चर्य है कि ...is_file/file_exists प्रदर्शन और कैश

मैं इस कोड का इस्तेमाल किया:

<?php 
$time = microtime(); 
$time = explode(' ', $time); 
$begintime = $time[1] + $time[0]; 
for($i=0;$i<10000;$i++) 
    file_exists('/Applications/MAMP/htdocs/index.php'); 
$time = microtime(); 
$time = explode(" ", $time); 
$endtime = $time[1] + $time[0]; 
$totaltime = ($endtime - $begintime); 
echo 'PHP parsed this in ' .$totaltime. ' seconds.</br>'; 
$time = microtime(); 
$time = explode(" ", $time); 
$begintime = $time[1] + $time[0]; 
for($i=0;$i<10000;$i++) 
    is_file('/Applications/MAMP/htdocs/index.php'); 
$time = microtime(); 
$time = explode(" ", $time); 
$endtime = $time[1] + $time[0]; 
$totaltime = ($endtime - $begintime); 
echo 'PHP parsed this in ' .$totaltime. ' seconds.</br>'; 
?> 
+3

आप एक तंग पाश (जहां इस आशय का अनुरोध समय पर हावी होगा) में यह कई बार कर रहे हैं? यदि नहीं, तो मैं इसके बारे में चिंता नहीं करता जबतक कि आप सुनिश्चित नहीं हैं कि यह आपको एक प्रदर्शन समस्या का कारण बन रहा है ... याद रखें कि 'समयपूर्व अनुकूलन सभी बुराई की जड़ है ... जब तक आप जानते हैं कि यह कोई समस्या नहीं है, तब तक अर्थपूर्ण रूप से बेहतर विकल्प का उपयोग करें और फिर तब अनुकूलित करें और केवल तभी ... – ircmaxell

+0

दरअसल, is_file() file_exists() से 10 गुना तेज है! बस कोशिश की, और यह सच है। – forthrin

+0

यदि यह किसी को भी मदद करता है तो हम जोड़ सकते हैं कि file_exists() दोनों निर्देशिकाओं और फ़ाइलों के लिए सत्य वापस आ जाएंगे, जहां is_file() केवल एक फ़ाइल है (और निश्चित रूप से मौजूद है) सत्य वापस आ जाएगा। – aesede

उत्तर

8

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

प्रभावित कार्यों स्टेट(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime में शामिल हैं() , fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), फ़ाइल आकार(), फ़ाइल प्रकार(), और fileperms()।

+2

लेकिन दोनों फ़ंक्शंस उस सूची में हैं, इसलिए ऐसा लगता है कि कोई दूसरे की तुलना में बहुत तेज क्यों नहीं होगा। – thomasrutter

+3

आप पहले 'file_exists()' परीक्षण निष्पादित करते हैं, जिसे डिस्क और स्टोर से वास्तविक पढ़ने को statcache में करना है; फिर आप 'is_file()' निष्पादित करते हैं जो केवल 'file_exists()' चेक द्वारा पॉप्युलेट किए गए स्टेटकैच एंट्री को पढ़ता है, इसलिए यह बहुत तेज है (आश्चर्य की बात नहीं है)। परीक्षणों के बीच कैश को फ्लश करें, और फिर आप 'is_file()' का सटीक परीक्षण करेंगे क्योंकि इसे डिस्क की जांच करनी होगी और कैश को उसी तरह से पॉप्युलेट करना होगा जैसे 'file_exists() ' –

+0

आपका उत्तर ... भी था बहुत धीमी इसे देखें कि यह बेहतर है;) – thomasrutter

9

पीएचपी कैश दोनों is_file() और file_exists() स्टेट कैश में। इसे साफ़ करने के लिए clearstatcache() पर कॉल करें।

संपादित करें:
कुछ भी करते हैं, तो दो समय की समान मात्रा में लेना चाहिए, क्योंकि वे दोनों फोन ओएस stat() function, लेकिन एक के परिणामों PHP द्वारा दूसरे के लिए कैश की जा सकती (जब तक आप clearstatcache()) या के रूप में ओएस द्वारा यूलि नीचे उल्लेख करता है।

+2

ध्यान दें कि ऑपरेटिंग सिस्टम की फ़ाइल सिस्टम कैश – Yuliy

+0

'स्ट्रेस' के कारण फ़ाइल ऑपरेशंस जोखिम पर प्रदर्शन माप अलग-अलग दिखाता है file_exists' access '(foo ", F_OK)'' is_file' 'stat (" foo ", 0x7fffe720a8a0)' ' – Bell

2

is_file और file_exists दो अलग-अलग फ़ंक्शन हैं जो दो अलग-अलग चीजें करते हैं; file_exists केवल जांचें कि फ़ाइल मौजूद है या नहीं, is_file बताएं कि लक्ष्य एक वैध फ़ाइल है, और (उदाहरण के लिए) निर्देशिका नहीं है।

वे एक ही लक्ष्य के लिए इस्तेमाल नहीं होना चाहिए, इसलिए प्रदर्शन की तुलना में किया जा नहीं कर सकते (imho)

+0

यह पूरी तरह से सही नहीं है। हालांकि कार्यों को डिजाइन किया गया था, लक्ष्य वांछित परिणाम प्राप्त करना है। इस मामले में, if_file() और file_exists() दोनों मौजूद हैं अगर फ़ाइल मौजूद नहीं है। और बेंचमार्क साबित करते हैं कि is_file() का उपयोग file_exists() का उपयोग कर आपके एप्लिकेशन को एक समान एप्लिकेशन पर बढ़त देगा। – stillstanding

+0

@stillstanding: लेकिन हम किस तरह के किनारे के बारे में बात कर रहे हैं? चूंकि डिस्क 'stat()' सबसे धीमा हिस्सा होने जा रहा है, इसलिए मुझे आश्चर्य होगा कि दोनों एक या दो प्रतिशत से अधिक भिन्न हैं। आखिरकार, दोनों एक ही डेटा का उपयोग करते हैं, एक जल्द ही लौटता है (और दोनों केवल एक सिस्टम कॉल कर रहे हैं) ... कम से कम यह मेरी समझ है ... – ircmaxell

+0

@stillstanding: कौन सा मानक? मुझे लगता है कि 'file_exists' थोड़ा तेज होगा, क्योंकि यह जांचना नहीं है कि [stat struct] (http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/stat.h.html) 'mode_t' में S_IFDIR है या नहीं। – Powerlord

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