perldoc.t 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. unshift @INC, 't';
  7. require "test.pl";
  8. }
  9. use Config;
  10. use File::Spec;
  11. use Time::HiRes qw(gettimeofday tv_interval);
  12. sub faster { ($_[1] - $_[0]) < 0.05 }
  13. sub diagv {
  14. diag @_ if $ENV{TEST_VERBOSE};
  15. }
  16. sub todofaster {
  17. my ($t1, $t2, $cmt) = @_;
  18. if (faster($t1,$t2)) {
  19. ok(1, $cmt);
  20. } else {
  21. TODO: {
  22. # esp. with $ENV{HARNESS_ACTIVE}
  23. local $TODO = " (unreliable timings with parallel testing)";
  24. ok(0, $cmt);
  25. }
  26. }
  27. }
  28. my $X = $^X =~ m/\s/ ? qq{"$^X"} : $^X;
  29. my $Mblib = Mblib();
  30. my $perldoc = File::Spec->catfile($Config{installbin}, 'perldoc');
  31. my $perlcc = "$X $Mblib blib/script/perlcc";
  32. $perlcc .= " -Wb=-fno-fold,-fno-warnings" if $] > 5.013;
  33. $perlcc .= " -UB";
  34. # . " -uPod::Perldoc::ToMan -uPod::Perldoc::ToText -uPod::Perldoc::BaseTo";
  35. my $exe = $Config{exe_ext};
  36. my $perldocexe = $^O eq 'MSWin32' ? "perldoc$exe" : "./perldoc$exe";
  37. # XXX bother File::Which?
  38. die "1..1 # $perldoc not found\n" unless -f $perldoc;
  39. plan tests => 7;
  40. # XXX interestingly 5.8 perlcc cannot compile perldoc because Cwd disturbs the method finding
  41. # vice versa 5.14 cannot be compile perldoc manually because File::Temp is not included
  42. my $compile = $]<5.010?"$X $Mblib -MO=C,-UB,-operldoc.c $perldoc":"$perlcc -o $perldocexe $perldoc";
  43. diagv $compile;
  44. my $res = `$compile`;
  45. system("$X $Mblib script/cc_harness -o $perldocexe perldoc.c") if $] < 5.010;
  46. ok(-s $perldocexe, "$perldocexe compiled"); #1
  47. diagv "see if $perldoc -T works";
  48. my $T_opt = "-- -T -f wait";
  49. my $ori;
  50. my $PAGER = '';
  51. my ($result, $out, $err);
  52. my $t0 = [gettimeofday];
  53. if ($^O eq 'MSWin32') {
  54. $T_opt = "-- -t -f wait";
  55. $PAGER = "PERLDOC_PAGER=type ";
  56. ($result, $ori, $err) = run_cmd("$PAGER$X -S $perldoc $T_opt", 20);
  57. } else {
  58. ($result, $ori, $err) = run_cmd("$X -S $perldoc $T_opt 2>&1", 20);
  59. }
  60. my $t1 = tv_interval( $t0 );
  61. if ($ori =~ /Unknown option/) {
  62. $T_opt = "-- -t -f wait";
  63. $PAGER = "PERLDOC_PAGER=cat " if $^O ne 'MSWin32';
  64. diagv "No, use $PAGER instead";
  65. $t0 = [gettimeofday];
  66. ($result, $ori, $err) = run_cmd("$PAGER$X -S $perldoc $T_opt", 20);
  67. $t1 = tv_interval( $t0 );
  68. } else {
  69. diagv "it does";
  70. }
  71. $t0 = [gettimeofday];
  72. ($result, $out, $err) = run_cmd("$PAGER $perldocexe $T_opt", 20);
  73. my $t2 = tv_interval( $t0 );
  74. TODO: {
  75. # 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
  76. # dev perldoc 3.15_13: Can't locate object method "_is_mandoc" via package "Pod::Perldoc::ToMan"
  77. local $TODO = "compiled does not print yet" if $] >= 5.016 or $] < 5.010 or $Config{useithreads};
  78. $ori =~ s{ /\S*perldoc }{ perldoc };
  79. $out =~ s{ ./perldoc }{ perldoc };
  80. is($out, $ori, "same result"); #2
  81. }
  82. SKIP: {
  83. skip "cannot compare times", 1 if $out ne $ori;
  84. todofaster($t1,$t2,"compiled faster than uncompiled: $t2 < $t1"); #3
  85. }
  86. unlink $perldocexe if -e $perldocexe;
  87. $perldocexe = $^O eq 'MSWin32' ? "perldoc_O3$exe" : "./perldoc_O3$exe";
  88. $compile = $]<5.010?"$X $Mblib -MO=C,-O3,-UB,-operldoc.c $perldoc":"$perlcc -O3 -o $perldocexe $perldoc";
  89. diagv $compile;
  90. $res = `$compile`;
  91. system("$X $Mblib script/cc_harness -o $perldocexe perldoc.c") if $] < 5.010;
  92. ok(-s $perldocexe, "perldoc compiled"); #4
  93. unlink "perldoc.c" if $] < 5.10;
  94. diagv $res unless -s $perldocexe;
  95. $t0 = [gettimeofday];
  96. ($result, $out, $err) = run_cmd("$PAGER $perldocexe $T_opt", 20);
  97. my $t3 = tv_interval( $t0 );
  98. TODO: {
  99. local $TODO = "compiled does not print yet" if $] >= 5.016 or $] < 5.010 or $Config{useithreads};
  100. $out =~ s{ ./perldoc_O3 }{ perldoc };
  101. is($out, $ori, "same result"); #5
  102. }
  103. SKIP: {
  104. skip "cannot compare times", 2 if $out ne $ori;
  105. todofaster($t2,$t3,"compiled -O3 not slower than -O0: $t3 <= $t2"); #6
  106. todofaster($t1,$t3,"compiled -O3 faster than uncompiled: $t3 < $t1"); #7
  107. }
  108. END {
  109. unlink $perldocexe if -e $perldocexe;
  110. }