{"id":42134,"date":"2019-03-18T00:00:00","date_gmt":"2019-03-17T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/uskorenie-fajlovogo-vvoda-vyvoda-c-c-ne-osobo-napryagayas"},"modified":"2020-02-18T13:44:56","modified_gmt":"2020-02-18T10:44:56","slug":"uskorenie-fajlovogo-vvoda-vyvoda-c-c-ne-osobo-napryagayas","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/uskorenie-fajlovogo-vvoda-vyvoda-c-c-ne-osobo-napryagayas","title":{"rendered":"Acc\u00e9l\u00e9ration des entr\u00e9es\/sorties de fichiers C\/C++, sans trop de stress","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9ration des entr\u00e9es\/sorties de fichiers C\/C++, sans trop de stress\" src=\"\/wp-content\/uploads\/2019\/03\/ed7e4c2b671c87b382572f08a411e009.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Pr\u00e9face<\/h4>\n<p>\nIl existe un outil simple et tr\u00e8s utile dans le monde \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jjwhitney\/BDelta\">BDelta<\/a><\/noindex>, et il se trouve qu'il fait partie de notre processus de production depuis tr\u00e8s longtemps (bien que je n'ai pas r\u00e9ussi \u00e0 installer sa version, il est clair qu'elle n'\u00e9tait pas la derni\u00e8re disponible). Nous l'utilisons pour sa fonction principale \u2014 la cr\u00e9ation de patchs binaires. En regardant ce qu'il y a dans le d\u00e9p\u00f4t, on devient un peu triste : en gros, il est depuis longtemps \u00e0 l'abandon et beaucoup de choses y sont tr\u00e8s obsol\u00e8tes (mon ancien coll\u00e8gue a apport\u00e9 quelques modifications l\u00e0-bas, mais cela fait longtemps). En gros, j'ai d\u00e9cid\u00e9 de le ressusciter : j'ai fait un fork, supprim\u00e9 ce que je ne compte pas utiliser, et j'ai migr\u00e9 le projet sur <noindex><a rel=\"nofollow\" href=\"https:\/\/cmake.org\/\">cmake<\/a><\/noindex>, j'ai int\u00e9gr\u00e9 en ligne de petites micro-fonctions, retir\u00e9 de la pile de grands tableaux (et des tableaux de longueur variable, qui me font clairement 'exploser'), j'ai encore une fois pass\u00e9 le profileur \u2014 et j'ai appris que pr\u00e8s de 40 % du temps est consacr\u00e9 \u00e0 <noindex><a rel=\"nofollow\" href=\"http:\/\/www.cplusplus.com\/reference\/cstdio\/fwrite\/\">fwrite<\/a><\/noindex>\u2026<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>Alors, qu'en est-il de fwrite ?<\/h4>\n<p>\nDans ce code, fwrite (dans mon cas de test sp\u00e9cifique : cr\u00e9ation d'un patch entre des fichiers proches de 300 Mo, les donn\u00e9es d'entr\u00e9e \u00e9tant enti\u00e8rement en m\u00e9moire) est appel\u00e9 des millions de fois avec un petit tampon. Il est \u00e9vident que cela va ralentir les performances, et donc j'aimerais influencer cela d'une mani\u00e8re ou d'une autre sans vouloir introduire des sources de donn\u00e9es diff\u00e9rentes ou une entr\u00e9e\/sortie asynchrone, je cherchais une solution plus simple. La premi\u00e8re chose qui m'est venue \u00e0 l'esprit \u2014 augmenter la taille du tampon<\/p>\n<pre><code class=\"cpp\">setvbuf(file, nullptr, _IOFBF, 64* 1024)<\/code><\/pre>\n<p>\nmais je n'ai pas obtenu d'am\u00e9lioration significative (maintenant fwrite prenait environ 37 % du temps) \u2014 donc le probl\u00e8me n'est pas r\u00e9ellement d\u00fb \u00e0 l'\u00e9criture fr\u00e9quente de donn\u00e9es sur le disque. En regardant 'sous le capot' de fwrite, on peut voir qu'il y a un lock\/unlock de la structure FILE qui se passe \u00e0 peu pr\u00e8s comme \u00e7a (pseudocode, toute l'analyse a \u00e9t\u00e9 faite sous Visual Studio 2017) :<\/p>\n<pre><code class=\"cpp\">\nsize_t fwrite (const void *buffer, size_t size, size_t count, FILE *stream)\n{\n   size_t retval = 0;\n   _lock_str(stream);   \/* lock stream *\/\n   __try\n   {\n      retval = _fwrite_nolock(buffer, size, count, stream);\n   }\n   __finally \n   {\n       _unlock_str(stream);   \/* unlock stream *\/\n   }\n   return retval;\n}\n<\/code><\/pre>\n<p>\nSi l'on en croit le profileur, seulement 6 % du temps est consacr\u00e9 \u00e0 _fwrite_nolock, le reste \u00e9tant des overheads. Dans mon cas sp\u00e9cifique, la s\u00e9curit\u00e9 des flux est un exc\u00e8s \u00e9vident, et je vais faire des sacrifices en rempla\u00e7ant l'appel \u00e0 fwrite par <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/fwrite-nolock?view=vs-2017\">_fwrite_nolock<\/a><\/noindex> \u2014 m\u00eame avec des arguments, il n'est pas n\u00e9cessaire de compliquer les choses. En r\u00e9sum\u00e9 : cette astuce simple a consid\u00e9rablement r\u00e9duit les co\u00fbts d'\u00e9criture des r\u00e9sultats, qui, dans la version initiale, repr\u00e9sentaient presque la moiti\u00e9 du temps total. D'ailleurs, dans le monde de POSIX, il existe une fonction similaire \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/3\/fwrite_unlocked\">fwrite_unlocked<\/a><\/noindex>. En g\u00e9n\u00e9ral, cela s'applique \u00e9galement \u00e0 fread. Ainsi, avec quelques #define, on peut obtenir une solution enti\u00e8rement multiplateforme sans verrouillages inutiles, lorsque cela n'est pas n\u00e9cessaire (ce qui est souvent le cas).<\/p>\n<h4>fwrite, _fwrite_nolock, setvbuf<\/h4>\n<p>\nAbstrayons-nous du projet original et concentrons-nous sur le test d'un cas sp\u00e9cifique : l'\u00e9criture d'un gros fichier (512 Mo) en tr\u00e8s petites portions \u2014 1 octet. Syst\u00e8me de test : AMD Ryzen 7 1700, 16 Go de RAM, HDD 7200 rpm, 64 Mo de cache, Windows 10 1809, binaire construit en 32 bits, optimisations activ\u00e9es, biblioth\u00e8que statiquement li\u00e9e.<\/p>\n<p>\u00c9chantillon pour r\u00e9aliser l'exp\u00e9rience :<\/p>\n<pre><code class=\"cpp\">\n#include &lt;chrono&gt;\n#include &lt;cstdio&gt;\n#include &lt;inttypes.h&gt;\n#include &lt;memory&gt;\n\n#ifdef _MSC_VER\n#define fwrite_unlocked _fwrite_nolock\n#endif\n\nusing namespace std::chrono;\n\nint main()\n{\n    std::unique_ptr&lt;FILE, int(*)(FILE*)&gt; file(fopen(\"test.bin\", \"wb\"), fclose);\n    if (!file)\n        return 1;\n\n    constexpr size_t TEST_BUFFER_SIZE = 256 * 1024;\n    if (setvbuf(file.get(), nullptr, _IOFBF, TEST_BUFFER_SIZE) != 0)\n        return 2;\n\n    auto start = steady_clock::now();\n    const uint8_t b = 77;\n    constexpr size_t TEST_FILE_SIZE = 512 * 1024 * 1024;\n    for (size_t i = 0; i &lt; TEST_FILE_SIZE; ++i)\n        fwrite_unlocked(&amp;b, 1, sizeof(b), file.get());\n\n    auto end = steady_clock::now();\n    auto interval = duration_cast&lt;microseconds&gt;(end - start);\n    printf(\"Time: %lldn\", interval.count());\n\n    return 0;\n}\n<\/code><\/pre>\n<p>\nLes variables seront TEST_BUFFER_SIZE, et dans quelques cas, nous remplacerons fwrite_unlocked par fwrite. Commen\u00e7ons par le cas de fwrite sans sp\u00e9cification explicite de la taille du tampon (nous commenterons setvbuf et le code associ\u00e9) : temps 27048906 \u00b5s, vitesse d'\u00e9criture \u2014 18,93 Mo\/s. Maintenant, \u00e9tablissons la taille du tampon \u00e0 64 Ko : temps \u2014 25037111 \u00b5s, vitesse \u2014 20,44 Mo\/s. Testons maintenant le fonctionnement de _fwrite_nolock sans appel \u00e0 setvbuf : 7262221 \u00b5s, vitesse \u2014 70,5 Mo\/s ! <\/p>\n<p>Continuons \u00e0 exp\u00e9rimenter avec la taille du tampon (setvbuf) :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9ration des entr\u00e9es\/sorties de fichiers C\/C++, sans trop de stress\" src=\"\/wp-content\/uploads\/2019\/03\/6d7998d805ec2e3f0a7905251c664e5c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLes donn\u00e9es sont obtenues par la moyenne de 5 exp\u00e9riences, je n'ai pas pris la peine de calculer les erreurs. Pour moi, 93 Mo\/s lors de l'\u00e9criture de 1 octet sur un HDD standard est un tr\u00e8s bon r\u00e9sultat, il suffit de choisir la taille de tampon optimale (dans mon cas, 256 Ko \u2014 c'est parfait) et de remplacer fwrite par _fwrite_nolock\/fwrite_unlocked (si la s\u00e9curit\u00e9 des threads n'est pas n\u00e9cessaire, bien s\u00fbr). <br \/>\nDe m\u00eame avec fread dans de telles conditions. \u00c9tant donn\u00e9 que je n'ai pas de machine 'physique' avec linux sous la main (les cartes simples ne comptent pas), j'ai d\u00e9cid\u00e9 de r\u00e9aliser une exp\u00e9rience limit\u00e9e sur une machine virtuelle (Hyper-V, OpenSUSE 15, GCC 8.3.1) \u2014 la tendance est essentiellement la m\u00eame : fwrite pur 20 Mo\/s, fwrite + tampon de 256 Ko a donn\u00e9 23 Mo\/s, fwrite_unlocked avec le m\u00eame tampon \u2014 35 Mo\/s (binaire 64 bits, compil\u00e9 avec g++ -o2 -s -static-libgcc -static-libstdc++ fwrite_test.cpp -o fwrite_test).<\/p>\n<h4>Postface<\/h4>\n<p>\nL'objectif de cet article \u00e9tait de d\u00e9crire une m\u00e9thode simple et efficace dans de nombreux cas (je n'avais jamais rencontr\u00e9 les fonctions _fwrite_nolock\/fwrite_unlocked auparavant, elles ne sont pas tr\u00e8s populaires - et c'est dommage). Je ne pr\u00e9tends pas \u00e0 la nouveaut\u00e9 du contenu, mais j'esp\u00e8re que cet article sera utile \u00e0 la communaut\u00e9.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444036\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0415\u0441\u0442\u044c \u043d\u0430 \u0441\u0432\u0435\u0442\u0435 \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u2014 BDelta, \u0438 \u0442\u0430\u043a \u0432\u044b\u0448\u043b\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0432\u043d\u043e \u0443\u043a\u043e\u0440\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 (\u043f\u0440\u0430\u0432\u0434\u0430 \u0435\u0451 \u0432\u0435\u0440\u0441\u0438\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043d\u043e \u043e\u043d\u0430 \u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u0430 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0451 \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u043c\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u2014 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u043f\u0430\u0442\u0447\u0435\u0439. \u0415\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u2014 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0433\u043a\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-42134","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0415\u0441\u0442\u044c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/uskorenie-fajlovogo-vvoda-vyvoda-c-c-ne-osobo-napryagayas\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 C\/C++, \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u044f\u0441\u044c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0415\u0441\u0442\u044c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/uskorenie-fajlovogo-vvoda-vyvoda-c-c-ne-osobo-napryagayas\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-03-17T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:44:56+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Acc\u00e9l\u00e9ration des entr\u00e9es\/sorties de fichiers C\/C++, sans trop d'effort | ProHoster","description":"Pr\u00e9face","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/uskorenie-fajlovogo-vvoda-vyvoda-c-c-ne-osobo-napryagayas","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 C\/C++, \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u044f\u0441\u044c | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0415\u0441\u0442\u044c.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/uskorenie-fajlovogo-vvoda-vyvoda-c-c-ne-osobo-napryagayas","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-03-17T21:00:00+00:00","article:modified_time":"2020-02-18T10:44:56+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"42134","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 07:22:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:05:22","updated":"2026-01-22 07:22:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/42134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=42134"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/42134\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=42134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=42134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=42134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}