Perl 对数字和字符串之间的自动转换效率没有影响?
在Perl中,数字和字符串之间有自动转换 从美洲驼的书中: 你不必担心这个问题 数与数之差 串;用正确的方法 运算符和Perl将实现这一切 工作 如果你担心 效率,别担心Perl 记住转换的结果 这样就只需要做一次。 这是怎么发生的?我的意思是Perl是如何记住它的,记住了多少时间Perl 对数字和字符串之间的自动转换效率没有影响?,perl,performance,Perl,Performance,在Perl中,数字和字符串之间有自动转换 从美洲驼的书中: 你不必担心这个问题 数与数之差 串;用正确的方法 运算符和Perl将实现这一切 工作 如果你担心 效率,别担心Perl 记住转换的结果 这样就只需要做一次。 这是怎么发生的?我的意思是Perl是如何记住它的,记住了多少时间 它对效率的影响是不是只有一点点?为什么效率要慢一些 如果自动或手动进行转换,则完全相同。但是通过自动执行,您只需要键入更少的代码 perl中的标量变量可以包含许多不同的值。运行时(perl解释器)进行转换并将数字保存
它对效率的影响是不是只有一点点?为什么效率要慢一些 如果自动或手动进行转换,则完全相同。但是通过自动执行,您只需要键入更少的代码 perl中的标量变量可以包含许多不同的值。运行时(perl解释器)进行转换并将数字保存在标量中 你可以看到这种内在的东西 输出:
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)将字符串作为(PV)添加到(IV)(整数值)
标量包含一个标志,用于知道哪个值是正确的。在第一次转储中,您会看到标志POK
,表示PV
是正确的当前值。如果您请求此值,perl
可以立即返回此值
添加后,您会看到“IOK”,表示“IV”值也可以。实际上,变量本身没有改变,但因为添加了一个字符串,perl需要进行从字符串到int的对话。添加后您会看到POK
和IOK
是有效的。这意味着标量当前包含一个有效字符串和一个有效整数。只要变量不变,两个值都是有效的,perl不需要进行对话
但将值更改为整数
5
后,您会看到“POK”不再设置。此操作将IV设置为新值,并使PV值无效。只要将$value
作为整数使用,就不会发生任何额外的情况。只要您在字符串上下文中使用$value
,它将转换为字符串,并将更新PV
和设置POK
。但是只需要做一次。效率有很多定义。Perl自动处理字符串值和数值之间的转换,这意味着每个标量变量必须消耗比不存在这样一个特性时稍多的内存。这也意味着有一个轻微的速度成本,比如说,“C”。但这里有几个肮脏的小秘密,我会告诉你:高效的算法比微观优化更重要。程序员的时间通常比机器时间更昂贵。最后:当算法和编程成本无法抵消解释语言的微小成本时,请使用C语言。我猜您指的是魔术师约翰逊,他是Perl所有魔法的源头:
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