1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 
29 // MARKER(update_precomp.py): autogen include statement, do not remove
30 #include "precompiled_bridges.hxx"
31 
32 #include <stdio.h>
33 #include <math.h>
34 
35 #include <osl/interlck.h>
36 #include <osl/mutex.hxx>
37 #include <osl/semaphor.h>
38 
39 #include <rtl/string.hxx>
40 #include <rtl/byteseq.hxx>
41 
42 #include <com/sun/star/uno/Sequence.hxx>
43 
44 #ifdef SAL_W32
45 #include <windows.h>
46 #else
47 #include <sys/times.h>
48 #endif
49 #ifndef ULONG_MAX
50 #define ULONG_MAX 0xffffffff
51 #endif
52 
53 using namespace ::rtl;
54 using namespace ::osl;
55 using namespace ::com::sun::star::uno;
56 
57 static inline sal_uInt32 getSystemTicks()
58 {
59 #ifdef SAL_W32
60 	return (sal_uInt32)GetTickCount();
61 #else // only UNX supported for now
62 	static sal_uInt32	nImplTicksPerSecond = 0;
63 	static double		dImplTicksPerSecond;
64 	static double		dImplTicksULONGMAX;
65 
66 	struct tms			aTms;
67 	sal_uInt32 nTicks = (sal_uInt32)times( &aTms );
68 
69 	if ( !nImplTicksPerSecond )
70 	{
71 		nImplTicksPerSecond = CLK_TCK;
72 		dImplTicksPerSecond = nImplTicksPerSecond;
73 		dImplTicksULONGMAX	= (double)(sal_uInt32)ULONG_MAX;
74 	}
75 
76 	double fTicks = nTicks;
77 	fTicks *= 1000;
78 	fTicks /= dImplTicksPerSecond;
79 	fTicks = fmod (fTicks, dImplTicksULONGMAX);
80 
81 	return (sal_uInt32)fTicks;
82 #endif
83 }
84 
85 class MyTimer
86 {
87 public:
88 	MyTimer(  const OString &descString ) :
89 		nStart( getSystemTicks() ),
90 		m_descString( descString )
91 		{
92 		}
93 	~MyTimer( )
94 		{
95 			printf( "%f s : %s\n", (getSystemTicks() -nStart) / 1000., m_descString.getStr() );
96 		}
97 private:
98 	sal_uInt32 nStart;
99 	OString m_descString;
100 };
101 
102 void main()
103 {
104 	// interlocked count
105 	{
106 		MyTimer timer( "performance - 1000*10000 interlocked count" );
107 		oslInterlockedCount count;
108 		for( int i = 0 ; i < 1000*10000 ; i ++  )
109 		{
110 			osl_incrementInterlockedCount( &count );
111 		}
112 	}
113 	{
114 		OString myDummyString( "blubber" );
115 		MyTimer timer( "performance - 1000*10000 acquiring/releasing a refcounted string(without destruction)" );
116 		for( int i = 0 ; i < 1000*10000 ; i ++  )
117 		{
118 			OString myNextDummyString = myDummyString ;
119 		}
120 	}
121 
122 	printf( "--------------------\n" );
123 	{
124 		Mutex mutex;
125 		MyTimer timer( "performance - 1000*10000 acquiring/releasing an osl::Mutex" );
126 		for( int i = 0 ; i < 1000*10000 ; i ++  )
127 		{
128 			MutexGuard guard( mutex );
129 		}
130 	}
131 
132 	{
133 		oslSemaphore sema = osl_createSemaphore(1);
134 		MyTimer timer( "performance - 1000*10000 acquiring/releasing an osl::Semaphore" );
135 		for( int i = 0 ; i < 1000*10000 ; i ++  )
136 		{
137 			osl_acquireSemaphore( sema );
138 			osl_releaseSemaphore( sema );
139 		}
140 	}
141 
142 	printf( "--------------------\n" );
143 	{
144 		MyTimer timer( "performance - 1000*10000 rtl::ByteSequence(500)" );
145 		for( int i = 0 ; i < 1000*1000 ; i ++  )
146 		{
147 			ByteSequence seq(500);
148 		}
149 	}
150 
151 	{
152 		MyTimer timer( "performance - 1000*1000 rtl::ByteSequence(500,BYTESEQ_NODEFAULT)" );
153 		for( int i = 0 ; i < 1000*1000 ; i ++  )
154 		{
155 			ByteSequence seq(500, BYTESEQ_NODEFAULT);
156 		}
157 	}
158 	{
159 		MyTimer timer( "performance - 1000*1000 com::sun::star::uno::Sequence< sal_Int8 > (500)" );
160 		for( int i = 0 ; i < 1000*1000 ; i ++  )
161 		{
162 			Sequence< sal_Int8> seq(500);
163 		}
164 	}
165 	{
166 		MyTimer timer( "performance - 1000*1000 rtl_freeMemory( rtl_allocateMemory( 512 ) )" );
167 		for( int i = 0 ; i < 1000*1000 ; i ++  )
168 		{
169 			rtl_freeMemory( rtl_allocateMemory( 512 ) );
170 		}
171 	}
172 
173 	printf( "--------------------\n" );
174 	{
175 		MyTimer timer( "performance - 1000*1000 byte  string construction/destruction" );
176 		for( int i = 0 ; i < 1000*1000 ; i ++  )
177 		{
178 			OString textEnc( "this is a test string" );
179 		}
180 	}
181 
182 	{
183 		MyTimer timer( "performance - 1000*1000 unicode string construction/destruction" );
184 		for( int i = 0 ; i < 1000*1000 ; i ++  )
185 		{
186 			OUString textEnc( RTL_CONSTASCII_USTRINGPARAM( "this is a test string" ) );
187 		}
188 	}
189 
190 }
191