perf.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:5k
源码类别:

并行计算

开发平台:

Visual C++

  1. //----------------------------------------------------------------------
  2. // File: perf.cpp
  3. // Programmer: Sunil Arya and David Mount
  4. // Description: Methods for performance stats
  5. // Last modified: 01/04/05 (Version 1.0)
  6. //----------------------------------------------------------------------
  7. // Copyright (c) 1997-2005 University of Maryland and Sunil Arya and
  8. // David Mount.  All Rights Reserved.
  9. // 
  10. // This software and related documentation is part of the Approximate
  11. // Nearest Neighbor Library (ANN).  This software is provided under
  12. // the provisions of the Lesser GNU Public License (LGPL).  See the
  13. // file ../ReadMe.txt for further information.
  14. // 
  15. // The University of Maryland (U.M.) and the authors make no
  16. // representations about the suitability or fitness of this software for
  17. // any purpose.  It is provided "as is" without express or implied
  18. // warranty.
  19. //----------------------------------------------------------------------
  20. // History:
  21. // Revision 0.1  03/04/98
  22. // Initial release
  23. // Revision 1.0  04/01/05
  24. // Changed names to avoid namespace conflicts.
  25. // Added flush after printing performance stats to fix bug
  26. // in Microsoft Windows version.
  27. //----------------------------------------------------------------------
  28. #include "../ANN.h" // basic ANN includes
  29. #include "../ANNperf.h" // performance includes
  30. using namespace std; // make std:: available
  31. //----------------------------------------------------------------------
  32. // Performance statistics
  33. // The following data and routines are used for computing
  34. // performance statistics for nearest neighbor searching.
  35. // Because these routines can slow the code down, they can be
  36. // activated and deactiviated by defining the PERF variable,
  37. // by compiling with the option: -DPERF
  38. //----------------------------------------------------------------------
  39. //----------------------------------------------------------------------
  40. // Global counters for performance measurement
  41. //----------------------------------------------------------------------
  42. int ann_Ndata_pts  = 0; // number of data points
  43. int ann_Nvisit_lfs = 0; // number of leaf nodes visited
  44. int ann_Nvisit_spl = 0; // number of splitting nodes visited
  45. int ann_Nvisit_shr = 0; // number of shrinking nodes visited
  46. int ann_Nvisit_pts = 0; // visited points for one query
  47. int ann_Ncoord_hts = 0; // coordinate hits for one query
  48. int ann_Nfloat_ops = 0; // floating ops for one query
  49. ANNsampStat ann_visit_lfs; // stats on leaf nodes visits
  50. ANNsampStat ann_visit_spl; // stats on splitting nodes visits
  51. ANNsampStat ann_visit_shr; // stats on shrinking nodes visits
  52. ANNsampStat ann_visit_nds; // stats on total nodes visits
  53. ANNsampStat ann_visit_pts; // stats on points visited
  54. ANNsampStat ann_coord_hts; // stats on coordinate hits
  55. ANNsampStat ann_float_ops; // stats on floating ops
  56. //
  57. ANNsampStat ann_average_err; // average error
  58. ANNsampStat ann_rank_err; // rank error
  59. //----------------------------------------------------------------------
  60. // Routines for statistics.
  61. //----------------------------------------------------------------------
  62. DLL_API void annResetStats(int data_size) // reset stats for a set of queries
  63. {
  64. ann_Ndata_pts  = data_size;
  65. ann_visit_lfs.reset();
  66. ann_visit_spl.reset();
  67. ann_visit_shr.reset();
  68. ann_visit_nds.reset();
  69. ann_visit_pts.reset();
  70. ann_coord_hts.reset();
  71. ann_float_ops.reset();
  72. ann_average_err.reset();
  73. ann_rank_err.reset();
  74. }
  75. DLL_API void annResetCounts() // reset counts for one query
  76. {
  77. ann_Nvisit_lfs = 0;
  78. ann_Nvisit_spl = 0;
  79. ann_Nvisit_shr = 0;
  80. ann_Nvisit_pts = 0;
  81. ann_Ncoord_hts = 0;
  82. ann_Nfloat_ops = 0;
  83. }
  84. DLL_API void annUpdateStats() // update stats with current counts
  85. {
  86. ann_visit_lfs += ann_Nvisit_lfs;
  87. ann_visit_nds += ann_Nvisit_spl + ann_Nvisit_lfs;
  88. ann_visit_spl += ann_Nvisit_spl;
  89. ann_visit_shr += ann_Nvisit_shr;
  90. ann_visit_pts += ann_Nvisit_pts;
  91. ann_coord_hts += ann_Ncoord_hts;
  92. ann_float_ops += ann_Nfloat_ops;
  93. }
  94. // print a single statistic
  95. void print_one_stat(char *title, ANNsampStat s, double div)
  96. {
  97. cout << title << "= [ ";
  98. cout.width(9); cout << s.mean()/div << " : ";
  99. cout.width(9); cout << s.stdDev()/div << " ]<";
  100. cout.width(9); cout << s.min()/div << " , ";
  101. cout.width(9); cout << s.max()/div << " >n";
  102. }
  103. DLL_API void annPrintStats( // print statistics for a run
  104. ANNbool validate) // true if average errors desired
  105. {
  106. cout.precision(4); // set floating precision
  107. cout << "  (Performance stats: "
  108.  << " [      mean :    stddev ]<      min ,       max >n";
  109. print_one_stat("    leaf_nodes       ", ann_visit_lfs, 1);
  110. print_one_stat("    splitting_nodes  ", ann_visit_spl, 1);
  111. print_one_stat("    shrinking_nodes  ", ann_visit_shr, 1);
  112. print_one_stat("    total_nodes      ", ann_visit_nds, 1);
  113. print_one_stat("    points_visited   ", ann_visit_pts, 1);
  114. print_one_stat("    coord_hits/pt    ", ann_coord_hts, ann_Ndata_pts);
  115. print_one_stat("    floating_ops_(K) ", ann_float_ops, 1000);
  116. if (validate) {
  117. print_one_stat("    average_error    ", ann_average_err, 1);
  118. print_one_stat("    rank_error       ", ann_rank_err, 1);
  119. }
  120. cout.precision(0); // restore the default
  121. cout << "  )n";
  122. cout.flush();
  123. }