VirtualBox

source: vbox/trunk/src/VBox/Main/testcase/tstVBoxAPIPerf.cpp

Last change on this file was 106061, checked in by vboxsync, 2 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.9 KB
Line 
1/* $Id: tstVBoxAPIPerf.cpp 106061 2024-09-16 14:03:52Z vboxsync $ */
2/** @file
3 * tstVBoxAPIPerf - Checks the performance of the COM / XPOM API.
4 */
5
6/*
7 * Copyright (C) 2006-2024 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28
29/*********************************************************************************************************************************
30* Header Files *
31*********************************************************************************************************************************/
32#include <VBox/com/com.h>
33#include <VBox/com/string.h>
34#include <VBox/com/array.h>
35#include <VBox/com/Guid.h>
36#include <VBox/com/ErrorInfo.h>
37#include <VBox/com/VirtualBox.h>
38#include <VBox/sup.h>
39
40#include <iprt/test.h>
41#include <iprt/time.h>
42
43
44
45/*********************************************************************************************************************************
46* Global Variables *
47*********************************************************************************************************************************/
48static RTTEST g_hTest;
49
50
51/** Worker fro TST_COM_EXPR(). */
52static HRESULT tstComExpr(HRESULT hrc, const char *pszOperation, int iLine)
53{
54 if (FAILED(hrc))
55 RTTestFailed(g_hTest, "%s failed on line %u with hrc=%Rhrc", pszOperation, iLine, hrc);
56 return hrc;
57}
58
59/** Macro that executes the given expression and report any failure.
60 * The expression must return a HRESULT. */
61#define TST_COM_EXPR(expr) tstComExpr(expr, #expr, __LINE__)
62
63
64
65static void tstApiPrf1(IVirtualBox *pVBox)
66{
67 RTTestSub(g_hTest, "IVirtualBox::Revision performance");
68
69 uint32_t const cCalls = 65536;
70 uint32_t cLeft = cCalls;
71 uint64_t uStartTS = RTTimeNanoTS();
72 while (cLeft-- > 0)
73 {
74 ULONG uRev;
75 HRESULT hrc = pVBox->COMGETTER(Revision)(&uRev);
76 if (FAILED(hrc))
77 {
78 tstComExpr(hrc, "IVirtualBox::Revision", __LINE__);
79 return;
80 }
81 }
82 uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
83 RTTestValue(g_hTest, "IVirtualBox::Revision average", uElapsed / cCalls, RTTESTUNIT_NS_PER_CALL);
84 RTTestSubDone(g_hTest);
85}
86
87
88static void tstApiPrf2(IVirtualBox *pVBox)
89{
90 RTTestSub(g_hTest, "IVirtualBox::Version performance");
91
92 uint32_t const cCalls = 65536;
93 uint32_t cLeft = cCalls;
94 uint64_t uStartTS = RTTimeNanoTS();
95 while (cLeft-- > 0)
96 {
97 com::Bstr bstrVersion;
98 HRESULT hrc = pVBox->COMGETTER(Version)(bstrVersion.asOutParam());
99 if (FAILED(hrc))
100 {
101 tstComExpr(hrc, "IVirtualBox::Version", __LINE__);
102 return;
103 }
104 }
105 uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
106 RTTestValue(g_hTest, "IVirtualBox::Version average", uElapsed / cCalls, RTTESTUNIT_NS_PER_CALL);
107 RTTestSubDone(g_hTest);
108}
109
110
111static void tstApiPrf3(IVirtualBox *pVBox)
112{
113 RTTestSub(g_hTest, "IVirtualBox::Host performance");
114
115 /* The first call. */
116 uint64_t uStartTS = RTTimeNanoTS();
117 IHost *pHost = NULL;
118 HRESULT hrc = pVBox->COMGETTER(Host)(&pHost);
119 if (FAILED(hrc))
120 {
121 tstComExpr(hrc, "IVirtualBox::Host", __LINE__);
122 return;
123 }
124 pHost->Release();
125 uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
126 RTTestValue(g_hTest, "IVirtualBox::Host first", uElapsed, RTTESTUNIT_NS);
127
128 /* Subsequent calls. */
129 uint32_t const cCalls1 = 4096;
130 uint32_t cLeft = cCalls1;
131 uStartTS = RTTimeNanoTS();
132 while (cLeft-- > 0)
133 {
134 IHost *pHost2 = NULL;
135 hrc = pVBox->COMGETTER(Host)(&pHost2);
136 if (FAILED(hrc))
137 {
138 tstComExpr(hrc, "IVirtualBox::Host", __LINE__);
139 return;
140 }
141 pHost2->Release();
142 }
143 uElapsed = RTTimeNanoTS() - uStartTS;
144 RTTestValue(g_hTest, "IVirtualBox::Host average", uElapsed / cCalls1, RTTESTUNIT_NS_PER_CALL);
145
146 /* Keep a reference around and see how that changes things.
147 Note! VBoxSVC is not creating and destroying Host(). */
148 pHost = NULL;
149 hrc = pVBox->COMGETTER(Host)(&pHost);
150
151 uint32_t const cCalls2 = 16384;
152 cLeft = cCalls2;
153 uStartTS = RTTimeNanoTS();
154 while (cLeft-- > 0)
155 {
156 IHost *pHost2 = NULL;
157 hrc = pVBox->COMGETTER(Host)(&pHost2);
158 if (FAILED(hrc))
159 {
160 tstComExpr(hrc, "IVirtualBox::Host", __LINE__);
161 pHost->Release();
162 return;
163 }
164 pHost2->Release();
165 }
166 uElapsed = RTTimeNanoTS() - uStartTS;
167 RTTestValue(g_hTest, "IVirtualBox::Host 2nd ref", uElapsed / cCalls2, RTTESTUNIT_NS_PER_CALL);
168 pHost->Release();
169
170 RTTestSubDone(g_hTest);
171}
172
173
174static void tstApiPrf4(IVirtualBox *pVBox)
175{
176 RTTestSub(g_hTest, "IHost::GetProcessorFeature performance");
177
178 IHost *pHost = NULL;
179 HRESULT hrc = pVBox->COMGETTER(Host)(&pHost);
180 if (FAILED(hrc))
181 {
182 tstComExpr(hrc, "IVirtualBox::Host", __LINE__);
183 return;
184 }
185
186 uint32_t const cCalls = 65536;
187 uint32_t cLeft = cCalls;
188 uint64_t uStartTS = RTTimeNanoTS();
189 while (cLeft-- > 0)
190 {
191 BOOL fSupported;
192 hrc = pHost->GetProcessorFeature(ProcessorFeature_PAE, &fSupported);
193 if (FAILED(hrc))
194 {
195 tstComExpr(hrc, "IHost::GetProcessorFeature", __LINE__);
196 pHost->Release();
197 return;
198 }
199 }
200 uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
201 RTTestValue(g_hTest, "IHost::GetProcessorFeature average", uElapsed / cCalls, RTTESTUNIT_NS_PER_CALL);
202 pHost->Release();
203 RTTestSubDone(g_hTest);
204}
205
206
207
208int main()
209{
210 /*
211 * Initialization.
212 */
213 RTEXITCODE rcExit = RTTestInitAndCreate("tstVBoxAPIPerf", &g_hTest);
214 if (rcExit != RTEXITCODE_SUCCESS)
215 return rcExit;
216 SUPR3Init(NULL); /* Better time support. */
217 RTTestBanner(g_hTest);
218
219 RTTestSub(g_hTest, "Initializing COM and singletons");
220 HRESULT hrc = com::Initialize();
221 if (SUCCEEDED(hrc))
222 {
223 ComPtr<IVirtualBoxClient> ptrVBoxClient;
224 ComPtr<IVirtualBox> ptrVBox;
225 hrc = TST_COM_EXPR(ptrVBoxClient.createInprocObject(CLSID_VirtualBoxClient));
226 if (SUCCEEDED(hrc))
227 hrc = TST_COM_EXPR(ptrVBoxClient->COMGETTER(VirtualBox)(ptrVBox.asOutParam()));
228 if (SUCCEEDED(hrc))
229 {
230 ComPtr<ISession> ptrSession;
231 hrc = TST_COM_EXPR(ptrSession.createInprocObject(CLSID_Session));
232 if (SUCCEEDED(hrc))
233 {
234 RTTestSubDone(g_hTest);
235
236 /*
237 * Call test functions.
238 */
239 tstApiPrf1(ptrVBox);
240 tstApiPrf2(ptrVBox);
241 tstApiPrf3(ptrVBox);
242
243 /** @todo Find something that returns a 2nd instance of an interface and see
244 * how if wrapper stuff is reused in any way. */
245 tstApiPrf4(ptrVBox);
246 }
247 }
248
249 ptrVBox.setNull();
250 ptrVBoxClient.setNull();
251 com::Shutdown();
252 }
253 else
254 RTTestIFailed("com::Initialize failed with hrc=%Rhrc", hrc);
255 return RTTestSummaryAndDestroy(g_hTest);
256}
257
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette