void Profiling::OutputInfo(FilePtr _pFile)
	{
		const float fTotal = s_fStopTime - s_fStartTime;
		if (0.0f < fTotal)
		{
			const int sSize = _snprintf_s(s_szBuffer, s_uBufferSize, s_uBufferSize, "calls\n");
			_pFile->Write(s_szBuffer, sSize);
			TagInfoMap::iterator iPair = s_mTags.begin();
			TagInfoMap::iterator iEnd = s_mTags.end();
			while (iEnd != iPair)
			{
				TagInfoRef rTagInfo = iPair->second;
				const float fAverage = (0 < rTagInfo.m_uCount) ? rTagInfo.m_fTotal / float(rTagInfo.m_uCount) : 0.0f;
				const int sSize = _snprintf_s(s_szBuffer, s_uBufferSize, s_uBufferSize,
					"%s : %u calls total=%f(%5.2f%%) min=%f max=%f avg=%f\n",
					rTagInfo.m_strName.c_str(),
					rTagInfo.m_uCount,
					rTagInfo.m_fTotal,
					(rTagInfo.m_fTotal / fTotal) * 100.0f,
					rTagInfo.m_fShortest,
					rTagInfo.m_fLongest,
					fAverage);

				_pFile->Write(s_szBuffer, sSize);

				++iPair;
			}

			{
				const int sSize = _snprintf_s(s_szBuffer, s_uBufferSize, s_uBufferSize, "callstack\n");
				_pFile->Write(s_szBuffer, sSize);
				OutputInfoCallStack(s_mCallStacks, 0, _pFile);
			}
		}
	}
	void Profiling::OutputInfoCallStack(CallInfoMapRef _rmCallStack, UInt _uDepth, FilePtr _pFile)
	{
		const float fTotal = s_fStopTime - s_fStartTime;
		if (0.0f < fTotal)
		{
			CallInfoMap::iterator iPair = _rmCallStack.begin();
			CallInfoMap::iterator iEnd = _rmCallStack.end();
			while (iEnd != iPair)
			{
				CallInfoRef rCallInfo = iPair->second;
				TagInfoRef rTagInfo = s_mTags[iPair->first];
				const float fAverage = (0 < rCallInfo.m_uCount) ? rCallInfo.m_fTotal / float(rCallInfo.m_uCount) : 0.0f;

				for (UInt i = 0 ; (_uDepth > i) && (s_uBufferSize > i) ; ++i)
				{
					s_szBuffer[i] = '\t';
				}

				const int sSize = _snprintf_s(s_szBuffer + _uDepth, s_uBufferSize - _uDepth, s_uBufferSize - _uDepth,
					"%s : %u calls total=%f(%5.2f%%) min=%f max=%f avg=%f\n",
					rTagInfo.m_strName.c_str(),
					rCallInfo.m_uCount,
					rCallInfo.m_fTotal,
					(rCallInfo.m_fTotal / fTotal) * 100.0f,
					rCallInfo.m_fShortest,
					rCallInfo.m_fLongest,
					fAverage);

				_pFile->Write(s_szBuffer, sSize + _uDepth);

				if (false == rCallInfo.m_mChildrenCalls.empty())
				{
					OutputInfoCallStack(rCallInfo.m_mChildrenCalls, _uDepth + 1, _pFile);
				}

				++iPair;
			}
		}
	}