![]() |
1
8
运行时性能应该没有区别
如果
结果代码在两种情况下都是相同的。但是,这通常是不可能的,除非使用字符串
会比手动编写的代码慢很多:
这仅仅是因为前者必须在将变量$A用作哈希键之前获取其值,而后者则使用常量作为哈希键。另外,作为旁白,
我的系统的结果是:
它们是如此的接近以至于噪音中的差异可能会消失,但是在许多试验中,我认为你会发现“手动换档”的变体是最快的。但是和所有这样的微基准一样,您必须在硬件和Perl版本上测试您的具体场景,以确定是否存在任何问题。 这里有一个字符串eval加入到混合中。
它应该与“手动”变体完全相同,加上或减去统计噪声。我的结果是:
再说一次,这些都是如此接近,你将不得不付出巨大的努力,并进行许多试验,以从噪音中找出信号。但是使用常量作为散列键和使用变量(必须首先检索其值)作为散列键之间的区别应该是显而易见的。(The
|
![]() |
2
7
没有区别,因为:
只是以下内容的简写:
借鉴 perlmod |
![]() |
3
6
生成良好的访问器的主要缺点是它们击败了依赖静态分析的工具。例如,您的IDE方法自动完成。如果这是一个大项目的一部分,我衷心建议你看看 Moose .它是正确的访问器代(以及更多)。在IDES中添加支持已经足够流行了,因此前面提到的问题将在适当的时候消失。 CPAN上有许多访问器生成器,它们易于使用并生成中等效率的代码。如果性能是一个问题,那么——只要您坚持使用访问器方法——您就不能比 Class::XSAccessor 因为它为访问器使用了高度优化的C/XS代码。 滚动自己的访问器生成代码是所有选项中最糟糕的。它永久地破坏了静态分析,很可能很难阅读,并可能引入新的错误。 |
![]() |
4
2
这两种方法都是在编译时将子例程引用安装到符号表中的结果。行为和运行时性能将完全相同。编译时的差异可能非常小(即可以忽略不计)。
类似的方法是通过
显然,生成方法会将它们隐藏在任何形式的静态分析中,包括ctags等工具。 |
![]() |
5
2
运行时行为和性能应该基本相同(除非您做一些关心方法是否是闭包的事情)。 有了大量的属性,编译时间和内存使用都会有所不同……这都有利于生成的getter和setter,而不是手动编写的getter和setter。 例如,尝试以下方法:
相比于
|
![]() |
6
2
唯一的区别是启动时间。对于简单的代码生成方案,差异将很难测量。对于更复杂的系统,它可以加起来。 一个很好的例子就是 Moose .Moose为您生成了各种令人惊奇的代码,但它对启动时间有着重要的影响。这已经够了驼鹿开发人员正在研究的一个问题了 a scheme to cache generated code 在PMC文件中加载它们,而不是每次都重新生成代码。 也可以考虑 Class::Struct . 它使用字符串eval(上次我检查)生成代码。即使如此,因为它非常简单,它不会在启动时造成明显的减速。 |
![]() |
7
2
除了其他人提到的优秀点之外,我还想添加我发现的主要缺点:它们都显示为探查器中的匿名子例程。不管什么原因, Devel::DProf 只是不知道怎么知道名字。 现在我愿意 希望 那个新的 Devel::NYTProf 可能做得更好,但我没试过。 |