我有一些代码,在一个部分将执行很多,我是wondernig哪个方式是一个更有效的实现.我将使用for循环来模拟执行的部分:
选项A:
my %sections = (
'somestring1' => 1,
'somestring2' => 1,
'somestring3' => 1,
'somestring4' => 1
);
for (0..10000)
{
# $element is chosen at random
$namespace = $element if $sections{$element};
}
Run Code Online (Sandbox Code Playgroud)
选项B:
for (0..10000)
{
# $element is chosen at random
$namespace = $element if ($element eq'somestring1' ||
$element eq'somestring2' ||
$element eq'somestring3' ||
$element eq'somestring4');
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以对此进行基准测试或知道答案,因为我不熟悉基准测试工具.
这段代码在这种情况下可能没有意义,但实际上我需要使用它.
Mic*_*man 17
使用Benchmark模块中的cmpthese功能
use strict;
use warnings;
use Benchmark qw'cmpthese';
my %sections = (
somestring1 => 1,
somestring2 => 1,
somestring3 => 1,
somestring4 => 1
);
my @elements = map { 'somestring' . int(1 + rand(10)) } 1 .. 100;
my $namespace;
cmpthese(100000, {
hash_value => sub {
foreach my $element (@elements) {
$namespace = $element if $sections{$element};
}
},
hash_exists => sub {
foreach my $element (@elements) {
$namespace = $element if exists $sections{$element};
}
},
string_cmp => sub {
foreach my $element (@elements) {
$namespace = $element if (
$element eq'somestring1' ||
$element eq'somestring2' ||
$element eq'somestring3' ||
$element eq'somestring4');
}
},
});
Run Code Online (Sandbox Code Playgroud)
我的结果(在WinXP上运行Perl 5.10):
Rate string_cmp hash_value hash_exists
string_cmp 18932/s -- -44% -50%
hash_value 33512/s 77% -- -12%
hash_exists 38095/s 101% 14% --
Run Code Online (Sandbox Code Playgroud)
因此,哈希查找比级联字符串比较快77%,并且检查哈希存在而不是值(如Adam Bellaire建议的那样)仍然快14%.
我的猜测是第一个版本exists会更快,更不用说更易读和可维护了.
for (0..10000)
{
# $element is chosen at random
$namespace = $element if exists $sections{$element};
}
Run Code Online (Sandbox Code Playgroud)
仅检查是否存在散列键比检索其值进行比较更快,因此请使用exists.
| 归档时间: |
|
| 查看次数: |
2373 次 |
| 最近记录: |