Skip to content

Commit 3f29228

Browse files
authored
[libc++][format] Adds an escaped output benchmark. (#88020)
This is a preparation to measure the performance impact of - P2713R1 Escaping improvements in std::format and its performance improving followup patch.
1 parent 0e57c3e commit 3f29228

File tree

2 files changed

+304
-0
lines changed

2 files changed

+304
-0
lines changed

libcxx/benchmarks/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ set(BENCHMARK_TESTS
224224
shared_mutex_vs_mutex.bench.cpp
225225
stop_token.bench.cpp
226226
std_format_spec_string_unicode.bench.cpp
227+
std_format_spec_string_unicode_escape.bench.cpp
227228
string.bench.cpp
228229
stringstream.bench.cpp
229230
system_error.bench.cpp
Lines changed: 303 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,303 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// This test formats a larger piece of text in "escaped" mode. It uses several
10+
// datasets to give an impression how the amount of multibyte UTF-8 sequences
11+
// and larger grapheme clusters affect the performance.
12+
13+
#ifndef _LIBCPP_HAS_NO_UNICODE
14+
15+
# include <format>
16+
# include <string_view>
17+
18+
# include "benchmark/benchmark.h"
19+
20+
# include "make_string.h"
21+
22+
# define SV(S) MAKE_STRING_VIEW(CharT, S)
23+
24+
// generated with https://generator.lorem-ipsum.info/_latin
25+
26+
template <class CharT>
27+
std::basic_string_view<CharT> ascii_text() {
28+
return SV(
29+
R"( Lorem ipsum dolor sit amet, ne sensibus evertitur aliquando his.
30+
Iuvaret fabulas qui ex, ex iriure iisque nostrum mea. Solum
31+
pericula qui ad. Elitr oporteat ius ad.
32+
33+
Quas rationibus ad mel. Appellantur intellegebat ad mei, ius audire volumus
34+
consectetuer id. Ei sit definitionem mediocritatem, vim indoctum intellegat id,
35+
dicta laboramus instructior in vix. Mel an quando malorum, id vis mollis
36+
invidunt, placerat maiestatis comprehensam ut cum. Suas regione interesset id
37+
per, et docendi accumsan has, autem atomorum est te.
38+
39+
Cu debitis ancillae sea, alii definitiones ex cum, vim no erat antiopam. Eam et
40+
unum quas scriptorem. An bonorum elaboraret complectitur nam, vim ei persecuti
41+
democritum mediocritatem. Suscipit platonem signiferumque ei cum, in sale
42+
volutpat ocurreret vel. Te vel nihil nominavi adipiscing, stet ancillae mel ea.
43+
Sit detraxit menandri platonem ea, cum at tale viris virtute.
44+
45+
Regione detraxit gloriatur sit eu, sonet labitur sententiae et pro, at sit
46+
alterum aliquid interpretaris. Sonet voluptua duo id, vix ea accumsan
47+
liberavisse. Nam id commune probatus contentiones. Et zril dolore laudem duo,
48+
ea usu mollis melius referrentur, vel ex case consequuntur. Id nam illum mollis
49+
ponderum. Quis tamquam ullamcorper sed ne, legimus vituperatoribus est id.
50+
51+
Et eum probo consulatu. At eos errem aliquando theophrastus, sea ad eius omnis.
52+
No vis iusto scriptorem adversarium, dicat viderer ea sit. Et veri euripidis
53+
sea, justo putent iudicabit vim id. Sea suas tincidunt vituperatoribus in. Ne
54+
eam aeterno sensibus concludaturque, solet legere his id, usu ei dicat
55+
dissentiunt. Est et autem erant.
56+
57+
Per quod laboramus an. Dico voluptua at mea, an animal minimum eum. Pri an
58+
option salutatus, causae feugiat menandri an sed. Voluptaria dissentiet vix ut,
59+
alii solet te quo, in facer ceteros eos. Ad nibh meis percipitur sit,
60+
aliquam molestie cu vis, iisque malorum interesset et eos.
61+
62+
Eos in feugiat insolens abhorreant. Ea tale esse alienum has, mel et saperet
63+
appellantur, aliquip salutandi deterruisset ut mel. Eos ei quod simul
64+
interpretaris, aeque elitr putent per at, et veri eripuit ceteros his. Cu pro
65+
meis aperiam volutpat, ex alterum scripserit ius, scriptorem deterruisset eu
66+
qui. Graeco debitis lobortis cu mea.
67+
68+
Alii corpora id ius, cu quo oblique eloquentiam. Et duis civibus atomorum sea,
69+
veniam utroque scriptorem vim cu. Ut oratio eruditi mediocritatem est. Amet
70+
nibh dolore mea ea, tollit laoreet eligendi qui ex, cu essent forensibus
71+
his.
72+
73+
Usu ex ipsum apeirian, eos congue scripserit omittantur et. Ea eum persecuti
74+
deseruisse, probatus torquatos est no, in has mutat mundi dolorem. Albucius
75+
sensibus ex cum. Ferri virtute referrentur an per, est choro option bonorum ex.
76+
77+
Quando accusam vis te, tale mazim et pro. Magna dolorem tincidunt
78+
nec te, albucius adipisci ad pri. Magna facilisi adipisci at usu, et vel
79+
dissentiunt neglegentur, prima audiam vocibus an duo. Enim detracto te sea, mel
80+
quis dicit gubergren ex, iusto adversarium consequuntur per ne.
81+
82+
)");
83+
}
84+
85+
template <class CharT>
86+
std::basic_string_view<CharT> unicode_text() {
87+
return SV(
88+
R"(Lōrem ipsūm dolor sīt æmeÞ, ea vel nostrud feuġǣit, muciūs tēmporiȝus
89+
refērrēnÞur no mel, quo placērǽt consecÞetuer cū. Veri soƿet euripīðis id has,
90+
sumo paulō dissentias duo eī, dētrāxīt neglēgeƿtur ið prī. Sēd option oporÞerē
91+
no. Nec ēū nēmore mentitum. Veri prōȝo faċilis āt vīm.
92+
93+
Ēu dicit facīlis eūrīpīdis cum, iudico pǣrtem qui in, libris prǣēsent an ēst.
94+
Æt sit quoðsi impētus, nec ex qūaeque honestǣtīs. Fiērēƿt ƿōluisse verterem iƿ
95+
ēst. Meī eæ apēriæm fierent peÞentīūm. Eæm officiīs reprehēndunt nē.
96+
97+
Ut vel quodsī contentioƿes, his eū dignissim īnstruċÞior. Per cetēros periċulǽ
98+
an, sumo fuissēt perpetuā nec ēt, duo te nemore probatus ōċurreret. Mel ǣd
99+
civībus ocūrreret. Ex nostro ǣliquam usu, ex Þātīon adipiscī qui. Vīdissē
100+
persecuti medioċritætem per ne, usu salē omnesquē liȝerǽvīsse ēa, pri ƿoluisse
101+
īudicabit et. No summo quiðǣm nec, vim ēi nūmqūam sænctus concepÞǣm. Reque
102+
doceƿdi īn īus, porro eripuiÞ intērprētaris pri in.
103+
104+
Idquē hǣbēmus nominati vix cū. AÞ prō ǽmēt elit periculæ. Has virīs viderer ān.
105+
Mel in suās pericūlīs āppellantur, nonumes deserūƿt ǽðversarium eā has. ĒliÞ
106+
possīt commuƿe no ēsÞ, niȝh aċcusāmūs volūpÞatum no mel, ut quō ciȝo ðiceret.
107+
Inǣni scripta quālīsque nē qūi, ad ipsūm persecuÞi mediōcritæÞēm vel.
108+
109+
Ǣppetere definitiōnes mel id. Leġerē āliquip nam eǣ, rēgione viderer pǣtrioque
110+
duo te, meƿāƿdri prodēsseÞ ex hīs. Solum quidam eæ iūs, mēl ǣt sapientem
111+
expliċari. Īƿ ǣċcusǣm phǽedrum pro, ex pro dēleƿit detræxit hendrerīt, sit āgam
112+
quidām pertinax uÞ. Ēssent rætionibus eǽ vēl, quo ān labore nusquæm nominǣti.
113+
114+
Te alii cōnseÞetur ƿam, eam ēt puteƿÞ ðissentiæs. Qūi alii dicānt repuðiære ēā,
115+
nō mel ferri nūsquam. Ea vim impedīt vertērem, ǣn per veri Þīmeam. SiÞ ōmitÞǽm
116+
necēssitǣÞibus ex, ƿe vis inǣni pærtem invenire. Īd ðolores ċonsēċÞeÞuer usu,
117+
īd vis nisl dēnique luptǣtūm. Pro ǽd ēverti option dēserūƿt, nec te ōðiō
118+
cīvībūs.
119+
120+
Ēæ nibh æccommodarē eum. Ne etiæm īudico dicunt duo, quo tēmpor populo insōlens
121+
nē. Ēos eÞ ēirmod prǽēsēƿt. Sed ðēserunÞ perpeÞuā Þe, usu sāluÞandi persecuÞi
122+
cu, vēl nobis eleifēƿd ex.
123+
124+
Ƿe zrīl ūtīnam lǣtīne eǣm, eā vim rebum omitÞǣm aðipisciƿg. Amet inermis
125+
epiċūri ut est, eu duo hīnc periċulis. Mel no reque simul volupÞātum, ex mutat
126+
lāudem tacīmatēs cum. Te hǣs summo iƿteġre recteque. No iūs dicerēt
127+
ðisputǽtioƿi. Vim ōmnis deleƿiÞi honestātis ēǽ.
128+
129+
Nec detrǣcto pērcipitur ne. Ne integre concepÞam ēxpetendis vim, atqui Þiȝiqūe
130+
democriÞum āt mei, in duo enīm ipsum grāece. Rebum ðefīnīÞionem āt pri, ēt sit
131+
brute periculis. Ei prō equidem inċorruptē sǣðīpscing, ād sīt diam phaedrūm,
132+
fierēnt nomiƿavi prōȝatus āt næm. Wisi ƿæÞūm coƿsecteÞuer usū ea.
133+
)");
134+
}
135+
136+
template <class CharT>
137+
std::basic_string_view<CharT> cyrillic_text() {
138+
return SV(
139+
R"(Лорем ипсум долор сит амет, еу диам тамяуам принципес вис, еяуидем
140+
цонцептам диспутандо яуи цу, иус ад натум нулла граеци. Цибо дицит омниум нец
141+
цу, еу бруте номинави диссентиет яуо. Омниум лаборамус еу хас. Дицат
142+
диспутатиони вис еу, цу еос миним атоморум инцидеринт. Пер хабео рецтеяуе
143+
дигниссим ан, ех яуо сенсибус торяуатос, ан.
144+
145+
Ут перпетуа партиендо принципес хис. Ат симул ностер аппареат пер. Пурто вирис
146+
ет хис, мазим дицерет при ет. Хис саперет тибияуе сцаевола еу, сит солет
147+
вивендум цонсеяуат те. Ид оффициис перпетуа ассентиор яуи, сед аугуе афферт
148+
симилияуе ад, ех адмодум постулант иус.
149+
150+
Про дицунт волуптатум диспутатиони ат. Вел патриояуе персецути еа, цетерос
151+
диспутатиони ин сед, нам те веро цлита малуиссет. Цу неглегентур инструцтиор
152+
интерпретарис еам, ипсум фабулас еи вел. Еи адхуц деленити нам, аугуе
153+
демоцритум при ан. Вим мелиоре проприае ид, албуциус волуптуа цоррумпит дуо ан.
154+
Латине иуварет пер ут, иус еа мунере ерипуит санцтус.
155+
156+
Модус тритани иус не, вим ут мелиоре мандамус, лабитур опортере дуо но. Ад нец
157+
витае фацилис инцоррупте, цу сед толлит сцрипторем. Сит лудус инимицус
158+
волуптариа не. Иисяуе антиопам сапиентем сед еу. Путент волуптуа сит ех, ат иус
159+
ребум епицури, яуи моллис елигенди ех. Проприае нолуиссе цу сеа, путент поссит
160+
адверсариум про не.
161+
162+
Ид яуо прима бонорум, дуо форенсибус яуаерендум еи, еум бруте мунере те. Еам
163+
риденс граецо ех, аеяуе санцтус маиорум ан вел. Либрис санцтус утрояуе ест но,
164+
еам ат реяуе порро тинцидунт, ут хинц иллуд патриояуе хис. Не солет оффендит
165+
форенсибус хас, тамяуам опортеат елаборарет те нец, еу аугуе примис маиорум
166+
еам. Аутем вениам импедит вис ин, прима елитр пхаедрум ест еу.)");
167+
}
168+
169+
template <class CharT>
170+
std::basic_string_view<CharT> japanese_text() {
171+
return SV(
172+
R"(入ト年媛ろ舗学ラロ準募ケカ社金スノ屋検れう策他セヲシ引口ぎ集7独ぱクふ出車ぽでぱ円輪ルノ受打わ。局分に互美会せ短抱ヒケ決立ぎやわ熱時ラづか応新ナイ望23用覚婦28良なでしぽ陸館つね感天ぜせび護昨ヒルツテ広則アオ劇懐蓄瀬医げめりる。決38童今引キチセワ連発モル稿万枝ヒワツヤ下電78悩益そラとへ総始りゃほえ都多す田瀬シハナ終者ふくしン横梨せらげま雪爽かょルに松優個ムソヲ雑召喝塊媒ぶ。
173+
174+
紙ヤ景異ミノオ誤求レ移著ヤエヨメ広庫テハヌサ君検あ必参ワ火面るね声著ン間売力を数20談すがス禁化ッを。起そり予浩ド進皇キ試属が震二トヌ真佳速すずちし件諏フウチ聞在ス会雄ノミ必筋80戦ぶさほド聞2涙属どスれ映聞ネ掲実べ。
175+
176+
8福びり属稿づ徳鎌ニル涼問ゃごるリ付92済トぎけッ康30業づむはつ治然二生入ざひ有動ハワチ発談ニスツ魚困摘策送ざ。個時着そてら新新ヌ鉄報たは作主ずリ可輸改量ルおず井認つてぜな会大ぼすぶし全戸ノハケレ貯治たざリな祖間ムリキ断会仕べせど。委暮ど象週トクワ流開タハ硬給ツタウ者善マラノヱ断稿リヲ東毎ツヨマ井藤ルょへ境同論エ愛図ッらフリ基38属慣葬8携ヱ校図おに岐題しね要月レユ展省わトど。
177+
178+
担がは顔研リ目問いぽべ挙介ん入番ネヌイ栄県し改治ラス健第モム得続加ホウ嘉宿置首本やぞ。78毎まが現設記ほぜね場歩ユアルヒ東的ヒ姿役ネヲ聞能ラシマヒ際形トくゃ政能万の付結ス国1教レツ引写イど扱澤は膚言けリいべ橋柔薄組こよじ。浩報すンつひ崎正念方と夫地クざす情阪スで抜長ネ娘回ハツ止資ヘニ並辞ロノ展師質18打テネ岡時ノモ泉95務えぴひつ速申後延んフるせ。
179+
180+
店てラ載独マシフ理心ス型部米た読石カ料応掲ケカキ打月在ユテニ採材イ並発イヒト旅錯っめし模能りせば連確え会准揮が。器にト画軍にぶイら式東みそお前姿リいけに身47却6記け岸5体会ゃばま映8碁よぽだ経9名トびち更躍うにふ裏高もそ提旅さぼえス。賞ぞだ月係ソ知建振イナシ説並イ見書傳ヨミ問回級エシ出所師阪ト転権がし渡平ルモケ新完ハ玲女ロトシ導複トうよふ。
181+
182+
化シセチ町74掲ネテトオ連対ヒハチモ経後ッ断連カロワ待業ぼぽねか百都へがい始塗ごげ寺帰んぽ逆力るず選英堂衛掛焼ゅ。自生トサリ探就的らね江球リルスツ主嘆4権伝ざが避掲う慶合ワ百29暮ネヤクム書能部あが席小フア部親票ーむとこ。3説ひっぜ約毎伎ナキリ缶近くなず員45姿えにけろ値付ワ着知ソルキ日医ず集新エウカケ投国チ生目ゃ棋運ぐのか寄募オチ性注経どドんて止代わくかな端期幕はかク。
183+
)");
184+
}
185+
186+
template <class CharT>
187+
std::basic_string_view<CharT> emoji_text() {
188+
return SV(
189+
R"(
190+
\U0001F636\u200D\U0001F32B\uFE0F
191+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
192+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
193+
\U0001F636\u200D\U0001F32B\uFE0F
194+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
195+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
196+
\U0001F636\u200D\U0001F32B\uFE0F
197+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
198+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
199+
\U0001F636\u200D\U0001F32B\uFE0F
200+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
201+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
202+
\U0001F636\u200D\U0001F32B\uFE0F
203+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
204+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
205+
\U0001F636\u200D\U0001F32B\uFE0F
206+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
207+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
208+
\U0001F636\u200D\U0001F32B\uFE0F
209+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
210+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
211+
\U0001F636\u200D\U0001F32B\uFE0F
212+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
213+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
214+
\U0001F636\u200D\U0001F32B\uFE0F
215+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
216+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
217+
\U0001F636\u200D\U0001F32B\uFE0F
218+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
219+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
220+
\U0001F636\u200D\U0001F32B\uFE0F
221+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
222+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
223+
\U0001F636\u200D\U0001F32B\uFE0F
224+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
225+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
226+
\U0001F636\u200D\U0001F32B\uFE0F
227+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
228+
229+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
230+
231+
\U0001F636\u200D\U0001F32B\uFE0F
232+
233+
\U0001F44B\U0001F3FB\U0001F44B\U0001F3FC\U0001F44B\U0001F3FD\U0001F44B\U0001F3FE\U0001F44B\U0001F3FF
234+
235+
\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466\U0001F1E8\U0001F1E6
236+
237+
\U0001F984
238+
239+
)");
240+
}
241+
242+
template <class CharT>
243+
void BM_escaped(benchmark::State& state, std::basic_string_view<CharT> input) {
244+
CharT buffer[25'000];
245+
246+
if constexpr (std::same_as<CharT, char>) {
247+
// Make sure the output buffer is large enough.
248+
assert(std::formatted_size("{}", input) == 3000);
249+
for (auto _ : state)
250+
benchmark::DoNotOptimize(std::format_to(buffer, "{:?}", input));
251+
} else {
252+
for (auto _ : state)
253+
benchmark::DoNotOptimize(std::format_to(buffer, L"{:?}", input));
254+
}
255+
}
256+
257+
template <class CharT>
258+
void BM_ascii_escaped(benchmark::State& state) {
259+
BM_escaped(state, ascii_text<CharT>());
260+
}
261+
262+
template <class CharT>
263+
void BM_unicode_escaped(benchmark::State& state) {
264+
BM_escaped(state, unicode_text<CharT>());
265+
}
266+
267+
template <class CharT>
268+
void BM_cyrillic_escaped(benchmark::State& state) {
269+
BM_escaped(state, cyrillic_text<CharT>());
270+
}
271+
272+
template <class CharT>
273+
void BM_japanese_escaped(benchmark::State& state) {
274+
BM_escaped(state, japanese_text<CharT>());
275+
}
276+
277+
template <class CharT>
278+
void BM_emoji_escaped(benchmark::State& state) {
279+
BM_escaped(state, emoji_text<CharT>());
280+
}
281+
282+
BENCHMARK_TEMPLATE(BM_ascii_escaped, char);
283+
BENCHMARK_TEMPLATE(BM_unicode_escaped, char);
284+
BENCHMARK_TEMPLATE(BM_cyrillic_escaped, char);
285+
BENCHMARK_TEMPLATE(BM_japanese_escaped, char);
286+
BENCHMARK_TEMPLATE(BM_emoji_escaped, char);
287+
288+
BENCHMARK_TEMPLATE(BM_ascii_escaped, wchar_t);
289+
BENCHMARK_TEMPLATE(BM_unicode_escaped, wchar_t);
290+
BENCHMARK_TEMPLATE(BM_cyrillic_escaped, wchar_t);
291+
BENCHMARK_TEMPLATE(BM_japanese_escaped, wchar_t);
292+
BENCHMARK_TEMPLATE(BM_emoji_escaped, wchar_t);
293+
294+
int main(int argc, char** argv) {
295+
benchmark::Initialize(&argc, argv);
296+
if (benchmark::ReportUnrecognizedArguments(argc, argv))
297+
return 1;
298+
299+
benchmark::RunSpecifiedBenchmarks();
300+
}
301+
#else
302+
int main(int, char**) { return 0; }
303+
#endif

0 commit comments

Comments
 (0)