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 }