fnmatch vs pathinfo

5 Cevap php

Burada pathinfo üzerinde fnmatch hızıyla ilgili küçük bir tartışma vardı: http://stackoverflow.com/questions/2692536/how-to-check-if-file-is-php

Ben bu yüzden iki fonksiyon kriter karar tamamen ikna değildi.

Dinamik ve statik yolları kullanarak pathinfo daha hızlı olduğunu gösterdi.

Benim kıyaslama mantık ve sonuç geçerli mi?

EDIT: cmd mac php kullanma

PHP 5.3.0 (cli) (built: Jul 20 2009 13:56:33) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

dynamic path pathinfo 3.2973630428314 fnmatch 3.4520659446716 x1.05

static path pathinfo 0.86487698554993 fnmatch 1.0420439243317 x1.2

cmd mac xampp php

PHP 5.3.1 (cli) (built: Feb 27 2010 12:41:51) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

dynamic path pathinfo 3.63922715187 fnmatch 4.99041700363 x1.37

static path pathinfo 1.03110480309 fnmatch 2.38929820061 x2.32

Benim makinede 100.000 tekrarlamalar saniye olan sonuçların bir örnek sayılabilir:

dynamic path
pathinfo 3.79311800003
fnmatch 5.10071492195
x1.34

static path
pathinfo 1.03921294212
fnmatch 2.37709188461
x2.29

Kod:

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

5 Cevap

Ben tüm cevapları upvoted ettik ama benim kendi soruya cevap verecektir.

Benim kıyaslama mantık ve sonuç geçerli ve tüm cevaplar kriterler geçerlidir.

Başka bir soru gündeme ziyade bu yazı bir teğet kapalı gitmek yapma ve hatta artık ben başka bir soru açıyor olacağız yapma sebebini ise, buldum. Ben öyle yaptım ben buraya yeni bir bağlantı koyacağım.

Benim için kıyaslama için teşekkürler!

EDIT: http://stackoverflow.com/questions/2759548/pathinfo-vs-fnmatch-part-2-speed-benchmark-reversed-on-windows-and-mac: burada bölüm 2 soru

Benim sonuçları senin tersi:

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

static path
pathinfo 2.1787130832672
fnmatch 0.95714497566223
x0.44

Versiyon

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

Aynı kıyaslama kodu kullanarak

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

Ile sizin Koşu

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

verir

dynamic path
pathinfo 3.4931519031525
fnmatch 2.8633069992065
x0.82

static path
pathinfo 0.83261299133301
fnmatch 0.28636598587036
x0.34

Bu dört

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);
}

Böyle çalıştırdığınızda

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__);

ve Zend Studio benim makinede profilli vermek

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

Ben biraz can sıkıcı hiçbir 4 en hızlı olduğunu bulmak, ama o ne diyor. Ve çağrı başına 0.00000n saniye ile yine rahatsız bir şey yok.

Ben buraya sonuçları atmak olacak:

dynamic path
pathinfo 4.9078891277313
fnmatch 4.3466200828552
x0.89

static path
pathinfo 1.4787950515747
fnmatch 0.98351812362671
x0.67

Ama aklınızda bağlantılı soru üzerine benim orijinal Yorum tutmak:

Concerning speed, fnmatch will out perform pathinfo 2:1 when used for this purpose.

Belirli bir uzantısı üzerinde dallanma Özgü.