2010-11-04 14 views
7

İki işlevin de hızını karşılaştırmak ve ölçmek için bazı testler yaptım. is_file, dosya_exists'dan birkaç kat daha hızlı (her ikisi için de 10000 yineleme kullandım) görünüyor. PHP ya da işletim sisteminin bu işlevler için önbellek kullanıp kullanmadığını ya da HDD'ye her zaman erişip erişmediğini merak ediyorum. is_file/file_exists performansı ve önbellek

Bu kodu kullanılmış ... Ben hiçbir düşünüyorum, ama acaba:

<?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

Sık sık bu döngüyü birçok kez çağırıyorsunuz (bu etki, istek zamanına hükmedecek)? Aksi halde, size bir performans sorununa yol açtığından emin olmadığınız sürece endişelenmeyeceğim ... Unutmayın ki 'Erken optimizasyon tüm kötülüklerin köküdür' ... Bir problem olduğunu bilene kadar anlamsal olarak daha iyi bir alternatif kullanın. ve sonra o zaman optimize et ve sadece o zaman ... – ircmaxell

+0

Gerçekten, is_file() dosya_exists() 'den 10 kat daha hızlı! Sadece denedim ve doğru. – forthrin

+0

Eğer ekleyebileceğimiz herhangi bir kişiye yardım ederse, o file_exists(), hem dizinler hem de dosyalar için geçerli olarak dönecektir, is_file() sadece bir dosya (ve tabii ki mevcutsa) doğruysa geri dönecektir. – aesede

cevap

8

Eğer stat(), lstat() veya listelenen diğer fonksiyonların herhangi kullandığınızda etkilenen işlevler listesi (aşağıdaki), PHP , daha hızlı performansı sağlamak için işlevini döndüren bilgileri önbelleğe alır. Ancak, belirli durumlarda, önbelleğe alınmış bilgileri temizlemek isteyebilirsiniz. Örneğin, eğer aynı dosya tek komut, içinde birden çok kez kontrol ediliyor ve bu dosya bu komut dosyasının çalışması sırasında kaldırılması veya değiştirilmesi olma tehlikesi altında, durum önbelleğini temizlemek tercih edebilir. Bu durumlarında, dosyasının bir dosyasının önbelleğe alındığı bilgileri temizlemek için clearstatcache() işlevini kullanabilirsiniz.

Etkilenen fonksiyonlar) (is_writable stat(), lstat(), file_exists()(), (,) (is_readable is_executable), is_file(), is_dir(), is_link(), filectime içerir , fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype() ve dosyaperms().

+2

Ancak her iki işlev de bu listede yer alıyor, bu yüzden neden birinin diğerinden daha hızlı olacağını açıklamıyor gibi görünüyor. – thomasrutter

+3

Öncelikle diskten okunan ve statcache'ye depolanan 'file_exists()' testini yürütüyorsunuz; Daha sonra, sadece "file_exists()" denetimi tarafından doldurulmuş statcache girişini okuyan "is_file()" işlevini yürütüyorsunuz, bu yüzden (şaşırtıcı değil) çok daha hızlıdır. Önbelleği sınamalar arasında yıkayın ve daha sonra 'is_file() 'sini test edeceksiniz, çünkü diski kontrol etmek ve önbelleği dosyaya yerleştirmek zorunda olduğu için' file_exists()' –

+0

cevabınız da ... Kahrolası yavaş. Bunun iyileştirildiğini görün;) – thomasrutter

9

PHP önbelleklerini istatistik önbelleğinde hem is_file() ve file_exists(). Temizlemek için clearstatcache() numaralı telefonu arayın.

Düzenleme: İki ikisi de işletim sistemleri stat() function diyoruz çünkü zamanın benzer miktarlarda sürer, ancak birinin sonucu PHP ile diğeri için önbelleğe alınmış olabilir
şey olursa ya da işletim sistemi olarak tarafından (sizin clearstatcache() sürece) Yuliy aşağıdan bahseder.

+2

Dosya işlemlerinde performans ölçümlerinin, işletim sisteminin dosya sistemi önbelleği – Yuliy

+0

'strace' nedeniyle değişkenlik gösterdiğine dikkat edin. File_exists, 'access (" foo ", F_OK)" işlevlerini gösterirken "is_file", "stat (" foo ", 0x7fffe720a8a0)" işlevlerini gösterir. – Bell

2

is_file ve file_exists iki farklı işlevi olan iki farklı işlevdir; file_exists sadece dosyanın mevcut olup olmadığını kontrol edin, is_file hedefin geçerli bir dosya olup olmadığını ve (örneğin) bir dizin olmadığını söyleyin.

Aynı hedef için kullanılacak should not, bu yüzden performans karşılaştırma yapılabilir olamaz

(imho)

+0

bu tamamen doğru değil. Ancak işlevler tasarlandı, amaç istenen sonucu elde etmektir. Bu durumda, dosya mevcut değilse, is_file() ve file_exists() öğesi false değerini döndürür. ve kıyaslamalar is_file() işlevinin, uygulamanıza file_exists() kullanılarak benzer bir uygulama üzerinde bir kenar sağladığını kanıtlar. – stillstanding

+0

@stillstanding: Ama ne tür bir sınırdan bahsediyoruz? 'Stat()' diski en yavaş kısım olacağından, iki tanesi MAYBE'den bir veya iki yüzde daha farklıysa şaşırırdım. Her şeyden önce, her ikisi de aynı verileri kullanır, biri daha erken döner (ve her ikisi de sadece bir sistem çağrısı yapmalıdır). En azından bu benim anlayışımı ... – ircmaxell

+0

@stillstanding: Hangi kriterler? [Stat yapısını] (http://www.opengroup.org/onlinepubs/000095399/basedefs/sys/stat.h.html) kontrol etmek zorunda olmadığından, 'file_exists'in biraz daha hızlı olacağını düşünüyorum. 's 'mode_t' S_IFDIR içeriyor ya da değil. – Powerlord