Benchmark.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:4k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Performance benchmarking
  3. #  Copyright (c) 2006 OpenKore Team
  4. #
  5. #  This software is open source, licensed under the GNU General Public
  6. #  License, version 2.
  7. #  Basically, this means that you're allowed to modify and distribute
  8. #  this software. However, if you distribute modified versions, you MUST
  9. #  also distribute the source code.
  10. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  11. #
  12. #  $Revision: 4306 $
  13. #  $Id: Item.pm 4306 2006-04-20 18:06:46Z hongli $
  14. #
  15. #########################################################################
  16. ##
  17. # MODULE DESCRIPTION: Performance benchmarking
  18. #
  19. # This module allows you to benchmark Perl code. You use it as follows:
  20. # <pre class="example">
  21. # use Utils::Benchmark;
  22. # use Carp::Assert;  # Very important! This gives you the DEBUG constant.
  23. #
  24. # sub foo {
  25. #     ... do something ...
  26. # }
  27. #
  28. # sub bar {
  29. #     ... do something ...
  30. # }
  31. #
  32. # Benchmark::begin("Total") if DEBUG;
  33. #
  34. # Benchmark::begin("foo") if DEBUG;
  35. # foo();
  36. # Benchmark::end("foo") if DEBUG;
  37. #
  38. # Benchmark::begin("bar") if DEBUG;
  39. # bar();
  40. # Benchmark::end("bar") if DEBUG;
  41. #
  42. # Benchmark::end("Total") if DEBUG;
  43. # print Benchmark::results() if DEBUG;
  44. # </pre>
  45. #
  46. # You should always put "if DEBUG" after every Benchmark method call. That allows
  47. # you to disable benchmarking if the NDEBUG environment variable is set, which
  48. # will eliminate benchmarking overhead. Since DEBUG is a constant, Perl will compile
  49. # out the Benchmarking code at compile time if DEBUG evaluates to false.
  50. # See also <a href="http://cpan.uwinnipeg.ca/htdocs/Carp-Assert/Carp/Assert.html#efficiency">Carp::Assert's documentation.</a>
  51. package Benchmark;
  52. use strict;
  53. use Time::HiRes;
  54. use Modules 'register';
  55. use XSTools;
  56. XSTools::bootModule('Utils::Benchmark');
  57. init();
  58. # Note that some functions are implemented in src/auto/XSTools/utils/perl/Benchmark.xs
  59. ##
  60. # void Benchmark::begin(String domain)
  61. # domain: A unique name for the piece of code you're benchmarking.
  62. # Requires: defined($domain)
  63. #
  64. # Begin measuring the time that a piece of code will take.
  65. ##
  66. # void Benchmark::end(String domain)
  67. # domain: A unique name for the piece of code you're benchmarking.
  68. # Requires: defined($domain)
  69. #
  70. # End measuring the time that a piece of code took.
  71. sub percent {
  72. my ($part, $total) = @_;
  73. if ($total == 0) {
  74. return '-';
  75. } else {
  76. return sprintf("%.2f%%", $part / $total * 100);
  77. }
  78. }
  79. ##
  80. # String Benchmark::results(String relativeTo)
  81. # relativeTo: The domain with which percentages are calculated.
  82. # Requires: defined($relativeTo)
  83. # Ensures: defined(result)
  84. #
  85. # Returns a string which contains the benchmarking results.
  86. sub results {
  87. my ($relativeTo) = @_;
  88. my $results = getResults();
  89. my ($result, $totalCPU, $totalReal);
  90. $result  = sprintf "%-30s  %-23s  %-23sn", "Domain", "CPU", "Real";
  91. $result .= "------------------------------------------------------------------------n";
  92. $totalCPU = clock2msec($results->{$relativeTo}{clock});
  93. $totalReal = $results->{$relativeTo}{realTime};
  94. my $sortFunc = sub($$) {
  95. my ($a, $b) = @_;
  96. if ($a eq $relativeTo) {
  97. return -1;
  98. } elsif ($b eq $relativeTo) {
  99. return 1;
  100. } else {
  101. return lc($a) cmp lc($b);
  102. }
  103. };
  104. foreach my $domain (sort $sortFunc keys(%{$results})) {
  105. my $item = $results->{$domain};
  106. $result .= sprintf "%-30s  %-23s  %-23sn",
  107. $domain,
  108. sprintf("%.3f (%s)", clock2msec($item->{clock}), percent(clock2msec($item->{clock}), $totalCPU)),
  109. sprintf("%.3f (%s)", $item->{realTime},          percent($item->{realTime}, $totalReal));
  110. }
  111. return $result;
  112. }
  113. 1;