First public contribution.
2 * Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
19 #include "tmontgomeryperformance.h"
23 #include "../../source/bigint/mont.h"
25 _LIT(KPerfConstFormat, "\tConstruction Time\t%f");
26 _LIT(KPerfMultiplyFormat, "\tMultiply Time\t%f");
27 _LIT(KPerfSquareFormat, "\tSquare Time\t%f");
28 _LIT(KPerfExpFormat, "\tExponentiate Time\t%f");
29 _LIT(KPerfReduceFormat, "\tReduce Time\t%f");
31 CTestAction* CMontgomeryPerformance::NewL(RFs& aFs, CConsoleBase& aConsole,
32 Output& aOut, const TTestActionSpec& aTestActionSpec)
34 CTestAction* self = CMontgomeryPerformance::NewLC(aFs, aConsole,
35 aOut, aTestActionSpec);
40 CTestAction* CMontgomeryPerformance::NewLC(RFs& aFs, CConsoleBase& aConsole,
41 Output& aOut, const TTestActionSpec& aTestActionSpec)
43 CMontgomeryPerformance* self = new(ELeave) CMontgomeryPerformance(aFs, aConsole, aOut);
44 CleanupStack::PushL(self);
45 self->ConstructL(aTestActionSpec);
49 CMontgomeryPerformance::~CMontgomeryPerformance()
57 CMontgomeryPerformance::CMontgomeryPerformance(RFs& aFs, CConsoleBase& aConsole,
58 Output& aOut) : CTestAction(aConsole, aOut), iFs(aFs)
62 void CMontgomeryPerformance::ConstructL(const TTestActionSpec& aTestActionSpec)
64 CTestAction::ConstructL(aTestActionSpec);
65 iBody = HBufC8::NewL(aTestActionSpec.iActionBody.Length());
66 iBody->Des().Copy(aTestActionSpec.iActionBody);
68 iIterations = Input::ParseIntElement(*iBody, _L8("<iterations>"), _L8("</iterations>"));
70 TUint bits = Input::ParseIntElement(*iBody, _L8("<bits>"), _L8("</bits>"));
74 if(*((TUint*)&iModulus)) //if the size is zero, ie iModulus hasn't been initialised so don't clean it up
78 iModulus = RInteger::NewRandomL(bits);
80 while(iModulus.IsEven());
82 iA = RInteger::NewRandomL(TInteger::One(), iModulus);
83 iB = RInteger::NewRandomL(TInteger::One(), iModulus);
86 void CMontgomeryPerformance::DoPerformPrerequisite(TRequestStatus& aStatus)
88 TRequestStatus* status = &aStatus;
89 User::RequestComplete(status, KErrNone);
90 iActionState = CTestAction::EAction;
93 void CMontgomeryPerformance::DoPerformPostrequisite(TRequestStatus& aStatus)
95 TRequestStatus* status = &aStatus;
97 User::RequestComplete(status, KErrNone);
100 void CMontgomeryPerformance::DoReportAction(void)
104 void CMontgomeryPerformance::DoCheckResult(TInt)
108 void CMontgomeryPerformance::PerformAction(TRequestStatus& aStatus)
110 TRequestStatus* status = &aStatus;
113 CMontgomeryStructure* montConst;
115 TUint iterations = 0;
118 TTimeIntervalSeconds diff(0);
119 const TTimeIntervalSeconds iterationTime(iIterations);
121 start.UniversalTime();
122 while (diff < iterationTime)
124 montConst = CMontgomeryStructure::NewL(iModulus);
128 end.SecondsFrom(start, diff);
132 TTimeIntervalMicroSeconds time = end.MicroSecondsFrom(start);
133 TReal rate = I64REAL(time.Int64()) / (iterations);
134 TReal rtime = I64REAL(time.Int64());
135 HBufC* realbuf = HBufC::NewLC(128);
136 TPtr buf = realbuf->Des();
137 buf.Format(KPerfConstFormat, rate, iterations, rtime);
138 iOut.writeString(buf);
139 iConsole.Printf(_L("."));
141 CMontgomeryStructure* mont = CMontgomeryStructure::NewLC(iModulus);
146 start.UniversalTime();
147 while (diff < iterationTime)
149 mont->MultiplyL(iA, iB);
152 end.SecondsFrom(start, diff);
156 time = end.MicroSecondsFrom(start);
157 rate = I64REAL(time.Int64()) / iterations;
158 rtime = I64REAL(time.Int64());
160 buf.Format(KPerfMultiplyFormat, rate, iterations, rtime);
161 iOut.writeString(buf);
162 iConsole.Printf(_L("."));
167 start.UniversalTime();
168 while (diff < iterationTime)
173 end.SecondsFrom(start, diff);
177 time = end.MicroSecondsFrom(start);
178 rate = I64REAL(time.Int64()) / iterations;
179 rtime = I64REAL(time.Int64());
181 buf.Format(KPerfSquareFormat, rate, iterations, rtime);
182 iOut.writeString(buf);
183 iConsole.Printf(_L("."));
188 start.UniversalTime();
189 while (diff < iterationTime)
191 mont->ExponentiateL(iA, iB);
194 end.SecondsFrom(start, diff);
198 time = end.MicroSecondsFrom(start);
199 rate = I64REAL(time.Int64()) / iterations;
200 rtime = I64REAL(time.Int64());
203 buf.Format(KPerfExpFormat, rate, iterations, rtime);
204 iOut.writeString(buf);
205 iConsole.Printf(_L("."));
208 RInteger top = iA.TimesL(iB);
209 CleanupStack::PushL(top);
213 start.UniversalTime();
214 while (diff < iterationTime)
219 end.SecondsFrom(start, diff);
223 CleanupStack::PopAndDestroy(&top);
225 time = end.MicroSecondsFrom(start);
226 rate = I64REAL(time.Int64()) / iterations;
227 rtime = I64REAL(time.Int64());
229 buf.Format(KPerfReduceFormat, rate, iterations, rtime);
230 iOut.writeString(buf);
231 iConsole.Printf(_L("."));
232 CleanupStack::PopAndDestroy(mont);
233 CleanupStack::PopAndDestroy(realbuf);
235 User::RequestComplete(status, KErrNone);
236 iActionState = CTestAction::EPostrequisite;