Ну, как со всеми, "Что могло бы быть быстрее в реальных" вопросах, Вы не можете победить реальный тест.
function timeFunc($function, $runs)
{
$times = array();
for ($i = 0; $i < $runs; $i++)
{
$time = microtime();
call_user_func($function);
$times[$i] = microtime() - $time;
}
return array_sum($times) / $runs;
}
function Method1()
{
$foo = 'some words';
for ($i = 0; $i < 10000; $i++)
$t = "these are $foo";
}
function Method2()
{
$foo = 'some words';
for ($i = 0; $i < 10000; $i++)
$t = "these are {$foo}";
}
function Method3()
{
$foo = 'some words';
for ($i = 0; $i < 10000; $i++)
$t = "these are " . $foo;
}
print timeFunc('Method1', 10) . "\n";
print timeFunc('Method2', 10) . "\n";
print timeFunc('Method3', 10) . "\n";
Дают ему несколько выполнений для подкачки страниц всего в, тогда...
0.0035568
0.0035388
0.0025394
Так, как ожидалось, интерполяция фактически идентична (различия в уровне шума, вероятно, из-за дополнительных символов, которые механизм интерполяции должен обработать). Прямо конкатенация составляет приблизительно 66% скорости, которая не является никаким большим шоком. Синтаксический анализатор интерполяции посмотрит, найти, что ничто не делает, затем заканчивается с простой внутренней строкой concat. Даже если concat были дорогими, интерполятор должен будет все еще сделать это, после вся работа, чтобы проанализировать переменную и обрезать/копировать исходную строку.
Обновления Somnath:
я добавил Method4 () к вышеупомянутой оперативной логике.
function Method4()
{
$foo = 'some words';
for ($i = 0; $i < 10000; $i++)
$t = 'these are ' . $foo;
}
print timeFunc('Method4', 10) . "\n";
Results were:
0.0014739
0.0015574
0.0011955
0.001169
, Когда Вы просто объявляете строку только и никакую потребность проанализировать ту строку также, тогда почему перепутать отладчик PHP для парсинга. Я надеюсь, что Вы поняли мою мысль.
Используйте это для отображения восьмеричных значений (числовые разрешения chmod) и имени файла:
stat -c '%a %n' *
Дополнительные параметры см. В stat .
Для более эффективного способ сделать это с помощью псевдонима, см. мой комментарий ниже.
Closest I can think of (keeping it simple enough) is stat
, assuming you know which files you're looking for. If you don't, *
can find most of them:
/usr/bin$ stat -c '%a %n' *
755 [
755 a2p
755 a2ps
755 aclocal
...
It handles sticky, suid and company out of the box:
$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo
нет, он может печатать только цифровые идентификаторы / идентификаторы.
вы можете просто использовать GNU find.
find . -printf "%m:%f\n"
@The MYYN
вау, классная awk! А как насчет suid, sgid и липкого бит?
Вы должны расширить свой фильтр с помощью s и t, иначе они не будут учитываться, и вы получите неправильный результат. Чтобы вычислить восьмеричное число для этих специальных флагов, процедура та же, но с индексами 4, 7 и 10. Возможные флаги для файлов с установленным битом выполнения: --- s - s - t
amd для файлов без установленного бита выполнения: --- S - S - T
ls -l | awk '{
k = 0
s = 0
for( i = 0; i <= 8; i++ )
{
k += ( ( substr( $1, i+2, 1 ) ~ /[rwxst]/ ) * 2 ^( 8 - i ) )
}
j = 4
for( i = 4; i <= 10; i += 3 )
{
s += ( ( substr( $1, i, 1 ) ~ /[stST]/ ) * j )
j/=2
}
if ( k )
{
printf( "%0o%0o ", s, k )
}
print
}'
Для теста:
touch blah
chmod 7444 blah
приведет к:
7444 -r-Sr-Sr-T 1 cheko cheko 0 2009-12-05 01:03 blah
, а
touch blah
chmod 7555 blah
даст:
7555 -r-sr-sr-t 1 cheko cheko 0 2009-12-05 01:03 blah