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

source code of libcxx/test/benchmarks/format/std_format_spec_string_unicode_escape.bench.cpp