Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

быстрее ли $str .= <строковое выражение> чем $tmp = <строк. выр.>; $str .= $tmp ?

1.0K
28 января 2008 года
diesel_den
169 / / 22.12.2005
Если да, то на сколько быстрее ?
будет ли происходить лишнее копирование полученной строки в $tmp или
полученная строка будет просто названа $tmp ?
1.0K
28 января 2008 года
diesel_den
169 / / 22.12.2005
мне кажеться вопрос именно в том, что присваивается - строковая переменная или строковое выражение
15
28 января 2008 года
shaelf
2.7K / / 04.05.2005
Меня всегда убивали вопросы "что быстрее".
 
Код:
$start = microtime();
for($i = 0; $i < 10000000; ++$i) {

}
echo microtime() - start();
383
28 января 2008 года
zoh
237 / / 03.04.2005
Логически присвоить значение к строке быстрее чем
записать заново и присвоить.
Цикл в 1000000 итерациц покажет, но не существенно.
276
28 января 2008 года
Rebbit
1.1K / / 01.08.2005
Цитата: zoh
Цикл в 1000000 итерациц покажет, но не существенно.


Нифига он не покажет. Втыкнется какойто процес и все попортит :).
2Автор. А что ето вы так оптимизируете ? Не лутше ли в даном случае больше думать о читабельности нежели о быстродействии.

1.0K
28 января 2008 года
diesel_den
169 / / 22.12.2005
Цитата: Rebbit
2Автор. А что ето вы так оптимизируете ? Не лутше ли в даном случае больше думать о читабельности нежели о быстродействии.


Алгоритм декриптования.
А где взять эту функцию microtime, а то мне кажеться, что она ПХП-ая, а не Перловая ?

15
28 января 2008 года
shaelf
2.7K / / 04.05.2005
А язык не судьба указать?
2Rebbit Можно прогнать пару десятков раз ))))
1.0K
28 января 2008 года
diesel_den
169 / / 22.12.2005
Цитата: shaelf
А язык не судьба указать?!


Да, точно, забыл указать Пёрл. Извиняюсь.

1.0K
28 января 2008 года
diesel_den
169 / / 22.12.2005
use Time::HiRes qw(gettimeofday tv_interval);

$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

большая блин разница
2
28 января 2008 года
squirL
5.6K / / 13.08.2003
Код:
#!/usr/bin/env perl

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 секунд

Код:
#!/usr/bin/env perl

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

Код:
#!/usr/bin/env perl

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

делаем выводы сами :)
2
28 января 2008 года
squirL
5.6K / / 13.08.2003
diesel_den
hint: код без use strict будет всегда отрабатывать медленее аналогичного с use strict. а в твоем варианте - код вообще убьет машину на большом числе прогонов. и еще - вариант, когда используется временная переменная - дает меньший расход по памяти :)
1.0K
29 января 2008 года
diesel_den
169 / / 22.12.2005
Цитата: squirL
делаем выводы сами :)


спасибо за эти тесты. Ваш второй тест показал,
что Пёрл не произвёл очевидную оптимизацию.
Но в моём случае временную переменную нельзя вынести из цикла,
так как на каждой итерации она получает новое значение.
Но я вот немного изменил свой тест и увидил,
что копирование производится независимо от того,
присваиваем ли мы переменной 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

2
29 января 2008 года
squirL
5.6K / / 13.08.2003
Цитата: diesel_den
Ваш второй тест показал,
что Пёрл не произвёл очевидную оптимизацию.


что вы имеете ввиду? =\\

1.0K
29 января 2008 года
diesel_den
169 / / 22.12.2005
Цитата: squirL
что вы имеете ввиду? =\\



ну он же мог понять, что не нужно на каждой итерации создавать
временную переменную с одним и тем же значением.

2
29 января 2008 года
squirL
5.6K / / 13.08.2003
ну тогда бы это не была my переменная :)

вообще - правильнее было бы все объявления my вывести за цикл, чтобы они не уничтожались при каждой итерации, но тогда, боюсь, у меня бы быстро кончилась память
1.0K
29 января 2008 года
diesel_den
169 / / 22.12.2005
Цитата: squirL
ну тогда бы это не была my переменная :)

вообще - правильнее было бы все объявления my вывести за цикл, чтобы они не уничтожались при каждой итерации, но тогда, боюсь, у меня бы быстро кончилась память



думаете тогда при присвоении нового значения,
старое бы не удалялось из памяти ?

2
29 января 2008 года
squirL
5.6K / / 13.08.2003
я имею ввиду переменную $str
1.0K
30 января 2008 года
diesel_den
169 / / 22.12.2005
Цитата: squirL
я имею ввиду переменную $str


если Вы про свой код, то там конечно мне непонятно,
почему переменная $str локальная в цикле.
в моём примере последняя операция в цикле накопительная
и производиться над нелокальной для цикла переменной.

2
30 января 2008 года
squirL
5.6K / / 13.08.2003
чтобы не расходовать память. проверяем исключительно скорость конкатенации :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог