我已經在地圖上搜索了其他許多 Stack 問題,但是這個要求是特別的,并且可以嘗試,因為我可能無法完全獲得我正在尋找的解決方案,或者我認為確實存在。
這個問題只是關于性能。
作為有限的背景,此代碼段用于解碼傳入的令牌,因此它用于每個 Web 請求,因此性能至關重要,我知道“地圖”可以使用,所以想使用它。
這是一個精簡但仍然可以正常作業的代碼段,我目前正在使用它并且運行良好:
use strict;
use Data::Dumper qw (Dumper);
my $api_token = { array => [ 'user_id', 'session_id', 'expiry' ], max => 3, name => 'session' };
my $token_got = [ 9923232345812112323, 1111323232000000465, 1002323001752323232 ];
my $rt;
for (my $i=0; $i<scalar @{$api_token->{array}}; $i ) {
$rt->{$api_token->{array}->[$i]} = $token_got->[$i];
}
$rt->{type} = $api_token->{name};
print Dumper ($rt) . "\n";
問題是: 就性能而言,復制上述 foreach 陳述句的絕對最佳 PERL 代碼是什么?
uj5u.com熱心網友回復:
看起來你只需要一個哈希片
my %rt;
@rt{ @{ $api_token->{array} } } = @$token_got;
或者,如果需要哈希參考
my $rt;
@{ $rt } { @{ $api_token->{array} } } = @$token_got;
或者使用更新的后綴取消參考,在陣列和哈希切片上,也許更好一點
my $rt;
$rt->@{ $api_token->{array}->@* } = @$token_got;
也可以使用 List::MoreUtils::mesh并在一個陳述句中做到這一點
my $rt = { mesh @{ $api_token->{array} }, @$token_got };
或成對來自同一個庫
my $rt = { pairwise { $a, $b } @{ $api_token->{array} }, @$token_got };
如果庫安裝了List::MoreUtils::XS.
以上所有基準,來自問題的微小資料集(雖然現實?),以及任何實作mesh/pairwise擁有它們的速度是其他的數倍。
在具有 v5.26 的舊筆記本電腦上
評價 use_pair use_mesh use_href use_post use_hash use_pair 373639/s -- -36% -67% -67% -68% 使用網格 580214/s 55% -- -49% -49% -51% use_href 1129422/s 202% 95% -- -1% -5% use_post 1140634/s 205% 97% 1% -- -4% 使用哈希 1184835/s 217% 104% 5% 4% --
在具有 v5.36 的服務器上,數字是160%--170%反對的pairwise(mesh比它快一點,類似于上面)
其他的,在筆記本電腦上,基于哈希的總是快幾個百分點,而在 v5.36 的服務器上,它們都非常接近。很容易稱之為領帶。
以下是由 OP 編輯??的,他計時了 61% 的加速(見評論)
更改代碼:
@rt{ @{ $api_token->{array} } } = @$token_got; ### much faster onliner replaced the loop. @zdim credit
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513178.html
標籤:表现perl参考哈希参考
上一篇:使用前瞻正則運算式替換文本
下一篇:將排序功能移動到包時未初始化的值
