数字和字符串之间自动转换的效率没有影响?

时间:2011-07-07 11:33:38

标签: perl performance

Perl中的数字和字符串之间存在自动转换。

来自Llama的书:

  

你不必担心   数字与数字的区别   串;只需使用正确的   运营商,Perl将全力以赴   工作

     

如果你担心的话   效率,不要。 Perl一般   记得转换的结果   所以它只完成了一次。

这是怎么回事?我的意思是Perl如何记住它以及多少时间?

即使只是一个位,它不会影响效率吗?

1 个答案:

答案 0 :(得分:13)

效率为何要慢?

如果您自动或手动进行转换,则完全相同。但是通过自动执行,您只需输入更少的代码。

perl中的标量变量可以包含许多不同的值。运行时(perl解释器)执行转换并将数字保存在标量内。

您可以使用Devel::Peek

查看此类内部内容
#!/usr/bin/env perl
use Devel::Peek;

my $value = '15';
Dump($value);
$value + 5;
Dump($value);
$value = 5;
Dump($value);

输出:

SV = PV(0x8f71040) at 0x8f82d88
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x8f7ecb8 "15"\0
  CUR = 2
  LEN = 4
SV = PVIV(0x8f7a2fc) at 0x8f82d88
  REFCNT = 1
  FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
  IV = 15
  PV = 0x8f7ecb8 "15"\0
  CUR = 2
  LEN = 4
SV = PVIV(0x8f7a2fc) at 0x8f82d88
  REFCNT = 1
  FLAGS = (PADMY,IOK,pIOK)
  IV = 5
  PV = 0x8f7ecb8 "15"\0
  CUR = 2
  LEN = 4

在这里你可以看到一个标量值(SV)的字符串为"15"为(PV),在添加之后它会添加(IV)(整数值)。

标量包含一个标志,以确定哪个值是正确的。在第一个转储中,您会看到标记POK,其中PV是正确的当前值。如果您要求此值,perl可以立即返回此值。

添加后,您会看到“IOK”表示“IV”值也可以。实际上变量本身并没有改变,但是因为perl需要添加一个字符串才能进行从字符串到int的对话。添加后您看到的内容是POKIOK有效。这意味着Scalar当前拥有一个有效的字符串和一个有效的Integer。只要变量没有改变,两个值都是有效的,并且perl不需要进行对话。

但是在将值更改为整数5之后,您会看到“POK”不再设置。此操作将IV设置为新值并使PV值无效。只要您使用$value作为整数,就不会发生任何其他事情。只要您在字符串上下文中使用$value,就会转换为字符串,并会更新PV并设置POK。但只需要做一次。