1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_ucb.hxx"
26 #include "cachemapobject1.hxx"
27 #include "cachemapobject2.hxx"
28 #include "cachemapobject3.hxx"
29 #include "cachemapobjectcontainer2.hxx"
30 
31 #ifndef _SOL_TIME_H_
32 #include "osl/time.h"
33 #endif
34 #include "rtl/ref.hxx"
35 #include "rtl/ustring.hxx"
36 
37 #ifndef INCLUDED_CSTDLIB
38 #include <cstdlib>
39 #define INCLUDED_CSTDLIB
40 #endif
41 #ifndef INCLUDED_MEMORY
42 #include <memory>
43 #define INCLUDED_MEMORY
44 #endif
45 #ifndef INCLUDED_STDIO_H
46 #include <stdio.h> // <iostream> or <cstdio> do not work well on all platforms
47 #define INCLUDED_STDIO_H
48 #endif
49 
50 using ucb::cachemap::Object1;
51 using ucb::cachemap::Object2;
52 using ucb::cachemap::Object3;
53 using ucb::cachemap::ObjectContainer1;
54 using ucb::cachemap::ObjectContainer2;
55 using ucb::cachemap::ObjectContainer3;
56 
57 namespace {
58 
59 // Give template function a dummy parameter, to work around MSVC++ bug:
60 template< typename Cont, typename ContRef, typename Obj >
test(Obj *)61 sal_uInt32 test(Obj *)
62 {
63     ContRef xCont(new Cont);
64     rtl::OUString aPrefix(RTL_CONSTASCII_USTRINGPARAM("key"));
65     sal_uInt32 nTimer = osl_getGlobalTimer();
66     for (int i = 0; i < 100000; i += 5)
67     {
68         rtl::OUString
69             aKey0(aPrefix
70                       + rtl::OUString::valueOf(static_cast< sal_Int32 >(
71                                                    i % 100)));
72         rtl::Reference< Obj > xObj01(xCont->get(aKey0));
73         {for (int j = 0; j < 50; ++j)
74             rtl::Reference< Obj > xRef(xObj01);
75         }
76         rtl::Reference< Obj > xObj02(xCont->get(aKey0));
77         {for (int j = 0; j < 50; ++j)
78             rtl::Reference< Obj > xRef(xObj02);
79         }
80 
81         rtl::OUString
82             aKey1(aPrefix
83                       + rtl::OUString::valueOf(static_cast< sal_Int32 >(
84                                                    (i + 1) % 100)));
85         rtl::Reference< Obj > xObj11(xCont->get(aKey1));
86         {for (int j = 0; j < 50; ++j)
87             rtl::Reference< Obj > xRef(xObj11);
88         }
89         rtl::Reference< Obj > xObj12(xCont->get(aKey1));
90         {for (int j = 0; j < 50; ++j)
91             rtl::Reference< Obj > xRef(xObj12);
92         }
93 
94         rtl::OUString
95             aKey2(aPrefix
96                       + rtl::OUString::valueOf(static_cast< sal_Int32 >(
97                                                    (i + 2) % 100)));
98         rtl::Reference< Obj > xObj21(xCont->get(aKey2));
99         {for (int j = 0; j < 50; ++j)
100             rtl::Reference< Obj > xRef(xObj21);
101         }
102         rtl::Reference< Obj > xObj22(xCont->get(aKey2));
103         {for (int j = 0; j < 50; ++j)
104             rtl::Reference< Obj > xRef(xObj22);
105         }
106 
107         rtl::OUString
108             aKey3(aPrefix
109                       + rtl::OUString::valueOf(static_cast< sal_Int32 >(
110                                                    (i + 3) % 100)));
111         rtl::Reference< Obj > xObj31(xCont->get(aKey3));
112         {for (int j = 0; j < 50; ++j)
113             rtl::Reference< Obj > xRef(xObj31);
114         }
115         rtl::Reference< Obj > xObj32(xCont->get(aKey3));
116         {for (int j = 0; j < 50; ++j)
117             rtl::Reference< Obj > xRef(xObj32);
118         }
119 
120         rtl::OUString
121             aKey4(aPrefix
122                       + rtl::OUString::valueOf(static_cast< sal_Int32 >(
123                                                    (i + 4) % 100)));
124         rtl::Reference< Obj > xObj41(xCont->get(aKey4));
125         {for (int j = 0; j < 50; ++j)
126             rtl::Reference< Obj > xRef(xObj41);
127         }
128         rtl::Reference< Obj > xObj42(xCont->get(aKey4));
129         {for (int j = 0; j < 50; ++j)
130             rtl::Reference< Obj > xRef(xObj42);
131         }
132     }
133     return osl_getGlobalTimer() - nTimer;
134 }
135 
136 }
137 
main()138 int main()
139 {
140     // Use the second set of measurements, to avoid startup inaccuracies:
141     for (int i = 0; i < 2; ++i)
142         printf("Version 1: %lu ms.\nVersion 2: %lu ms.\nVersion 3: %lu ms.\n",
143                static_cast< unsigned long >(
144                    test< ObjectContainer1,
145                          rtl::Reference< ObjectContainer1 >,
146                          Object1 >(0)),
147                static_cast< unsigned long >(
148                    test< ObjectContainer2,
149                          std::auto_ptr< ObjectContainer2 >,
150                          Object2 >(0)),
151                static_cast< unsigned long >(
152                    test< ObjectContainer3,
153                          rtl::Reference< ObjectContainer3 >,
154                          Object3 >(0)));
155     return EXIT_SUCCESS;
156 }
157 
158 // unxsols3.pro: Version 1: 9137 ms.
159 //               Version 2: 8634 ms.
160 //               Version 3: 3166 ms.
161 //
162 // wntmsci7.pro: Version 1: 3846 ms.
163 //               Version 2: 5598 ms.
164 //               Version 3: 2704 ms.
165