failing test for load_namespace
[dbsrgits/DBIx-Class.git] / t / 99rh_perl_perf_bug.t
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 use Test::More;
5 use lib qw(t/lib);
6
7 # This is a rather unusual test.
8 # It does not test any aspect of DBIx::Class, but instead tests the
9 # perl installation this is being run under to see if it is:-
10 #  1. Potentially affected by a RH perl build bug
11 #  2. If so we do a performance test for the effect of
12 #     that bug.
13 #
14 # You can skip these tests by setting the DBIC_NO_WARN_BAD_PERL env
15 # variable
16 #
17 # If these tests fail then please read the section titled
18 # Perl Performance Issues on Red Hat Systems in
19 # L<DBIx::Class::Manual::Troubleshooting>
20
21 plan skip_all =>
22   'Skipping RH perl performance bug tests as DBIC_NO_WARN_BAD_PERL set'
23   if ( $ENV{DBIC_NO_WARN_BAD_PERL} );
24
25 plan skip_all => 'Skipping as AUTOMATED_TESTING is set'
26   if ( $ENV{AUTOMATED_TESTING} );
27
28 eval "use Benchmark ':all'";
29 plan skip_all => 'needs Benchmark for testing' if $@;
30
31 plan tests => 3;
32
33 ok( 1, 'Dummy - prevents next test timing out' );
34
35 # we do a benchmark test filling an array with blessed/overloaded references,
36 # against an array filled with array refs.
37 # On a sane system the ratio between these operation sets is 1 - 1.5,
38 # whereas a bugged system gives a ratio of around 8
39 # we therefore consider there to be a problem if the ratio is >= 2
40
41 my $results = timethese(
42     -1,    # run for 1 CPU second each
43     {
44         no_bless => sub {
45             my %h;
46             for ( my $i = 0 ; $i < 10000 ; $i++ ) {
47                 $h{$i} = [];
48             }
49         },
50         bless_overload => sub {
51             use overload q(<) => sub { };
52             my %h;
53             for ( my $i = 0 ; $i < 10000 ; $i++ ) {
54                 $h{$i} = bless [] => 'main';
55             }
56         },
57     },
58 );
59
60 my $ratio = $results->{no_bless}->iters / $results->{bless_overload}->iters;
61
62 ok( ( $ratio < 2 ), 'Overload/bless performance acceptable' )
63   || diag(
64     "This perl has a substantial slow down when handling large numbers\n",
65     "of blessed/overloaded objects.  This can severely adversely affect\n",
66     "the performance of DBIx::Class programs.  Please read the section\n",
67     "in the Troubleshooting POD documentation entitled\n",
68     "'Perl Performance Issues on Red Hat Systems'\n",
69   );
70
71 # We will only check for the difference in bless handling (whether the
72 # bless applies to the reference or the referent) if we have seen a
73 # performance issue...
74
75 SKIP: {
76     skip "Not checking for bless handling as performance is OK", 1
77       if ( $ratio < 2 );
78
79     {
80         package    # don't want this in PAUSE
81           TestRHBug;
82         use overload bool => sub { 0 }
83     }
84
85     sub _has_bug_34925 {
86         my %thing;
87         my $r1 = \%thing;
88         my $r2 = \%thing;
89         bless $r1 => 'TestRHBug';
90         return !!$r2;
91     }
92
93     sub _possibly_has_bad_overload_performance {
94         return $] < 5.008009 && !_has_bug_34925();
95     }
96
97     # If this next one fails then you almost certainly have a RH derived
98     # perl with the performance bug
99     # if this test fails, look at the section titled
100     # "Perl Performance Issues on Red Hat Systems" in
101     # L<DBIx::Class::Manual::Troubleshooting>
102     # Basically you may suffer severe performance issues when running
103     # DBIx::Class (and many other) modules.  Look at getting a fixed
104     # version of the perl interpreter for your system.
105     #
106     ok( !_possibly_has_bad_overload_performance(),
107         'Checking whether bless applies to reference not object' )
108       || diag(
109         "This perl is probably derived from a buggy Red Hat perl build\n",
110         "Please read the section in the Troubleshooting POD documentation\n",
111         "entitled 'Perl Performance Issues on Red Hat Systems'\n",
112       );
113 }