VOID measurePerfOneAlg()

in unittest/lib/perf.cpp [1064:1184]


VOID measurePerfOneAlg( AlgorithmImplementation * pAlgImp )
{
    PerfDataFn dataFn = pAlgImp->m_perfDataFunction;
    PerfDataFn decryptFn = pAlgImp->m_perfDecryptFunction;
    PerfKeyFn  keyFn = pAlgImp->m_perfKeyFunction;
    PerfCleanFn cleanFn = pAlgImp->m_perfCleanFunction;

    CHECK4( keyFn == NULL || cleanFn != NULL, "No clean function in %s/%s", pAlgImp->m_implementationName.c_str(), pAlgImp->m_algorithmName.c_str() );

    const ALG_MEASURE_PARAMS * pParams = NULL;

    String algMode = pAlgImp->m_algorithmName + pAlgImp->m_modeName;

    //print( "%s\n", algMode.c_str() );

    for( int i=0; i<ARRAY_SIZE( g_algMeasureParams ); i++ )
    {
        if( g_algMeasureParams[i].algName == algMode )
        {
            pParams = &g_algMeasureParams[i];
        }
    }

    if( pParams == NULL )
    {
        return;
    }

    std::set<SIZE_T> keySizes;
    std::set<SIZE_T> dataSizes;

    createSizeSet( pParams->keySizes, &keySizes );
    createSizeSet( pParams->dataSizes, &dataSizes );

    SIZE_T nKeySizes = keySizes.size();
    CHECK3( nKeySizes <= MAX_SIZES, "Too many sizes for algorithm %s", pParams->algName );

    for( std::set<SIZE_T>::const_iterator k = keySizes.begin(); k != keySizes.end(); ++k )
    {
        UINT32 keyBytes = *k & 0x00ffffff;
        UINT32 keyFlags = *k & 0xff000000;

        AlgorithmImplementation::ALG_PERF_INFO perfInfo;
        if( nKeySizes > 1 )
        {
            perfInfo.keySize = keyBytes;
        } else {
            perfInfo.keySize = 0;
        }

        //
        // First we measure the speed of the key expansion, if any
        //
        if( keyFn != NULL && (pParams->flags & PERF_NO_KEYPERF) == 0 )
        {
            perfInfo.dataSize = 0;
            perfInfo.cPerByte = 0;
            perfInfo.cFixed = measurePerfOneSize( *k, 0, keyFn, NULL, NULL, cleanFn, TRUE );
            perfInfo.strPostfix = "key";

            pAlgImp->m_perfInfo.push_back( perfInfo );
        }

        if( dataFn != NULL )
        {
            if( decryptFn != NULL )
            {
                perfInfo.strPostfix = "enc";
            } else {
                perfInfo.strPostfix = NULL;

                for( int i=0; i < ARRAY_SIZE( g_exKeyParamMapping ); i++ )
                {
                    if( keyFlags == g_exKeyParamMapping[i].exKeyParam )
                    {
                        perfInfo.strPostfix = g_exKeyParamMapping[i].str;
                        break;
                    }
                }
                CHECK3( perfInfo.strPostfix != NULL, "Extended key param not found %08x", *k );
            }

            if(!g_measure_specific_sizes)
            {
                measurePerfData( keyFn, NULL, dataFn, cleanFn, &dataSizes, *k, &perfInfo );
                pAlgImp->m_perfInfo.push_back( perfInfo );
            }
            else
            {
                for(UINT32 dataSize = g_measure_sizes_start; dataSize <= g_measure_sizes_end; dataSize+=g_measure_sizes_increment)
                {
                    perfInfo.dataSize = dataSize;
                    perfInfo.cFixed = measurePerfOneSize( *k, dataSize, keyFn, NULL, dataFn, cleanFn, FALSE );

                    pAlgImp->m_perfInfo.push_back( perfInfo );
                }
            }
        }

        if( decryptFn != NULL )
        {
            perfInfo.strPostfix = "dec";
            if(!g_measure_specific_sizes)
            {
                measurePerfData( keyFn, dataFn, decryptFn, cleanFn, &dataSizes, *k, &perfInfo );
                pAlgImp->m_perfInfo.push_back( perfInfo );
            }
            else
            {
                for(UINT32 dataSize = g_measure_sizes_start; dataSize <= g_measure_sizes_end; dataSize+=g_measure_sizes_increment)
                {
                    perfInfo.dataSize = dataSize;
                    perfInfo.cFixed = measurePerfOneSize( *k, dataSize, keyFn, dataFn, decryptFn, cleanFn, FALSE );

                    pAlgImp->m_perfInfo.push_back( perfInfo );
                }
            }
        }

    }
}