169 похожих чатов

Полный код такой: #!/usr/bin/perl use strict; use warnings; use feature 'say'; use feature qw/switch/; no warnings

qw/deprecated::smartmatch/;

use Benchmark qw(:all);
use Switch '__';

my $x = 5;
my @arr = ('zero', 'one', 'two', 'three');
my %hash = (
0 => 'zero',
1 => 'one',
2 => 'two',
3 => 'three',
);

cmpthese(-1, +{
'array lookup' => sub {
my $y = $arr[$x] // 'too many';
},
'hash lookup' => sub {
my $y = $hash{$x} // 'too many';
},
"?:" => sub {
my $y =
!$x ? 'zero'
: $x == 1 ? 'one'
: $x == 2 ? 'two'
: $x == 3 ? 'three'
: 'too many'
;
},

"&& ||" => sub {
my $y =
!$x && 'zero'
|| $x == 1 && 'one'
|| $x == 2 && 'two'
|| $x == 3 && 'three'
|| 'too many'
;
},

"and or" => sub {
my $y =
(!$x and 'zero'
or $x == 1 and 'one'
or $x == 2 and 'two'
or $x == 3 and 'three'
or 'too many'
);
},

"elsif" => sub {
my $y;
if ( !$x ) { $y = 'zero' }
elsif ($x == 1) { $y = 'one' }
elsif ($x == 2) { $y = 'two' }
elsif ($x == 3) { $y = 'three' }
else { $y = 'too many' }
},

"sub return if ..." => sub {
my $y = (sub {
return 'zero' if !$x;
return 'one' if 1 == $x;
return 'two' if 2 == $x;
return 'three' if 3 == $x;
return 'too many';
})->();
},

"given" => sub {
my $y;
given($x) {
$y = 'zero' when !$_;
$y = 'one' when 1;
$y = 'two' when 2;
$y = 'three' when 3;
default { $y = 'too many' }
}
},

"switch" => sub {
my $y;
(sub {
switch($x) {
case !__ { $y = 'zero' }
case 1 { $y = 'one' }
case 2 { $y = 'two' }
case 3 { $y = 'three' }
else { $y = 'too many' }
}
})->();
},

"{}" => sub {
# Тут выражения вычисляются все, а не последовательно,
# поэтому раскрывают частный случай
my $y = +{
0 => 'zero',
1 => 'one',
2 => 'two',
3 => 'three',
}->{$x} // 'too many';
},
});

19 ответов

25 просмотров

Если поставить в каждом тесте my $x = int rand 5;, то результаты будут не по одному кейсу...

Vyacheslav-Koval Автор вопроса
Ярослав 🧞 Косьмина
Если поставить в каждом тесте my $x = int rand 5;,...

Да, но и точности и смысла в бенчмарке не будет. В одном варианте будет больше вариантов с лучшим случаем - $x == 0 - зашли в первый if и пошли дальше, а в других больше худших случаев - $x > 3.

Vyacheslav Koval
Да, но и точности и смысла в бенчмарке не будет. В...

В cmpthese можно указать количество повторений: 100_000, тогда $x в каждом случае будет от 0 до 4 одинаковое количество раз

Vyacheslav-Koval Автор вопроса
Ярослав 🧞 Косьмина
В cmpthese можно указать количество повторений: 10...

Если нужно для всех, то может лучше сделать цикл от 0 до 4?

Vyacheslav Koval
Если нужно для всех, то может лучше сделать цикл о...

Это - тоже частный случай. В реальности цифры ведь будут приходить в разброс. В perl и библиотеке libc, которую он использует для вывода, в драйвере ос, который отвечает за ввод-вывод процессов и в терминале могут быть кеши и различный код с неизвестным поведением, который выполняется разное время. (Тут же ещё say тестируется) Поэтому, если нужно тестировать только условия, то нужно убрать say, но тогда присваивать результат глобальной переменной или оптимизатор вообще может убрать код. Интерпретатор может иметь оптимизацию цикла и условия в последовательном цикле могут работать иначе

Vyacheslav-Koval Автор вопроса
Ярослав 🧞 Косьмина
Это - тоже частный случай. В реальности цифры ведь...

В моем примере выше я как раз убрал say и вызов do в придачу.

Vyacheslav-Koval Автор вопроса
Ярослав 🧞 Косьмина
Это - тоже частный случай. В реальности цифры ведь...

Если есть оптимизация цикла, то она будет работать для всех случаев.

Ярослав 🧞 Косьмина
Если поставить в каждом тесте my $x = int rand 5;,...

Поскольку в этом месте никто не встрял, попробую встрять я ) Есть вполне документированная фича у функции srand, а именно, после вызова: srand число; все последующие вызовы rand будут генерировать одни и те же последовательные значения (для разного "число" будут разные последовательности, разумеется, еще от компа зависит - какие) https://perlbanjo.com/54aaef218a соответственно, и с помощью rand мы можем сгенерить одни и те же тестовые последовательности для каждой функции (тут пример был ошибочный, нужно придумать как именно)

mr bbon
Поскольку в этом месте никто не встрял, попробую в...

Идея хорошая, но в cmpthese - малореализуемая

Ярослав 🧞 Косьмина
Идея хорошая, но в cmpthese - малореализуемая

"?:" => sub { state $init = undef; if (!$init) { $init = srand 2; } my $x = int rand 5; say !$x ? 'zero' : $x == 1 ? 'one' : $x == 2 ? 'two' : $x == 3 ? 'three' : 'too many' ; }, "&& ||" => sub { state $init = undef; if (!$init) { $init = srand 2; } my $x = int rand 5; say !$x && 'zero' || $x == 1 && 'one' || $x == 2 && 'two' || $x == 3 && 'three' || 'too many' ; }, # и т.д. так работает, только не забыть в скрипте use v5.10;

mr bbon
"?:" => sub { state $init = undef; ...

Можно короче. state $init; $init//=srand(2); Можно и так state $init=srand(2); Но это багоопасная привычка и так лучше не делать

mr bbon
Поскольку в этом месте никто не встрял, попробую в...

Был такой кейс, когда после fork вызывался rand - и в обоих процессах выдавал одинаковое число. Выход - сначала srand, который в обоих процессах инициирует разные стартовые последовательности.

Андрей aka ti-an
Был такой кейс, когда после fork вызывался rand - ...

В обоих не нужно, достаточно в одном, при этом не важно в каком

Anton Petrusevich
Исправили

Что-то не пойму, где ошибся. А если не ошибся, то почему rand() выдаёт разные числа даже в 5.8 https://perlbanjo.com/d27c0dd6f4

Denis Evdokimov
Что-то не пойму, где ошибся. А если не ошибся, то ...

Я кстати тоже сталкивался, причём под mod_perl, лет десять назад. Так что перл не очень старый должен быть. Но там эта хрень была завязана на внешний модуль какой-то. Надо будет поковыряться в своих архивах

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта