Index: trunk/nv/core/profiler.hh
===================================================================
--- trunk/nv/core/profiler.hh	(revision 408)
+++ trunk/nv/core/profiler.hh	(revision 409)
@@ -17,9 +17,9 @@
 #include <nv/stl/singleton.hh>
 #include <nv/stl/string.hh>
-#include <nv/stl/unordered_map.hh>
+#include <nv/stl/string_map.hh>
 
 #if NV_PROFILER 
-#define NV_PROFILE( tag ) nv::profiler_guard __profile( tag )
-#define NV_PROFILE_IF( tag, condition ) nv::profiler_condition_guard __profile( tag, condition )
+#define NV_PROFILE( tag ) nv::profiler_guard __profile( tag##_hls64 )
+#define NV_PROFILE_IF( tag, condition ) nv::profiler_condition_guard __profile( tag##_hls64, condition )
 #else
 #define NV_PROFILE( tag )
@@ -33,24 +33,21 @@
 	{
 	protected:
+		typedef hashed_literal_string_64 string_type;
+
 		class node
 		{
+			friend class profiler;
 		public:
-			friend class profiler;
+			~node();
+		protected:
+			node( string_view tag, node* parent );
 			node* get_parent() { return m_parent; }
-			node* get_child( const std::string& tag )
-			{
-				auto it = m_children.find( tag );
-				return ( it != m_children.end() ) ? it->second : nullptr;
-			}
-		protected:
-			node( const string_view& tag, node* parent );
-			node* request_child( const string_view& tag );
+			node* request_child( string_type&& tag );
 			void start();
 			bool stop();
-			~node();
-		protected:
-			typedef unordered_map< std::string, node* > map;
 
-			std::string m_tag;
+			typedef literal_map< node* > map;
+
+			string_view m_tag;
 			map         m_children;
 			node*       m_parent;
@@ -66,5 +63,5 @@
 		~profiler();
 
-		void start_profile( const string_view& tag );
+		void start_profile( string_type&& tag );
 		void stop_profile();
 	public:
@@ -82,7 +79,7 @@
 	{
 	public:
-		profiler_guard( string_view tag )
+		profiler_guard( hashed_literal_string_64&& tag )
 		{
-			profiler::pointer()->start_profile( tag );
+			profiler::pointer()->start_profile( ::nv::move( tag ) );
 		}
 
@@ -96,8 +93,8 @@
 	{
 	public:
-		profiler_condition_guard( string_view tag, bool condition )
+		profiler_condition_guard( hashed_literal_string_64&& tag, bool condition )
 			: m_active( condition )
 		{
-			if ( m_active ) profiler::pointer()->start_profile( tag );
+			if ( m_active ) profiler::pointer()->start_profile( ::nv::move( tag ) );
 		}
 
Index: trunk/src/core/profiler.cc
===================================================================
--- trunk/src/core/profiler.cc	(revision 408)
+++ trunk/src/core/profiler.cc	(revision 409)
@@ -20,5 +20,5 @@
 profiler::profiler()
 {
-	m_root = new node( "root", nullptr );
+	m_root = new node( "root"_hls64, nullptr );
 	m_root->start();
 	m_current = m_root;
@@ -30,9 +30,9 @@
 }
 
-void profiler::start_profile( const string_view& tag )
+void profiler::start_profile( string_type&& tag )
 {
 	if ( tag != m_current->m_tag )
 	{
-		m_current = m_current->request_child( tag );
+		m_current = m_current->request_child( ::nv::move( tag ) );
 	}
 	m_current->start();
@@ -47,6 +47,6 @@
 }
 
-profiler::node::node( const string_view& tag, node* parent )
-	: m_tag( tag.to_string() )
+profiler::node::node( string_view tag, node* parent )
+	: m_tag( ::nv::move( tag ) )
 	, m_parent( parent )
 	, m_recusion( 0 )
@@ -58,8 +58,7 @@
 }
 
-profiler::node* profiler::node::request_child( const string_view& tag )
+profiler::node* profiler::node::request_child( string_type&& tag )
 {
-	std::string stag( tag.to_string() );
-	auto it = m_children.find( stag );
+	auto it = m_children.find( tag );
 	if ( it != m_children.end() ) 
 		return it->second;
@@ -67,5 +66,5 @@
 	{
 		node* result = new node( tag, this );
-		m_children[ stag ] = result;
+		m_children.assign( ::nv::move( tag ), result );
 		return result;
 	}
@@ -131,5 +130,5 @@
 			if ( indent > 0 ) nvmemset( buffer, '-', indent );
 			snprintf( buffer + indent, 128 - indent, "%*.*s %6.2f %6d %9.2f %6.2f", indent - 23, 23 - indent,
-				c->m_tag.c_str(), pparent, calls, total_ms, avg_ms );
+				c->m_tag.data(), pparent, calls, total_ms, avg_ms );
 			NV_LOG_INFO( string_view( buffer, nvstrlen( buffer ) ) );
 			if ( c->m_children.size() > 0 )
