2010-04-22 10 views
6

Có một cuộc tranh luận nhỏ liên quan đến tốc độ của fnmatch qua pathinfo đây: how to check if file is php?pathinfo vs fnmatch

Tôi đã không hoàn toàn bị thuyết phục để quyết định điểm chuẩn hai chức năng.

Sử dụng đường dẫn động và tĩnh cho thấy rằng đường dẫn nhanh hơn.

Logic và kết thúc điểm chuẩn của tôi có hợp lệ không?

EDIT: Dùng mac php từ cmd

PHP 5.3.0 (cli) (được xây dựng: ngày 20 tháng 7 năm 2009 13:56:33) Bản quyền (c) 1997-2009 Các PHP Nhóm Zend Engine v2.3.0, Bản quyền (c) 1998-2009 Zend Technologies

con đường năng động pathinfo 3,2973630428314 fnmatch 3,4520659446716 x1.05

con đường tĩnh pathinfo ,86487698554993 fnmatch 1,0420439243317 x1.2

mac xampp php từ cmd

PHP 5.3.1 (cli) (được xây dựng: 27 Tháng Hai 2010 12:41:51) Bản quyền (c) 1997- 2009 PHP Nhóm Zend Engine v2.3.0, Bản quyền (c) 1998-2009 Zend Technologies

con đường năng động pathinfo 3,63922715187 fnmatch 4,99041700363 x1.37

đường tĩnh pathinfo 1.03110480309 fnmatch 2.38929820061 x2.32

tôi bao gồm một mẫu của các kết quả đó là trong vài giây cho 100.000 lặp trên máy tính của tôi:

dynamic path 
pathinfo 3.79311800003 
fnmatch 5.10071492195 
x1.34 

static path 
pathinfo 1.03921294212 
fnmatch 2.37709188461 
x2.29 

Code:

<pre> 
<?php 

$iterations=100000; 

// Benchmark with dynamic file path 
print("dynamic path\n"); 

$i=$iterations; 
$t1=microtime(true); 
while($i-->0){ 
    $f='/'.uniqid().'/'.uniqid().'/'.uniqid().'/'.uniqid().'.php'; 
    if(pathinfo($f,PATHINFO_EXTENSION)=='php') $d=uniqid(); 
} 
$t2=microtime(true) - $t1; 

print("pathinfo $t2\n"); 

$i=$iterations; 
$t1=microtime(true); 
while($i-->0){ 
    $f='/'.uniqid().'/'.uniqid().'/'.uniqid().'/'.uniqid().'.php'; 
    if(fnmatch('*.php',$f)) $d=uniqid(); 
} 
$t3 = microtime(true) - $t1; 

print("fnmatch $t3\n"); 

print('x'.round($t3/$t2,2)."\n\n"); 

// Benchmark with static file path 
print("static path\n"); 

$f='/'.uniqid().'/'.uniqid().'/'.uniqid().'/'.uniqid().'.php'; 

$i=$iterations; 
$t1=microtime(true); 
while($i-->0) if(pathinfo($f,PATHINFO_EXTENSION)=='php') $d=uniqid(); 
$t2=microtime(true) - $t1; 

print("pathinfo $t2\n"); 

$i=$iterations; 
$t1=microtime(true); 
while($i-->0) if(fnmatch('*.php',$f)) $d=uniqid(); 
$t3=microtime(true) - $t1; 

print("fnmatch $t3\n"); 

print('x'.round($t3/$t2,2)."\n\n"); 

?> 
</pre> 
+0

phải là một CW vì nó không phải là một câu hỏi thực sự tôi đoán – Gordon

+0

Đó là một câu hỏi thực sự! Tại sao những người khác lại đạt được kết luận khác? – zaf

+0

Bạn đã chạy thử nghiệm bao nhiêu lần? Trên các máy đa nhiệm, một số tác vụ có thể bị trì hoãn, làm chậm các phần mã có thể nhanh hơn. – webbiedave

Trả lời

0

Tôi đã bỏ phiếu tán thành tất cả các câu trả lời nhưng sẽ trả lời câu hỏi của riêng tôi.

Logic và kết quả điểm chuẩn của tôi là hợp lệ VÀ tất cả các điểm chuẩn câu trả lời đều hợp lệ.

Tôi đã tìm ra lý do tại sao, điều này đã đưa ra một câu hỏi khác nhưng thay vào đó làm cho bài đăng này diễn ra tiếp tuyến và làm cho nó còn lâu hơn nữa, tôi sẽ mở một câu hỏi khác. Tôi sẽ đặt liên kết mới ở đây khi tôi đã làm như vậy.

Cảm ơn bạn đã đánh giá điểm chuẩn cho tôi!

EDIT: đây là câu hỏi phần 2: (Pathinfo vs fnmatch part 2) Speed benchmark reversed on Windows and Mac

1

kết quả của tôi là đối diện của bạn:

php -f 2693428.php 
dynamic path 
pathinfo 4.5834331512451 
fnmatch 3.2174317836761 
x0.7 

static path 
pathinfo 2.1787130832672 
fnmatch 0.95714497566223 
x0.44 

Phiên bản

PHP 5.3.0 (cli) (built: Jun 29 2009 21:25:23) 
Copyright (c) 1997-2009 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies 
1

Chạy bạn với

PHP 5.3.2 (cgi-fcgi) (built: Mar 3 2010 20:47:00) 
Copyright (c) 1997-2010 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies 
with Zend Debugger v5.3, Copyright (c) 1999-2010, by Zend Technologies 

cho

dynamic path 
pathinfo 3.4931519031525 
fnmatch 2.8633069992065 
x0.82 

static path 
pathinfo 0.83261299133301 
fnmatch 0.28636598587036 
x0.34 

Bốn

function hasExtension1($ext, $filename) 
{ 
    return !strcasecmp(pathinfo($filename, PATHINFO_EXTENSION), $ext); 
} 

function hasExtension2($ext, $filename) 
{ 
    return fnmatch("*.$ext", $filename, FNM_CASEFOLD); 
} 

function hasExtension3($ext, $filename) 
{ 
    return strripos($filename, $ext) === strlen($filename) - strlen($ext); 
} 

function hasExtension4($ext, $filename) 
{ 
    return !strcasecmp(substr($filename, -strlen($ext)), $ext); 
} 

khi chạy như thế này

for($i=0;$i<10000;$i++) hasExtension1('php', __FILE__); 
for($i=0;$i<10000;$i++) hasExtension2('php', __FILE__); 
for($i=0;$i<10000;$i++) hasExtension3('php', __FILE__); 
for($i=0;$i<10000;$i++) hasExtension4('php', __FILE__); 

và cấu hình trên máy tính của tôi từ Zend Studio cho

Average Mean Time = 0.000007 
Average Mean Time = 0.000006 
Average Mean Time = 0.000005 
Average Mean Time = 0.000003 

tôi thấy nó hơi khó chịu mà không có 4 là nhanh nhất, nhưng đó là những gì nó nói. Và với 0,0000000 giây mỗi cuộc gọi, không có gì phải bận tâm.

1

Sử dụng mã điểm chuẩn cùng

dynamic path 
pathinfo 2.6542711257935 
fnmatch 1.9943950176239 
x0.75 

static path 
pathinfo 1.1711349487305 
fnmatch 0.54186105728149 
x0.46 

PHP Version 5.3.1 
Build Date Nov 20 2009 17:20:57 
Compiler MSVC6 (Visual C++ 6.0) 
Architecture x86 
Thread Safety enabled 
Zend Memory Manager enabled 
Zend Multibyte Support disabled 
1

tôi sẽ ném kết quả của tôi ở đây:

dynamic path 
pathinfo 4.9078891277313 
fnmatch 4.3466200828552 
x0.89 

static path 
pathinfo 1.4787950515747 
fnmatch 0.98351812362671 
x0.67 

Nhưng hãy nhớ bình luận ban đầu của tôi về vấn đề bạn có liên quan đến:

Tốc độ liên quan, fnmatch sẽ xuất hiện thực hiện đường dẫn 2: 1 khi được sử dụng cho mục đích này.

Cụ thể cho phân nhánh trên một tiện ích mở rộng cụ thể.