llmetricperformancetester.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmetricperformancetester.cpp
  3.  * @brief LLMetricPerformanceTester class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2004-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "indra_constants.h"
  34. #include "llerror.h"
  35. #include "llmath.h"
  36. #include "llfontgl.h"
  37. #include "llsdserialize.h"
  38. #include "llstat.h"
  39. #include "lltreeiterators.h"
  40. #include "llmetricperformancetester.h"
  41. LLMetricPerformanceTester::name_tester_map_t LLMetricPerformanceTester::sTesterMap ;
  42. //static 
  43. void LLMetricPerformanceTester::initClass() 
  44. {
  45. }
  46. //static 
  47. void LLMetricPerformanceTester::cleanClass() 
  48. {
  49. for(name_tester_map_t::iterator iter = sTesterMap.begin() ; iter != sTesterMap.end() ; ++iter)
  50. {
  51. delete iter->second ;
  52. }
  53. sTesterMap.clear() ;
  54. }
  55. //static 
  56. void LLMetricPerformanceTester::addTester(LLMetricPerformanceTester* tester) 
  57. {
  58. if(!tester)
  59. {
  60. llerrs << "invalid tester!" << llendl ;
  61. return ;
  62. }
  63. std::string name = tester->getName() ;
  64. if(getTester(name))
  65. {
  66. llerrs << "Tester name is used by some other tester: " << name << llendl ;
  67. return ;
  68. }
  69. sTesterMap.insert(std::make_pair(name, tester));
  70. return ;
  71. }
  72. //static 
  73. LLMetricPerformanceTester* LLMetricPerformanceTester::getTester(std::string label) 
  74. {
  75. name_tester_map_t::iterator found_it = sTesterMap.find(label) ;
  76. if(found_it != sTesterMap.end())
  77. {
  78. return found_it->second ;
  79. }
  80. return NULL ;
  81. }
  82. LLMetricPerformanceTester::LLMetricPerformanceTester(std::string name, BOOL use_default_performance_analysis)
  83. : mName(name),
  84. mBaseSessionp(NULL),
  85. mCurrentSessionp(NULL),
  86. mCount(0),
  87. mUseDefaultPerformanceAnalysis(use_default_performance_analysis)
  88. {
  89. if(mName == std::string())
  90. {
  91. llerrs << "invalid name." << llendl ;
  92. }
  93. LLMetricPerformanceTester::addTester(this) ;
  94. }
  95. /*virtual*/ 
  96. LLMetricPerformanceTester::~LLMetricPerformanceTester() 
  97. {
  98. if(mBaseSessionp)
  99. {
  100. delete mBaseSessionp ;
  101. mBaseSessionp = NULL ;
  102. }
  103. if(mCurrentSessionp)
  104. {
  105. delete mCurrentSessionp ;
  106. mCurrentSessionp = NULL ;
  107. }
  108. }
  109. void LLMetricPerformanceTester::incLabel()
  110. {
  111. mCurLabel = llformat("%s-%d", mName.c_str(), mCount++) ;
  112. }
  113. void LLMetricPerformanceTester::preOutputTestResults(LLSD* sd) 
  114. {
  115. incLabel() ;
  116. (*sd)[mCurLabel]["Name"] = mName ;
  117. }
  118. void LLMetricPerformanceTester::postOutputTestResults(LLSD* sd)
  119. {
  120. LLMutexLock lock(LLFastTimer::sLogLock);
  121. LLFastTimer::sLogQueue.push((*sd));
  122. }
  123. void LLMetricPerformanceTester::outputTestResults() 
  124. {
  125. LLSD sd ;
  126. preOutputTestResults(&sd) ; 
  127. outputTestRecord(&sd) ;
  128. postOutputTestResults(&sd) ;
  129. }
  130. void LLMetricPerformanceTester::addMetricString(std::string str)
  131. {
  132. mMetricStrings.push_back(str) ;
  133. }
  134. const std::string& LLMetricPerformanceTester::getMetricString(U32 index) const 
  135. {
  136. return mMetricStrings[index] ;
  137. }
  138. void LLMetricPerformanceTester::prePerformanceAnalysis() 
  139. {
  140. mCount = 0 ;
  141. incLabel() ;
  142. }
  143. //
  144. //default analyzing the performance
  145. //
  146. /*virtual*/ 
  147. void LLMetricPerformanceTester::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) 
  148. {
  149. if(mUseDefaultPerformanceAnalysis)//use default performance analysis
  150. {
  151. prePerformanceAnalysis() ;
  152. BOOL in_base = (*base).has(mCurLabel) ;
  153. BOOL in_current = (*current).has(mCurLabel) ;
  154. while(in_base || in_current)
  155. {
  156. LLSD::String label = mCurLabel ;
  157. if(in_base && in_current)
  158. {
  159. *os << llformat("%sn", label.c_str()) ;
  160. for(U32 index = 0 ; index < mMetricStrings.size() ; index++)
  161. {
  162. switch((*current)[label][ mMetricStrings[index] ].type())
  163. {
  164. case LLSD::TypeInteger:
  165. compareTestResults(os, mMetricStrings[index], 
  166. (S32)((*base)[label][ mMetricStrings[index] ].asInteger()), (S32)((*current)[label][ mMetricStrings[index] ].asInteger())) ;
  167. break ;
  168. case LLSD::TypeReal:
  169. compareTestResults(os, mMetricStrings[index], 
  170. (F32)((*base)[label][ mMetricStrings[index] ].asReal()), (F32)((*current)[label][ mMetricStrings[index] ].asReal())) ;
  171. break;
  172. default:
  173. llerrs << "unsupported metric " << mMetricStrings[index] << " LLSD type: " << (S32)(*current)[label][ mMetricStrings[index] ].type() << llendl ;
  174. }
  175. }
  176. }
  177. incLabel() ;
  178. in_base = (*base).has(mCurLabel) ;
  179. in_current = (*current).has(mCurLabel) ;
  180. }
  181. }//end of default
  182. else
  183. {
  184. //load the base session
  185. prePerformanceAnalysis() ;
  186. mBaseSessionp = loadTestSession(base) ;
  187. //load the current session
  188. prePerformanceAnalysis() ;
  189. mCurrentSessionp = loadTestSession(current) ;
  190. if(!mBaseSessionp || !mCurrentSessionp)
  191. {
  192. llerrs << "memory error during loading test sessions." << llendl ;
  193. }
  194. //compare
  195. compareTestSessions(os) ;
  196. //release memory
  197. if(mBaseSessionp)
  198. {
  199. delete mBaseSessionp ;
  200. mBaseSessionp = NULL ;
  201. }
  202. if(mCurrentSessionp)
  203. {
  204. delete mCurrentSessionp ;
  205. mCurrentSessionp = NULL ;
  206. }
  207. }
  208. }
  209. //virtual 
  210. void LLMetricPerformanceTester::compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) 
  211. {
  212. *os << llformat(" ,%s, %d, %d, %d, %.4fn", metric_string.c_str(), v_base, v_current, 
  213. v_current - v_base, (v_base != 0) ? 100.f * v_current / v_base : 0) ;
  214. }
  215. //virtual 
  216. void LLMetricPerformanceTester::compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) 
  217. {
  218. *os << llformat(" ,%s, %.4f, %.4f, %.4f, %.4fn", metric_string.c_str(), v_base, v_current,
  219. v_current - v_base, (fabs(v_base) > 0.0001f) ? 100.f * v_current / v_base : 0.f ) ;
  220. }
  221. //virtual 
  222. LLMetricPerformanceTester::LLTestSession::~LLTestSession() 
  223. {
  224. }