// CreateThreadLocalTmpDir //------------------------------------------------------------------------------ /*static*/ void WorkerThread::CreateThreadLocalTmpDir() { // create isolated subdir AStackString<> tmpFileName; CreateTempFilePath( ".tmp", tmpFileName ); char * lastSlash = tmpFileName.FindLast( NATIVE_SLASH ); tmpFileName.SetLength( (uint32_t)( lastSlash - tmpFileName.Get() ) ); FileIO::EnsurePathExists( tmpFileName ); }
// CompareHashTimes_Small //------------------------------------------------------------------------------ void TestHash::CompareHashTimes_Small() const { // some different strings to hash Array< AString > strings( 32, true ); strings.Append( AString( " " ) ); strings.Append( AString( "short" ) ); strings.Append( AString( "mediumstringmediumstring123456789" ) ); strings.Append( AString( "longstring_98274ncoif834jodhiorhmwe8r8wy48on87h8mhwejrijrdierwurd9j,8chm8hiuorciwriowjri" ) ); strings.Append( AString( "c:\\files\\subdir\\project\\thing\\stuff.cpp" ) ); const size_t numStrings = strings.GetSize(); const size_t numIterations = 102400; // calc datasize size_t dataSize( 0 ); for ( size_t i=0; i<numStrings; ++i ) { dataSize += strings[ i ].GetLength(); } dataSize *= numIterations; // xxHash - 32 { Timer t; uint32_t crc( 0 ); for ( size_t j=0; j<numIterations; ++j ) { for ( size_t i=0; i<numStrings; ++i ) { crc += xxHash::Calc32( strings[ i ].Get(), strings[ i ].GetLength() ); } } float time = t.GetElapsed(); float speed = ( (float)dataSize / (float)( 1024 * 1024 * 1024 ) ) / time; OUTPUT( "xxHash-32 : %2.3fs @ %6.3f GiB/s (hash: 0x%x)\n", time, speed, crc ); } // xxHash - 64 { Timer t; uint64_t crc( 0 ); for ( size_t j=0; j<numIterations; ++j ) { for ( size_t i=0; i<numStrings; ++i ) { crc += xxHash::Calc64( strings[ i ].Get(), strings[ i ].GetLength() ); } } float time = t.GetElapsed(); float speed = ( (float)dataSize / (float)( 1024 * 1024 * 1024 ) ) / time; OUTPUT( "xxHash-64 : %2.3fs @ %6.3f GiB/s (hash: %016llx)\n", time, speed, crc ); } // Murmur3 - 32 { Timer t; uint32_t crc( 0 ); for ( size_t j=0; j<numIterations; ++j ) { for ( size_t i=0; i<numStrings; ++i ) { crc += Murmur3::Calc32( strings[ i ].Get(), strings[ i ].GetLength() ); } } float time = t.GetElapsed(); float speed = ( (float)dataSize / (float)( 1024 * 1024 * 1024 ) ) / time; OUTPUT( "Murmur3-32 : %2.3fs @ %6.3f GiB/s (hash: 0x%x)\n", time, speed, crc ); } // Murmur3 - 128 { Timer t; uint64_t hashB( 0 ); uint64_t hashA( 0 ); for ( size_t j=0; j<numIterations; ++j ) { for ( size_t i=0; i<numStrings; ++i ) { hashA += Murmur3::Calc128( strings[ i ].Get(), strings[ i ].GetLength(), hashB ); } } float time = t.GetElapsed(); float speed = ( (float)dataSize / (float)( 1024 * 1024 * 1024 ) ) / time; OUTPUT( "Murmur3-128 : %2.3fs @ %6.3f GiB/s (%016llx, %016llx)\n", time, speed, hashA, hashB ); } // CRC32 - 8x8 slicing { Timer t; uint32_t crc( 0 ); for ( size_t j=0; j<numIterations; ++j ) { for ( size_t i=0; i<numStrings; ++i ) { crc += CRC32::Calc( strings[ i ].Get(), strings[ i ].GetLength() ); } } float time = t.GetElapsed(); float speed = ( (float)dataSize / (float)( 1024 * 1024 * 1024 ) ) / time; OUTPUT( "CRC32 8x8 : %2.3fs @ %6.3f GiB/s (hash: 0x%x)\n", time, speed, crc ); } // CRC32 - "standard" algorithm { Timer t; uint32_t crc( 0 ); for ( size_t j=0; j<numIterations; ++j ) { for ( size_t i=0; i<numStrings; ++i ) { crc += CRC32::Start(); crc += CRC32::Update( crc, strings[ i ].Get(), strings[ i ].GetLength() ); crc += CRC32::Stop( crc ); } } float time = t.GetElapsed(); float speed = ( (float)dataSize / (float)( 1024 * 1024 * 1024 ) ) / time; OUTPUT( "CRC32 : %2.3fs @ %6.3f GiB/s (hash: 0x%x)\n", time, speed, crc ); } // CRC32Lower { Timer t; uint32_t crc( 0 ); for ( size_t j=0; j<numIterations; ++j ) { for ( size_t i=0; i<numStrings; ++i ) { crc += CRC32::CalcLower( strings[ i ].Get(), strings[ i ].GetLength() ); } } float time = t.GetElapsed(); float speed = ( (float)dataSize / (float)( 1024 * 1024 * 1024 ) ) / time; OUTPUT( "CRC32Lower : %2.3fs @ %6.3f GiB/s (hash: 0x%x)\n", time, speed, crc ); } // Murmur3 - 32 Lower { Timer t; // lower-case and hash it uint32_t crc( 0 ); for ( size_t j=0; j<numIterations; ++j ) { for ( size_t i=0; i<numStrings; ++i ) { const AString & str( strings[ i ] ); AStackString<> tmp; const size_t strLen( str.GetLength() ); tmp.SetLength( (uint32_t)strLen ); for ( size_t k=0; k<strLen; ++k ) { char c = str[ (uint32_t)k ]; tmp[ (uint32_t)k ] = ( ( c >= 'A' ) && ( c <= 'Z' ) ) ? 'a' + ( c - 'A' ) : c; } crc += Murmur3::Calc32( tmp.Get(), tmp.GetLength() ); } } float time = t.GetElapsed(); float speed = ( (float)dataSize / (float)( 1024 * 1024 * 1024 ) ) / time; OUTPUT( "Murmur3-32-Lower: %2.3fs @ %6.3f GiB/s (hash: 0x%x)\n", time, speed, crc ); } }
// GenerateVCXProjFilters //------------------------------------------------------------------------------ const AString & VSProjectGenerator::GenerateVCXProjFilters( const AString & projectFile ) { // preallocate to avoid re-allocations m_Tmp.SetReserved( MEGABYTE ); m_Tmp.SetLength( 0 ); // determine folder for project const char * lastProjSlash = projectFile.FindLast( NATIVE_SLASH ); AStackString<> projectBasePath( projectFile.Get(), lastProjSlash ? lastProjSlash + 1 : projectFile.Get() ); // header Write( "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" ); Write( "<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n" ); // list of all folders Array< AString > folders( 1024, true ); // files { Write( " <ItemGroup>\n" ); const AString * const fEnd = m_Files.End(); for ( const AString * fIt = m_Files.Begin(); fIt!=fEnd; ++fIt ) { // get folder part, relative to base dir AStackString<> folder; GetFolderPath( *fIt, folder ); const char * fileName = fIt->BeginsWithI( projectBasePath ) ? fIt->Get() + projectBasePath.GetLength() : fIt->Get(); Write( " <CustomBuild Include=\"%s\">\n", fileName ); if ( !folder.IsEmpty() ) { Write( " <Filter>%s</Filter>\n", folder.Get() ); } Write( " </CustomBuild>\n" ); // add new folders if ( !folder.IsEmpty() ) { for (;;) { // add this folder if unique bool found = false; for ( const AString * it=folders.Begin(); it!=folders.End(); ++it ) { if ( it->CompareI( folder ) == 0 ) { found = true; break; } } if ( !found ) { folders.Append( folder ); } // handle intermediate folders const char * lastSlash = folder.FindLast( BACK_SLASH ); if ( lastSlash == nullptr ) { break; } folder.SetLength( (uint32_t)( lastSlash - folder.Get() ) ); } } } Write( " </ItemGroup>\n" ); } // folders { const AString * const fEnd = folders.End(); for ( const AString * fIt = folders.Begin(); fIt!=fEnd; ++fIt ) { Write( " <ItemGroup>\n" ); Write( " <Filter Include=\"%s\">\n", fIt->Get() ); Write( " <UniqueIdentifier>{%08x-6c94-4f93-bc2a-7f5284b7d434}</UniqueIdentifier>\n", CRC32::Calc( *fIt ) ); Write( " </Filter>\n" ); Write( " </ItemGroup>\n" ); } } // footer Write( "</Project>" ); // no carriage return m_OutputVCXProjFilters = m_Tmp; return m_OutputVCXProjFilters; }