【发布时间】:2014-05-26 16:26:36
【问题描述】:
我很想比较使用散列还是引用散列更好,散列参考据我所知只是指向散列本身的指针,所以我认为应该没有速度差异。
我做了一个基本的基准测试,发现哈希引用比直接使用哈希慢 20-27%。
这是我使用的基本基准代码:
use Benchmark qw(:all);
cmpthese(10_000_000, {
hash => sub { my %hash = (); },
hashref => sub { my $hahref = {}; }
});
cmpthese(10_000_000, {
hash => sub {
my %hash;
$hash{fname}="first name";
$hash{mname}="middle name";
$hash{lname}="last name";
},
hashref => sub {
my $hahref;
$hahref->{fname}="first name";
$hahref->{mname}="middle name";
$hahref->{lname}="last name";
},
hashrefs => sub {
my $hahref;
$$hahref{fname}="first name";
$$hahref{mname}="middle name";
$$hahref{lname}="last name";
},
});
这是在戴尔笔记本电脑、Windows 8、Core i7、16MB RAM 上的基准测试结果:
Rate hashref hash
hashref 5045409/s -- -17%
hash 6045949/s 20% --
Rate hashrefs hashref hash
hashrefs 615764/s -- -2% -21%
hashref 625978/s 2% -- -19%
hash 775134/s 26% 24% --
Output completed (1 min 6 sec consumed)
我的问题是,如果我的基准测试是正确的并且哈希引用如此缓慢,为什么像 DBI 这样的大多数模块都使用哈希引用来返回结果。此外,大多数模块接受哈希引用而不是哈希作为参数,并且还返回哈希引用而不是哈希。
【问题讨论】:
-
与大多数其他编程结构相比,使用散列或散列引用之间不太可能存在严重的性能差异。 IO 将是一个更耗时的问题,如果您正在执行密集算法,则可能会进行计算。在选择数据结构时,我主要关心的是什么是最简单的。无论哪种方式,您的基准测试都没有解决您关于数据结构传递的最后一个问题,所以这个问题是一个红鲱鱼。