sl@0: /* sl@0: * Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "tmontgomeryperformance.h" sl@0: #include "t_input.h" sl@0: #include "t_output.h" sl@0: #include sl@0: #include "../../source/bigint/mont.h" sl@0: sl@0: _LIT(KPerfConstFormat, "\tConstruction Time\t%f"); sl@0: _LIT(KPerfMultiplyFormat, "\tMultiply Time\t%f"); sl@0: _LIT(KPerfSquareFormat, "\tSquare Time\t%f"); sl@0: _LIT(KPerfExpFormat, "\tExponentiate Time\t%f"); sl@0: _LIT(KPerfReduceFormat, "\tReduce Time\t%f"); sl@0: sl@0: CTestAction* CMontgomeryPerformance::NewL(RFs& aFs, CConsoleBase& aConsole, sl@0: Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction* self = CMontgomeryPerformance::NewLC(aFs, aConsole, sl@0: aOut, aTestActionSpec); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: CTestAction* CMontgomeryPerformance::NewLC(RFs& aFs, CConsoleBase& aConsole, sl@0: Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CMontgomeryPerformance* self = new(ELeave) CMontgomeryPerformance(aFs, aConsole, aOut); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aTestActionSpec); sl@0: return self; sl@0: } sl@0: sl@0: CMontgomeryPerformance::~CMontgomeryPerformance() sl@0: { sl@0: delete iBody; sl@0: iA.Close(); sl@0: iB.Close(); sl@0: iModulus.Close(); sl@0: } sl@0: sl@0: CMontgomeryPerformance::CMontgomeryPerformance(RFs& aFs, CConsoleBase& aConsole, sl@0: Output& aOut) : CTestAction(aConsole, aOut), iFs(aFs) sl@0: { sl@0: } sl@0: sl@0: void CMontgomeryPerformance::ConstructL(const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction::ConstructL(aTestActionSpec); sl@0: iBody = HBufC8::NewL(aTestActionSpec.iActionBody.Length()); sl@0: iBody->Des().Copy(aTestActionSpec.iActionBody); sl@0: sl@0: iIterations = Input::ParseIntElement(*iBody, _L8(""), _L8("")); sl@0: sl@0: TUint bits = Input::ParseIntElement(*iBody, _L8(""), _L8("")); sl@0: sl@0: do sl@0: { sl@0: if(*((TUint*)&iModulus)) //if the size is zero, ie iModulus hasn't been initialised so don't clean it up sl@0: { sl@0: iModulus.Close(); sl@0: } sl@0: iModulus = RInteger::NewRandomL(bits); sl@0: } sl@0: while(iModulus.IsEven()); sl@0: sl@0: iA = RInteger::NewRandomL(TInteger::One(), iModulus); sl@0: iB = RInteger::NewRandomL(TInteger::One(), iModulus); sl@0: } sl@0: sl@0: void CMontgomeryPerformance::DoPerformPrerequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: iActionState = CTestAction::EAction; sl@0: } sl@0: sl@0: void CMontgomeryPerformance::DoPerformPostrequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: iFinished = ETrue; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: sl@0: void CMontgomeryPerformance::DoReportAction(void) sl@0: { sl@0: } sl@0: sl@0: void CMontgomeryPerformance::DoCheckResult(TInt) sl@0: { sl@0: } sl@0: sl@0: void CMontgomeryPerformance::PerformAction(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: iResult = ETrue; sl@0: sl@0: CMontgomeryStructure* montConst; sl@0: sl@0: TUint iterations = 0; sl@0: sl@0: TTime start, end; sl@0: TTimeIntervalSeconds diff(0); sl@0: const TTimeIntervalSeconds iterationTime(iIterations); sl@0: sl@0: start.UniversalTime(); sl@0: while (diff < iterationTime) sl@0: { sl@0: montConst = CMontgomeryStructure::NewL(iModulus); sl@0: delete montConst; sl@0: iterations++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: sl@0: TTimeIntervalMicroSeconds time = end.MicroSecondsFrom(start); sl@0: TReal rate = I64REAL(time.Int64()) / (iterations); sl@0: TReal rtime = I64REAL(time.Int64()); sl@0: HBufC* realbuf = HBufC::NewLC(128); sl@0: TPtr buf = realbuf->Des(); sl@0: buf.Format(KPerfConstFormat, rate, iterations, rtime); sl@0: iOut.writeString(buf); sl@0: iConsole.Printf(_L(".")); sl@0: sl@0: CMontgomeryStructure* mont = CMontgomeryStructure::NewLC(iModulus); sl@0: sl@0: //Multiply sl@0: diff = 0; sl@0: iterations = 0; sl@0: start.UniversalTime(); sl@0: while (diff < iterationTime) sl@0: { sl@0: mont->MultiplyL(iA, iB); sl@0: iterations++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: sl@0: time = end.MicroSecondsFrom(start); sl@0: rate = I64REAL(time.Int64()) / iterations; sl@0: rtime = I64REAL(time.Int64()); sl@0: buf.Zero(); sl@0: buf.Format(KPerfMultiplyFormat, rate, iterations, rtime); sl@0: iOut.writeString(buf); sl@0: iConsole.Printf(_L(".")); sl@0: sl@0: //Square sl@0: diff = 0; sl@0: iterations = 0; sl@0: start.UniversalTime(); sl@0: while (diff < iterationTime) sl@0: { sl@0: mont->SquareL(iA); sl@0: iterations++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: sl@0: time = end.MicroSecondsFrom(start); sl@0: rate = I64REAL(time.Int64()) / iterations; sl@0: rtime = I64REAL(time.Int64()); sl@0: buf.Zero(); sl@0: buf.Format(KPerfSquareFormat, rate, iterations, rtime); sl@0: iOut.writeString(buf); sl@0: iConsole.Printf(_L(".")); sl@0: sl@0: //Exponentiate sl@0: diff = 0; sl@0: iterations = 0; sl@0: start.UniversalTime(); sl@0: while (diff < iterationTime) sl@0: { sl@0: mont->ExponentiateL(iA, iB); sl@0: iterations++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: sl@0: time = end.MicroSecondsFrom(start); sl@0: rate = I64REAL(time.Int64()) / iterations; sl@0: rtime = I64REAL(time.Int64()); sl@0: sl@0: buf.Zero(); sl@0: buf.Format(KPerfExpFormat, rate, iterations, rtime); sl@0: iOut.writeString(buf); sl@0: iConsole.Printf(_L(".")); sl@0: sl@0: //Reduce sl@0: RInteger top = iA.TimesL(iB); sl@0: CleanupStack::PushL(top); sl@0: sl@0: diff = 0; sl@0: iterations = 0; sl@0: start.UniversalTime(); sl@0: while (diff < iterationTime) sl@0: { sl@0: mont->ReduceL(top); sl@0: iterations++; sl@0: end.UniversalTime(); sl@0: end.SecondsFrom(start, diff); sl@0: } sl@0: end.UniversalTime(); sl@0: sl@0: CleanupStack::PopAndDestroy(&top); sl@0: sl@0: time = end.MicroSecondsFrom(start); sl@0: rate = I64REAL(time.Int64()) / iterations; sl@0: rtime = I64REAL(time.Int64()); sl@0: buf.Zero(); sl@0: buf.Format(KPerfReduceFormat, rate, iterations, rtime); sl@0: iOut.writeString(buf); sl@0: iConsole.Printf(_L(".")); sl@0: CleanupStack::PopAndDestroy(mont); sl@0: CleanupStack::PopAndDestroy(realbuf); sl@0: sl@0: User::RequestComplete(status, KErrNone); sl@0: iActionState = CTestAction::EPostrequisite; sl@0: } sl@0: