From 9ec432034dc3c45d7ce763eb02dae4cc7f6b8da8 Mon Sep 17 00:00:00 2001 From: Steven Bennetts Date: Sun, 21 Jun 2009 08:04:56 +0000 Subject: merge -r 122421-124917 viewer-2.0.0-2 -> viewer-2.0.0-3 ignore-dead-branch --- indra/newview/llmetricperformancetester.cpp | 258 ++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 indra/newview/llmetricperformancetester.cpp (limited to 'indra/newview/llmetricperformancetester.cpp') diff --git a/indra/newview/llmetricperformancetester.cpp b/indra/newview/llmetricperformancetester.cpp new file mode 100644 index 0000000000..93288c98d7 --- /dev/null +++ b/indra/newview/llmetricperformancetester.cpp @@ -0,0 +1,258 @@ +/** + * @file llmetricperformancetester.cpp + * @brief LLMetricPerformanceTester class implementation + * + * $LicenseInfo:firstyear=2004&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "indra_constants.h" +#include "llerror.h" +#include "llmath.h" +#include "llfontgl.h" +#include "llsdserialize.h" +#include "llstat.h" +#include "lltreeiterators.h" +#include "llmetricperformancetester.h" + +LLMetricPerformanceTester::name_tester_map_t LLMetricPerformanceTester::sTesterMap ; + +//static +void LLMetricPerformanceTester::initClass() +{ +} +//static +void LLMetricPerformanceTester::cleanClass() +{ + for(name_tester_map_t::iterator iter = sTesterMap.begin() ; iter != sTesterMap.end() ; ++iter) + { + delete iter->second ; + } + sTesterMap.clear() ; +} + +//static +void LLMetricPerformanceTester::addTester(LLMetricPerformanceTester* tester) +{ + if(!tester) + { + llerrs << "invalid tester!" << llendl ; + return ; + } + + std::string name = tester->getName() ; + if(getTester(name)) + { + llerrs << "Tester name is used by some other tester: " << name << llendl ; + return ; + } + + sTesterMap.insert(std::make_pair(name, tester)); + + return ; +} + +//static +LLMetricPerformanceTester* LLMetricPerformanceTester::getTester(std::string label) +{ + name_tester_map_t::iterator found_it = sTesterMap.find(label) ; + if(found_it != sTesterMap.end()) + { + return found_it->second ; + } + + return NULL ; +} + +LLMetricPerformanceTester::LLMetricPerformanceTester(std::string name, BOOL use_default_performance_analysis) + : mName(name), + mBaseSessionp(NULL), + mCurrentSessionp(NULL), + mCount(0), + mUseDefaultPerformanceAnalysis(use_default_performance_analysis) +{ + if(mName == std::string()) + { + llerrs << "invalid name." << llendl ; + } + + LLMetricPerformanceTester::addTester(this) ; +} + +/*virtual*/ +LLMetricPerformanceTester::~LLMetricPerformanceTester() +{ + if(mBaseSessionp) + { + delete mBaseSessionp ; + mBaseSessionp = NULL ; + } + if(mCurrentSessionp) + { + delete mCurrentSessionp ; + mCurrentSessionp = NULL ; + } +} + +void LLMetricPerformanceTester::incLabel() +{ + mCurLabel = llformat("%s-%d", mName.c_str(), mCount++) ; +} +void LLMetricPerformanceTester::preOutputTestResults(LLSD* sd) +{ + incLabel() ; + (*sd)[mCurLabel]["Name"] = mName ; +} +void LLMetricPerformanceTester::postOutputTestResults(LLSD* sd) +{ + LLMutexLock lock(LLFastTimer::sLogLock); + LLFastTimer::sLogQueue.push((*sd)); +} + +void LLMetricPerformanceTester::outputTestResults() +{ + LLSD sd ; + preOutputTestResults(&sd) ; + + outputTestRecord(&sd) ; + + postOutputTestResults(&sd) ; +} + +void LLMetricPerformanceTester::addMetricString(std::string str) +{ + mMetricStrings.push_back(str) ; +} + +const std::string& LLMetricPerformanceTester::getMetricString(U32 index) const +{ + return mMetricStrings[index] ; +} + +void LLMetricPerformanceTester::prePerformanceAnalysis() +{ + mCount = 0 ; + incLabel() ; +} + +// +//default analyzing the performance +// +/*virtual*/ +void LLMetricPerformanceTester::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) +{ + if(mUseDefaultPerformanceAnalysis)//use default performance analysis + { + prePerformanceAnalysis() ; + + BOOL in_base = (*base).has(mCurLabel) ; + BOOL in_current = (*current).has(mCurLabel) ; + + while(in_base || in_current) + { + LLSD::String label = mCurLabel ; + + if(in_base && in_current) + { + *os << llformat("%s\n", label.c_str()) ; + + for(U32 index = 0 ; index < mMetricStrings.size() ; index++) + { + switch((*current)[label][ mMetricStrings[index] ].type()) + { + case LLSD::TypeInteger: + compareTestResults(os, mMetricStrings[index], + (S32)((*base)[label][ mMetricStrings[index] ].asInteger()), (S32)((*current)[label][ mMetricStrings[index] ].asInteger())) ; + break ; + case LLSD::TypeReal: + compareTestResults(os, mMetricStrings[index], + (F32)((*base)[label][ mMetricStrings[index] ].asReal()), (F32)((*current)[label][ mMetricStrings[index] ].asReal())) ; + break; + default: + llerrs << "unsupported metric " << mMetricStrings[index] << " LLSD type: " << (S32)(*current)[label][ mMetricStrings[index] ].type() << llendl ; + } + } + } + + incLabel() ; + in_base = (*base).has(mCurLabel) ; + in_current = (*current).has(mCurLabel) ; + } + }//end of default + else + { + //load the base session + prePerformanceAnalysis() ; + mBaseSessionp = loadTestSession(base) ; + + //load the current session + prePerformanceAnalysis() ; + mCurrentSessionp = loadTestSession(current) ; + + if(!mBaseSessionp || !mCurrentSessionp) + { + llerrs << "memory error during loading test sessions." << llendl ; + } + + //compare + compareTestSessions(os) ; + + //release memory + if(mBaseSessionp) + { + delete mBaseSessionp ; + mBaseSessionp = NULL ; + } + if(mCurrentSessionp) + { + delete mCurrentSessionp ; + mCurrentSessionp = NULL ; + } + } +} + +//virtual +void LLMetricPerformanceTester::compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) +{ + *os << llformat(" ,%s, %d, %d, %d, %.4f\n", metric_string.c_str(), v_base, v_current, + v_current - v_base, (v_base != 0) ? 100.f * v_current / v_base : 0) ; +} + +//virtual +void LLMetricPerformanceTester::compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) +{ + *os << llformat(" ,%s, %.4f, %.4f, %.4f, %.4f\n", metric_string.c_str(), v_base, v_current, + v_current - v_base, (fabs(v_base) > 0.0001f) ? 100.f * v_current / v_base : 0.f ) ; +} + +//virtual +LLMetricPerformanceTester::LLTestSession::~LLTestSession() +{ +} + -- cgit v1.2.3