perl - 为什么在我尝试 acos(1) 时 Perl 的 Math::Complex 占用了这么多时间?

标签 perl profiler

在尝试分析我的 Perl 程序时,我发现 Math::Complex看起来像是某种警告占用了很多时间。

此外,我的代码不应该生成或使用任何复数,所以无论如何我不确定它在 Math::Complex 中做了什么。以下是最昂贵线路的 FastProf 输出:

/usr/lib/perl5/5.8.8/Math/Complex.pm:182 1.55480 276232: _cannot_make("real part",      $re) unless $re =~ /^$gre$/;
/usr/lib/perl5/5.8.8/Math/Complex.pm:310 1.01132 453641: sub cartesian {$_[0]->{c_dirty} ?
/usr/lib/perl5/5.8.8/Math/Complex.pm:315 0.97497 562188: sub set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0;
/usr/lib/perl5/5.8.8/Math/Complex.pm:189 0.86302 276232: return $self;
/usr/lib/perl5/5.8.8/Math/Complex.pm:1332 0.85628 293660: $self->{display_format} = { %display_format };
/usr/lib/perl5/5.8.8/Math/Complex.pm:185 0.81529 276232: _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/;
/usr/lib/perl5/5.8.8/Math/Complex.pm:1316 0.78749 293660: my %display_format = %DISPLAY_FORMAT;
/usr/lib/perl5/5.8.8/Math/Complex.pm:1335 0.69534 293660: %{$self->{display_format}} :
/usr/lib/perl5/5.8.8/Math/Complex.pm:186 0.66697 276232: $self->set_cartesian([$re, $im ]);
/usr/lib/perl5/5.8.8/Math/Complex.pm:170 0.62790 276232: my $self = bless {}, shift;
/usr/lib/perl5/5.8.8/Math/Complex.pm:172 0.56733 276232: if (@_ == 0) {
/usr/lib/perl5/5.8.8/Math/Complex.pm:316 0.53179 281094: $_[0]->{'cartesian'} = $_[1] }
/usr/lib/perl5/5.8.8/Math/Complex.pm:1324 0.48768 293660: if (@_ == 1) {
/usr/lib/perl5/5.8.8/Math/Complex.pm:1319 0.44835 293660: if (exists $self->{display_format}) {
/usr/lib/perl5/5.8.8/Math/Complex.pm:1318 0.40355 293660: if (ref $self) {   # Called as an object method
/usr/lib/perl5/5.8.8/Math/Complex.pm:187 0.39950 276232: $self->display_format('cartesian');
/usr/lib/perl5/5.8.8/Math/Complex.pm:1315 0.39312 293660: my $self  = shift;
/usr/lib/perl5/5.8.8/Math/Complex.pm:1331 0.38087 293660: if (ref $self) { # Called as an object method
/usr/lib/perl5/5.8.8/Math/Complex.pm:184 0.35171 276232: $im ||= 0;
/usr/lib/perl5/5.8.8/Math/Complex.pm:181 0.34145 276232: if (defined $re) {
/usr/lib/perl5/5.8.8/Math/Complex.pm:171 0.33492 276232: my ($re, $im);
/usr/lib/perl5/5.8.8/Math/Complex.pm:390 0.20658 128280: my ($z1, $z2, $regular) = @_;
/usr/lib/perl5/5.8.8/Math/Complex.pm:391 0.20631 128280: if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {

感谢您的帮助!

最佳答案

除非正则表达式匹配,否则第 182 和 185 行发出警告。所以缓慢可能不是来自输出警告,而是进行正则表达式匹配。

如果探查器说这些行正在执行,那么它们就是。如果您不直接调用它们,则您加载的模块可能会间接调用它们。如果您使用更高级的分析器(例如 Devel::NYTProf),您将能够看到调用图以确定您的代码的哪一部分最终导致了对缓慢库代码的调用。

关于perl - 为什么在我尝试 acos(1) 时 Perl 的 Math::Complex 占用了这么多时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429150/

相关文章:

sql - 我可以在 sql server 2008 profiler 中监控特定表的性能吗

java - 高性能java分析器

perl - 在 Perl 中对巨大的哈希进行排序

perl - 如何确保 Perl 脚本适用于旧版本?

c++ - 我已经安装了 gperftools-2.0,但是我无法获取 cpu profile 统计信息

java - jprobe 分析器和 netbeans 有什么缺点吗?

perl - 非 Ascii 数据在不同的 Perl 安装下表现不同

perl - 为什么这两种确定打印列数的方法表现不同?

regex - 使用 grep 和 regex 检测没有 ID 属性的字段

sql-server - 如何查找导致 SQL Server Profiler 跟踪中报告的错误的原因?