Perl中的字符串比较或哈希查找更快吗?

use*_*033 2 perl hash

我有一些代码,在一个部分将执行很多,我是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%.


Ada*_*ire 5

我的猜测是第一个版本exists会更快,更不用说更易读和可维护了.

for (0..10000)
{
    # $element is chosen at random
    $namespace = $element if exists $sections{$element};
}
Run Code Online (Sandbox Code Playgroud)

仅检查是否存在散列键比检索其值进行比较更快,因此请使用exists.