быстрее ли $str .= <строковое выражение> чем $tmp = <строк. выр.>; $str .= $tmp ?
будет ли происходить лишнее копирование полученной строки в $tmp или
полученная строка будет просто названа $tmp ?
for($i = 0; $i < 10000000; ++$i) {
}
echo microtime() - start();
записать заново и присвоить.
Цикл в 1000000 итерациц покажет, но не существенно.
Нифига он не покажет. Втыкнется какойто процес и все попортит :).
2Автор. А что ето вы так оптимизируете ? Не лутше ли в даном случае больше думать о читабельности нежели о быстродействии.
Алгоритм декриптования.
А где взять эту функцию microtime, а то мне кажеться, что она ПХП-ая, а не Перловая ?
2Rebbit Можно прогнать пару десятков раз ))))
Да, точно, забыл указать Пёрл. Извиняюсь.
$str = "Hello World";
$n = 1000000;
$t0 = [gettimeofday];
for($i = 0; $i < $n; ++$i) {
$str2 .= substr($str, 1, 5);
}
print tv_interval($t0)."\n";
$t0 = [gettimeofday];
for($i = 0; $i < $n; ++$i) {
$tmp = substr($str, 1, 5);
$str1 .= $tmp;
}
print tv_interval($t0)."\n";
D:\workspace\_Perl>perl str.pl
4.217489
4.452128
большая блин разница
use Time::HiRes;
$time_1 = [Time::HiRes::gettimeofday()];
foreach (1 .. 100000000)
{
my $str .="qwertyuioplkjhgfdsazxcvbnm";
}
my $time_2 = [Time::HiRes::gettimeofday()];
print Time::HiRes::tv_interval($time_1, $time_2), "\n";
результат прогона - 38.8905 секунд
use Time::HiRes;
$time_1 = [Time::HiRes::gettimeofday()];
foreach (1 .. 100000000)
{
my $tmp = "qwertyuioplkjhgfdsazxcvbnm";
my $str .= $tmp;
}
my $time_2 = [Time::HiRes::gettimeofday()];
print Time::HiRes::tv_interval($time_1, $time_2), "\n";
57.794762
use Time::HiRes;
$time_1 = [Time::HiRes::gettimeofday()];
my $tmp = "qwertyuioplkjhgfdsazxcvbnm";
foreach (1 .. 100000000)
{
;
my $str .= $tmp;
}
my $time_2 = [Time::HiRes::gettimeofday()];
print Time::HiRes::tv_interval($time_1, $time_2), "\n";
38.84418
делаем выводы сами :)
hint: код без use strict будет всегда отрабатывать медленее аналогичного с use strict. а в твоем варианте - код вообще убьет машину на большом числе прогонов. и еще - вариант, когда используется временная переменная - дает меньший расход по памяти :)
спасибо за эти тесты. Ваш второй тест показал,
что Пёрл не произвёл очевидную оптимизацию.
Но в моём случае временную переменную нельзя вынести из цикла,
так как на каждой итерации она получает новое значение.
Но я вот немного изменил свой тест и увидил,
что копирование производится независимо от того,
присваиваем ли мы переменной LVALUE или результат выражения
(лично я думал, что лишнее копирование должно происходить
только при присваивании LVALUE):
use Time::HiRes qw(gettimeofday tv_interval);
$str = "Hello World";
$n = 1000000;
$t0 = [gettimeofday];
for($i = 0; $i < $n; ++$i) {
$str2 .= $str;
}
print tv_interval($t0)."\n";
$t0 = [gettimeofday];
for($i = 0; $i < $n; ++$i) {
$tmp = $str;
$str1 .= $tmp;
}
print tv_interval($t0)."\n";
D:\workspace\_Perl>perl str2.pl
18.218973
18.95373
что Пёрл не произвёл очевидную оптимизацию.
что вы имеете ввиду? =\\
ну он же мог понять, что не нужно на каждой итерации создавать
временную переменную с одним и тем же значением.
вообще - правильнее было бы все объявления my вывести за цикл, чтобы они не уничтожались при каждой итерации, но тогда, боюсь, у меня бы быстро кончилась память
вообще - правильнее было бы все объявления my вывести за цикл, чтобы они не уничтожались при каждой итерации, но тогда, боюсь, у меня бы быстро кончилась память
думаете тогда при присвоении нового значения,
старое бы не удалялось из памяти ?
если Вы про свой код, то там конечно мне непонятно,
почему переменная $str локальная в цикле.
в моём примере последняя операция в цикле накопительная
и производиться над нелокальной для цикла переменной.