examples/SFExamples/Example_RArray/ThrashingExamples.cpp

00001 /*
00002 Copyright (c) 2002-2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
00003 
00004 Redistribution and use in source and binary forms, with or without
00005 modification, are permitted provided that the following conditions are met:
00006 
00007 * Redistributions of source code must retain the above copyright notice, this
00008   list of conditions and the following disclaimer.
00009 * Redistributions in binary form must reproduce the above copyright notice,
00010   this list of conditions and the following disclaimer in the documentation
00011   and/or other materials provided with the distribution.
00012 * Neither the name of Nokia Corporation nor the names of its contributors
00013   may be used to endorse or promote products derived from this software
00014   without specific prior written permission.
00015 
00016 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00017 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00018 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00019 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00020 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00021 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00022 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00023 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00024 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00025 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00026 
00027 Description:  
00028 */ 
00029 #include "ThrashingExamples.h"
00030 #include "SharedCode.h"
00031 #include <e32test.h>
00032 
00033 extern CConsoleBase* console;
00034 
00035 // ---------------------------------------------------------
00036 // TInt NaiveAddL()
00037 // Adds to an array with a granularity of 1
00038 // this is the worst possible performance
00039 // ---------------------------------------------------------
00040 //
00041 LOCAL_C TInt NaiveAddL()
00042         {
00043         TExampleStruct* values = GenerateValuesLC();
00044         
00045         RExampleArray array(1);
00046     CleanupClosePushL(array);
00047     
00048     const TInt tickCountIn = User::TickCount();
00049     AddElementsL(values, array);
00050     User::After(0);
00051     const TInt tickCountOut = User::TickCount();
00052     
00053     CleanupStack::PopAndDestroy(2, values);
00054     
00055     return tickCountOut - tickCountIn;
00056         }
00057 
00058 // ---------------------------------------------------------
00059 // TInt GranulatedAddL()
00060 // Adds to the array with a granularity of 5000
00061 // Much better performance (~3x)
00062 // ---------------------------------------------------------
00063 //
00064 LOCAL_C TInt GranulatedAddL()
00065         {
00066         TExampleStruct* values = GenerateValuesLC();
00067         
00068         RExampleArray array(KDefaultGranularity);
00069     CleanupClosePushL(array);
00070     
00071     const TInt tickCountIn = User::TickCount();
00072     AddElementsL(values, array);
00073     User::After(0);
00074     const TInt tickCountOut = User::TickCount();
00075     
00076     CleanupStack::PopAndDestroy(2, values);
00077 
00078     return (tickCountOut  - tickCountIn);
00079         }
00080 
00081 // ---------------------------------------------------------
00082 // void ThrashingExamplesL()
00083 // Exmaples to illustrate thrashing
00084 // ---------------------------------------------------------
00085 //
00086 void ThrashingExamplesL()
00087         {
00088         console->Printf(_L("Naive Add functions\n"));
00089         // This example shows the benefits of
00090         // using the granularity functionality
00091         // of RArray to reduce the memory thrashing
00092         // add or removing an array
00093     TInt avg = 0;
00094     TInt totalNaiveAddTimes = 0;
00095     for( TInt i=0; i < KTestRuns; i++)
00096         {
00097         totalNaiveAddTimes += NaiveAddL();
00098         }
00099     
00100     avg = (totalNaiveAddTimes / KTestRuns);
00101     console->Printf(_L("Average naive add (granularity 1, %d elements took %d Milliseconds\n"), KMaxElements, avg);
00102 
00103     console->Printf(_L("Granular Add functions"));
00104     TInt totalGranulatedAddTimes = 0;
00105     for( TInt i=0; i < KTestRuns; i++)
00106         {
00107         totalGranulatedAddTimes += GranulatedAddL();
00108         }
00109     
00110     avg = (totalGranulatedAddTimes / KTestRuns);
00111     console->Printf(_L("Average granulated add (granularity 5000, %d elements took %d Milliseconds\n"), KMaxElements, avg);
00112         }

Generated by  doxygen 1.6.2