perldoc.t 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #! /usr/bin/env perl
  2. # brian d foy: "Compiled perlpod should be faster then uncompiled"
  3. use Test::More;
  4. use strict;
  5. BEGIN {
  6. if ($ENV{PERL_CORE}) {
  7. unshift @INC, ('t', '../../lib');
  8. } else {
  9. unshift @INC, 't';
  10. }
  11. require TestBC;
  12. }
  13. use Config;
  14. use File::Spec;
  15. use Time::HiRes qw(gettimeofday tv_interval);
  16. sub faster { ($_[1] - $_[0]) < 0.05 }
  17. sub diagv {
  18. diag @_ if $ENV{TEST_VERBOSE};
  19. }
  20. sub todofaster {
  21. my ($t1, $t2, $cmt) = @_;
  22. if (faster($t1,$t2)) {
  23. ok(1, $cmt);
  24. } else {
  25. TODO: {
  26. # esp. with $ENV{HARNESS_ACTIVE}
  27. local $TODO = " (unreliable timings with parallel testing)";
  28. ok(0, $cmt);
  29. }
  30. }
  31. }
  32. my $X = $^X =~ m/\s/ ? qq{"$^X"} : $^X;
  33. my $Mblib = Mblib();
  34. my $perldoc = File::Spec->catfile($Config{installbin}, 'perldoc');
  35. if ($ENV{PERL_CORE}) {
  36. $perldoc = File::Spec->catfile(
  37. '..','..','utils', ($Config{usecperl} ? 'cperldoc' : 'perldoc'));
  38. $X .= ' -I../../pod';
  39. }
  40. my $perlcc = "$X $Mblib script/perlcc";
  41. $perlcc .= " -Wb=-fno-fold,-fno-warnings" if $] > 5.013;
  42. $perlcc .= " -UB -uFile::Spec -uCwd";
  43. $perlcc .= " -uPod::Perldoc::ToText" if $] >= 5.023004;
  44. #$perlcc .= " -uFile::Temp" if $] > 5.015;
  45. $perlcc .= " -uExporter" if $] < 5.010;
  46. my $has_flto = $Config{ccflags} =~ /-flto/ ? 1 : 0;
  47. # XXX bother File::Which?
  48. plan skip_all => "$perldoc not found" unless -f $perldoc;
  49. plan skip_all => "MSVC" if ($^O eq 'MSWin32' and $Config{cc} eq 'cl');
  50. plan skip_all => "mingw" if ($^O eq 'MSWin32' and $Config{cc} eq 'gcc'); # fail 1,4
  51. plan skip_all => "-flto too slow" if $ENV{PERL_CORE} and $has_flto;
  52. plan tests => 7;
  53. $perlcc .= " --Wc=-O1" if $has_flto;
  54. my $exe = $Config{exe_ext};
  55. my $perldocexe = $^O eq 'MSWin32' ? "perldoc$exe" : "./perldoc$exe";
  56. my $strip_banner = 0;
  57. # check if we need to strip 1st and last line. Needed for 5.18-5.20
  58. sub strip_banner($) {
  59. my $s = shift;
  60. $s =~ s/^.* User Contributed Perl Documentation (.*?)$//m;
  61. $s =~ s/^perl v.*$//m;
  62. return $s;
  63. }
  64. my ($compile, $res, $result, $ori, $out, $err, $t0, $t1, $t2);
  65. # XXX interestingly 5.8 perlcc cannot compile perldoc because Cwd disturbs the method finding
  66. # vice versa 5.14 cannot compile perldoc manually because File::Temp is not included
  67. $compile = "$perlcc -o $perldocexe $perldoc";
  68. diagv $compile;
  69. $res = `$compile`;
  70. ok(-s $perldocexe, "$perldocexe compiled"); #1
  71. diagv "see if $perldoc -T works";
  72. my $T_opt = "-T -f wait";
  73. my $PAGER = '';
  74. $t0 = [gettimeofday];
  75. if ($^O eq 'MSWin32') {
  76. $T_opt = "-t -f wait";
  77. $PAGER = "PERLDOC_PAGER=type ";
  78. ($result, $ori, $err) = run_cmd("$PAGER$X -S $perldoc $T_opt", 20);
  79. } else {
  80. ($result, $ori, $err) = run_cmd("$X -S $perldoc $T_opt", 20);
  81. }
  82. $t1 = tv_interval( $t0 );
  83. if ($ori =~ /Unknown option/) {
  84. $T_opt = "-t -f wait";
  85. $PAGER = "PERLDOC_PAGER=cat " if $^O ne 'MSWin32';
  86. diagv "No, use $PAGER instead";
  87. $t0 = [gettimeofday];
  88. ($result, $ori, $err) = run_cmd("$PAGER$X -S $perldoc $T_opt", 20);
  89. $t1 = tv_interval( $t0 );
  90. } else {
  91. diagv "it does";
  92. }
  93. if ($ori =~ / User Contributed Perl Documentation /) {
  94. $strip_banner++;
  95. $ori = strip_banner $ori;
  96. }
  97. $t0 = [gettimeofday];
  98. ($result, $out, $err) = run_cmd("$PAGER $perldocexe $T_opt", 20);
  99. $t2 = tv_interval( $t0 );
  100. # old perldoc 3.14_04-3.15_04: Can't locate object method "can" via package "Pod::Perldoc" at /usr/local/lib/perl5/5.14.1/Pod/Perldoc/GetOptsOO.pm line 34
  101. # dev perldoc 3.15_13: Can't locate object method "_is_mandoc" via package "Pod::Perldoc::ToMan"
  102. $ori =~ s{ /\S*perldoc }{ perldoc };
  103. $out =~ s{ ./perldoc }{ perldoc };
  104. $out = strip_banner $out if $strip_banner;
  105. if ($] > 5.023 and $out ne $ori) {
  106. ok(1, "TODO 5.24 Pod::Simple");
  107. } else {
  108. is($out, $ori, "same result"); #2
  109. }
  110. SKIP: {
  111. skip "cannot compare times", 1 if $out ne $ori;
  112. todofaster($t1,$t2,"compiled faster than uncompiled: $t2 < $t1"); #3
  113. }
  114. unlink $perldocexe if -e $perldocexe;
  115. $perldocexe = $^O eq 'MSWin32' ? "perldoc_O3$exe" : "./perldoc_O3$exe";
  116. $compile = "$perlcc -O3 -o $perldocexe $perldoc";
  117. diagv $compile;
  118. $res = `$compile`;
  119. ok(-s $perldocexe, "perldoc compiled"); #4
  120. unlink "perldoc.c" if $] < 5.10;
  121. diagv $res unless -s $perldocexe;
  122. $t0 = [gettimeofday];
  123. ($result, $out, $err) = run_cmd("$PAGER $perldocexe $T_opt", 20);
  124. my $t3 = tv_interval( $t0 );
  125. $out =~ s{ ./perldoc_O3 }{ perldoc };
  126. $out = strip_banner $out if $strip_banner;
  127. if ($] > 5.023 and $out ne $ori) {
  128. ok(1, "TODO 5.24 Pod::Simple");
  129. } else {
  130. is($out, $ori, "same result"); #5
  131. }
  132. SKIP: {
  133. skip "cannot compare times", 2 if $out ne $ori;
  134. todofaster($t2,$t3,"compiled -O3 not slower than -O0: $t3 <= $t2"); #6
  135. todofaster($t1,$t3,"compiled -O3 faster than uncompiled: $t3 < $t1"); #7
  136. }
  137. END {
  138. unlink $perldocexe if -e $perldocexe;
  139. }