{"id":452803,"date":"2025-03-23T15:01:12","date_gmt":"2025-03-23T15:01:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=452803"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=452803","title":{"rendered":"<span>\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 2000 \u0440\u0430\u0437 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Rust<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u0441 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/a>\u00a0\u0441\u0435\u0442\u0438 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u041f\u0430\u0440\u0438\u0436\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e <a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\/catalogue-data?type=api\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 API<\/a>\u00a0\u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 <a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\/apis\/idfm-ivtr-requete_globale\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430<\/a>,\u00a0<a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\/apis\/idfm-disruptions_bulk\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f<\/a> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041c\u043e\u0451 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u043b\u0451\u043a <a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\/reutilisations\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u0434\u0435\u043b \u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/ratpstatus.fr\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0431-\u0441\u0430\u0439\u0442 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u0435\u0442\u0438 RATP <\/a>\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f\u0445 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0440\u043e, \u0441\u0435\u0442\u0438 \u044d\u043a\u0441\u043f\u0440\u0435\u0441\u0441\u043e\u0432\/\u043f\u043e\u0435\u0437\u0434\u043e\u0432 \u0438 \u0442\u0440\u0430\u043c\u0432\u0430\u0435\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c3d\/431\/207\/c3d431207ca810ec935f6fa23b26bf0c.webp\" alt=\"Screenshot of the RATP status website\" title=\"\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0434\u0435\u043d\u044c \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 ratpstatus.fr.\" width=\"2559\" height=\"1251\"\/><\/p>\n<div><figcaption>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0434\u0435\u043d\u044c \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 <a href=\"http:\/\/ratpstatus.fr\" rel=\"noopener noreferrer nofollow\">ratpstatus.fr<\/a>.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412<a href=\"https:\/\/github.com\/wincelau\/ratpstatus\" rel=\"noopener noreferrer nofollow\"> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub <\/a>\u0441\u0430\u0439\u0442\u0430 <a href=\"http:\/\/ratpstatus.fr\" rel=\"noopener noreferrer nofollow\">ratpstatus.fr<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f <a href=\"https:\/\/github.com\/wincelau\/ratpstatus\/tree\/main\/datas\" rel=\"noopener noreferrer nofollow\">\u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b JSON<\/a>, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 open-data API \u043a\u0430\u0436\u0434\u044b\u0435 \u0434\u0432\u0435 \u043c\u0438\u043d\u0443\u0442\u044b. \u0414\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043c \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 188 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 10 \u0413\u0411 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 (\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 git clone &#8212;depth=1) \u2014 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445! \u0423\u0442\u043e\u0447\u043d\u044e, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043a\u0440\u0438\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0412\u0435\u0431-\u0441\u0430\u0439\u0442 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u0435\u0442\u0438 RATP \u2014 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442, \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043e\u0432. [\u0418 \u043d\u0435\u0442, \u0441\u0430\u0439\u0442 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Rust. \u0412\u0435\u0431-\u0441\u0430\u0439\u0442 \u043d\u0430 PHP \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c!]<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (10 \u0413\u0411) \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f: \u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0436\u0430\u0442\u044c \u0435\u0451 \u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0430 \u044d\u0442\u043e \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0441\u043a\u0430\u0436\u0435\u043c \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435)? \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"https:\/\/en.wikipedia.org\/wiki\/Interning_(computer_science)\" rel=\"noopener noreferrer nofollow\">\u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f interning<\/a>\u00a0\u0432 Rust, \u0447\u0442\u043e\u0431\u044b \u0441\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0432 \u0434\u0432\u0435 \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437! \u041c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c \u0438 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 interning \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 JSON, \u0442\u043e \u0432\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e!<\/p>\n<h3>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 (135%)<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0430\u043b\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u0430 JSON \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"json\">{   \"disruptions\": [     {       \"id\": \"445a6032-d1ca-11ef-b3f5-0a58a9feac02\",       \"applicationPeriods\": [         {           \"begin\": \"20250113T180000\",           \"end\": \"20250228T230000\"         }       ],       \"lastUpdate\": \"20250113T172013\",       \"cause\": \"PERTURBATION\",       \"severity\": \"BLOQUANTE\",       \"title\": \"Activities in Aincourt\",       \"message\": \"&lt;p&gt;Due to work in Aincourt, the Centre and Eglise stops will not be served in both directions of traffic on line 95 15 and in the direction of Magny en Vexin Gare Routi\u00e8re only on line 95 44. &lt;br&gt;From 13\/01 until further notice. &lt;\/p&gt;&lt;br&gt;Please refer to Les Cadenas stops\"     },   ... } <\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443! \u042f\u0437\u044b\u043a <a href=\"https:\/\/www.rust-lang.org\/\" rel=\"noopener noreferrer nofollow\">Rust<\/a> \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/docs.rs\/serde\/\" rel=\"noopener noreferrer nofollow\">serde<\/a>\u00a0\u0438 <a href=\"https:\/\/docs.rs\/serde_json\/\" rel=\"noopener noreferrer nofollow\">serde_json<\/a>. \u0412 \u0441\u0432\u043e\u0451\u043c <a href=\"https:\/\/doc.rust-lang.org\/cargo\/reference\/manifest.html\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 Cargo.toml<\/a> \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439:<\/p>\n<pre><code class=\"json\">[dependencies] serde = { version = \"1.0.217\", features = [\"derive\"] } serde_json = \"1.0.137\"<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 struct\/enum \u044f\u0437\u044b\u043a\u0430 Rust \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/serde\/1.0.217\/serde\/derive.Deserialize.html\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441\u0430 derive Deserialize<\/a>\u00a0serde, \u0447\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0451 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/serde.rs\/container-attrs.html#deny_unknown_fields\" rel=\"noopener noreferrer nofollow\">\u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>deny_unknown_fields<\/code><\/a>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f JSON \u043d\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u043e\u043b\u0447\u0430. \u042d\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 <a href=\"http:\/\/serde.rs\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0435 serde.rs<\/a><a href=\"https:\/\/serde.rs\/attributes.html\" rel=\"noopener noreferrer nofollow\"> <\/a>(\u043d\u0435 \u0432 <a href=\"http:\/\/docs.rs\" rel=\"noopener noreferrer nofollow\">docs.rs<\/a>).<\/p>\n<pre><code class=\"rust\">use serde::Deserialize;  #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct Data {     #[serde(rename = \"statusCode\")]     status_code: Option&lt;i32&gt;,     error: Option&lt;String&gt;,     message: Option&lt;String&gt;,     disruptions: Option&lt;Vec&lt;Disruption&gt;&gt;,     lines: Option&lt;Vec&lt;Line&gt;&gt;,     #[serde(rename = \"lastUpdatedDate\")]     last_updated_date: Option&lt;String&gt;, }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b JSON \u0432 struct <code>Data<\/code>\u00a0\u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/docs.rs\/serde_json\/1.0.137\/serde_json\/fn.from_reader.html\" rel=\"noopener noreferrer nofollow\"><code>serde_json::from_reader()<\/code><\/a>.<\/p>\n<pre><code class=\"rust\">\/\/ \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f. let file = File::open(path)?; \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u043e\u0439 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 let reader = BufReader::new(file); \/\/ \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 JSON \u0432 Data. let data: Data = serde_json::from_reader(reader)?;<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 <code>Disruption<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0435\u0447\u0435\u0440 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0441\u044f\u0446\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0432\u0435\u0447\u0435\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c <code>ApplicationPeriod<\/code>.<\/p>\n<pre><code class=\"rust\">#[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct Disruption {     id: String,     #[serde(rename = \"applicationPeriods\")]     application_periods: Vec&lt;ApplicationPeriod&gt;,     #[serde(rename = \"lastUpdate\")]     last_update: String,     cause: String,     severity: String,     tags: Option&lt;Vec&lt;String&gt;&gt;,     title: String,     message: String,     disruption_id: Option&lt;String&gt;, }  #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct ApplicationPeriod {     begin: String,     end: String, }<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e <code>Line<\/code>, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0430\u043d\u0446\u0438\u0438), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043c\u0435\u0442\u0440\u043e.<\/p>\n<pre><code class=\"rust\">#[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct Line {     id: String,     name: String,     #[serde(rename = \"shortName\")]     short_name: String,     mode: String,     #[serde(rename = \"networkId\")]     network_id: String,     #[serde(rename = \"impactedObjects\")]     impacted_objects: Vec&lt;ImpactedObject&gt;, }  #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct ImpactedObject {     #[serde(rename = \"type\")]     typ: String,     id: String,     name: String,     #[serde(rename = \"disruptionIds\")]     disruption_ids: Vec&lt;String&gt;, }<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u0445\u043e\u0442\u0435\u043b \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439, \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0430\u043c\u0438 interning. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/doc.rust-lang.org\/std\/mem\/fn.size_of.html\" rel=\"noopener noreferrer nofollow\"><code>std::mem::size_of()<\/code>\u00a0<\/a>Rust \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u00ab\u0441\u0442\u0435\u043a\u0435\u00bb, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0432 \u043a\u0443\u0447\u0435 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e <a href=\"https:\/\/doc.rust-lang.org\/std\/vec\/struct.Vec.html\" rel=\"noopener noreferrer nofollow\"><code>Vec<\/code><\/a>). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u043d\u043e\u0432\u044b\u0439 \u0442\u0440\u0435\u0439\u0442 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u0434\u043b\u044f \u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u043d\u0435 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<pre><code class=\"rust\">trait EstimateSize: Sized {     \/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0432 \u043a\u0443\u0447\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.     fn allocated_bytes(&amp;self) -&gt; usize;      \/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u044d\u0442\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c.     fn estimated_bytes(&amp;self) -&gt; usize {         std::mem::size_of::&lt;Self&gt;() + self.allocated_bytes()     } }  impl EstimateSize for i32 {     fn allocated_bytes(&amp;self) -&gt; usize {         0  \/\/ \u0412 \u043a\u0443\u0447\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e.     } }  impl EstimateSize for String {     fn allocated_bytes(&amp;self) -&gt; usize {         self.len()  \/\/ \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442. \u0401\u043c\u043a\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f.     } }  impl&lt;T: EstimateSize&gt; EstimateSize for Vec&lt;T&gt; {     fn allocated_bytes(&amp;self) -&gt; usize {         \/\/ \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.         self.iter().map(|x| x.estimated_bytes()).sum()     } }<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (struct) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/doc.rust-lang.org\/reference\/procedural-macros.html#derive-macros\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441\u0430 derive <\/a>(\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e <code>Deserialize<\/code> serde), \u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043c\u043e\u0435\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043c\u043d\u0435 \u0438\u0437\u043b\u0438\u0448\u043d\u0435\u0439 \u0442\u0440\u0430\u0442\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<pre><code class=\"rust\">impl EstimateSize for Data {     fn allocated_bytes(&amp;self) -&gt; usize {         self.status_code.allocated_bytes()             + self.error.allocated_bytes()             + self.message.allocated_bytes()             + self.disruptions.allocated_bytes()             + self.lines.allocated_bytes()             + self.last_updated_date.allocated_bytes()     } }<\/code><\/pre>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0437\u0430 \u043c\u0430\u0439 2024 \u0433\u043e\u0434\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u0430\u043b\u043e \u043c\u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b: \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 1,1 \u0413\u0411 \u0444\u0430\u0439\u043b\u043e\u0432 JSON \u0432 struct \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 35% (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/d961e6e5f0cce53c2b328a7fd70482811e80f26e\" rel=\"noopener noreferrer nofollow\">d961e6e<\/a>). \u0414\u0432\u0438\u0436\u0435\u043c\u0441\u044f \u043d\u0435 \u0432 \u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438\u2026 \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439!<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%)<\/code><\/pre>\n<h3>Interning<\/h3>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u043e\u0441\u043d\u043e\u0432\u0430\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 interning \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0442\u0438\u043f\u0430\u043c.<\/p>\n<h4>\u0421\u0442\u0440\u043e\u043a\u0438 (47%)<\/h4>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f interning, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438; \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e\u043c \u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u043b\u0438 <a href=\"https:\/\/lib.rs\/keywords\/interning\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Rust \u0434\u043b\u044f interning<\/a>. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0435\u0431\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 interning.<\/p>\n<p>\u042f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u0442 matklad\u00a0\u0437\u0430 2020 \u0433\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/matklad.github.io\/2020\/03\/22\/fast-simple-rust-interner.html\" rel=\"noopener noreferrer nofollow\">Fast and Simple Rust Interner<\/a>, \u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043b \u0435\u0433\u043e \u0434\u0438\u0437\u0430\u0439\u043d. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c. \u0447\u0442\u043e \u044f \u043e\u0431\u0435\u0440\u043d\u0443\u043b \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/rc\/struct.Rc.html\" rel=\"noopener noreferrer nofollow\">Rc<\/a>\u00a0(\u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u0441 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a), \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0445 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u0431\u044b \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0442\u043e \u044f \u0431\u044b \u0432\u044b\u0431\u0440\u0430\u043b <a href=\"https:\/\/doc.rust-lang.org\/std\/sync\/struct.Arc.html\" rel=\"noopener noreferrer nofollow\">Arc<\/a>, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440? \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0442\u0440\u043e\u043a, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u043e\u043a, \u0441\u043e\u043f\u0440\u044f\u0436\u0451\u043d\u043d\u043e\u0433\u043e \u0441 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0443\u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0435.<\/p>\n<pre><code class=\"rust\">use std::collections::HashMap; use std::rc::Rc;  #[derive(Default)] struct StringInternerImpl {     vec: Vec&lt;Rc&lt;String&gt;&gt;,     map: HashMap&lt;Rc&lt;String&gt;, usize&gt;, }  impl StringInternerImpl {     fn intern(&amp;mut self, value: String) -&gt; usize {         if let Some(&amp;id) = self.map.get(&amp;value) {             return id;         }          let id = self.vec.len();         let rc: Rc&lt;String&gt; = Rc::new(value);         self.vec.push(Rc::clone(&amp;rc));         self.map.insert(rc, id);         id     }      fn lookup(&amp;self, id: usize) -&gt; Rc&lt;String&gt; {         Rc::clone(&amp;self.vec[id])     } }<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u0440\u043e\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ffd\/ff4\/c7c\/ffdff4c7cf9671518526ab73ac8c8a3e.png\" alt=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0437 interning \u0438 \u0441 \u043d\u0438\u043c\" title=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0437 interning \u0438 \u0441 \u043d\u0438\u043c\" width=\"744\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ffd\/ff4\/c7c\/ffdff4c7cf9671518526ab73ac8c8a3e.png\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0437 interning \u0438 \u0441 \u043d\u0438\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432: \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0438\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440.<\/p>\n<pre><code class=\"rust\">struct IString&lt;'a&gt; {     interner: &amp;'a StringInterner,     id: usize, }  impl&lt;'a&gt; IString&lt;'a&gt; {     fn from(interner: &amp;'a StringInterner, value: String) -&gt; Self {         let id = interner.intern(value);         Self { interner, id }     }      fn lookup(&amp;self) -&gt; Rc&lt;String&gt; {         self.interner.lookup(self.id)     } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u044f \u043e\u0431\u044a\u044f\u0432\u0438\u043b \u0442\u0438\u043f\u044b <code>StringInterner<\/code>\u00a0\u0438 <code>StringInternerImpl<\/code>. \u0412 \u0447\u0451\u043c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0430?<\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e <code>IString<\/code>\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440\u0430 <code>&amp;StringInterner<\/code>, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043d\u0438\u043c <code>StringInterner<\/code>\u00a0\u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>intern()<\/code>, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>&amp;mut self<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u0440\u0443\u0448\u0438\u0442 <a href=\"https:\/\/doc.rust-lang.org\/rust-by-example\/scope\/borrow\/alias.html\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0430\u043b\u0438\u0430\u0441\u0438\u043d\u0433\u0430 Rust<\/a>: \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c <code>&amp;StringInterner<\/code>\u00a0\u0438 <code>&amp;mut StringInterner<\/code>, \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435. \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438!<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/doc.rust-lang.org\/reference\/interior-mutability.html\" rel=\"noopener noreferrer nofollow\">\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c\u044e<\/a>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/cell\/struct.RefCell.html\" rel=\"noopener noreferrer nofollow\">\u0442\u0438\u043f\u0430 RefCell<\/a>. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 <code>StringInterner<\/code>\u00a0\u043a\u0430\u043a <code>RefCell&lt;StringInternerImpl&gt;<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 <code>&amp;mut self<\/code>\u00a0\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440.<\/p>\n<pre><code class=\"rust\">#[derive(Default)] struct StringInterner {     inner: RefCell&lt;StringInternerImpl&gt;, }  impl StringInterner {     \/\/ \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443!     fn intern(&amp;self, value: String) -&gt; usize {         \/\/ \u041c\u0435\u0442\u043e\u0434 borrow_mut() \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u0441\u0440\u0435\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442         \/\/ \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e (\u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0430\u043d\u0438\u043a\u0443).         self.inner.borrow_mut().intern(value)     }      fn lookup(&amp;self, id: usize) -&gt; Rc&lt;String&gt; {         self.inner.borrow().lookup(id)     } }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043a\u043e\u0434\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f <code>==<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438.<\/p>\n<pre><code class=\"rust\">impl PartialEq&lt;String&gt; for IString&lt;'_&gt; {     fn eq(&amp;self, other: &amp;String) -&gt; bool {         self.lookup().deref() == other     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u043d\u043e\u0432\u044b\u0435 struct \u0434\u043b\u044f \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0437\u0434\u0435 \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438 <code>'a<\/code>, \u0447\u0442\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u044d\u0440\u0433\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u043e, \u043d\u043e \u043c\u044b \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<pre><code class=\"rust\">struct Disruption&lt;'a&gt; {     id: IString&lt;'a&gt;,     application_periods: Vec&lt;ApplicationPeriod&lt;'a&gt;&gt;,     last_update: IString&lt;'a&gt;,     cause: IString&lt;'a&gt;,     severity: IString&lt;'a&gt;,     tags: Option&lt;Vec&lt;IString&lt;'a&gt;&gt;&gt;,     title: IString&lt;'a&gt;,     message: IString&lt;'a&gt;,     disruption_id: Option&lt;IString&lt;'a&gt;&gt;, }  struct ApplicationPeriod&lt;'a&gt; {     begin: IString&lt;'a&gt;,     end: IString&lt;'a&gt;, }<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 struct \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c (\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043e\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043d\u0435 \u043e\u0448\u0438\u0431\u0430\u044e\u0442\u0441\u044f).<\/p>\n<pre><code class=\"rust\">impl&lt;'a&gt; ApplicationPeriod&lt;'a&gt; {     fn from(interner: &amp;'a StringInterner, source: source::ApplicationPeriod) -&gt; Self {         Self {             begin: IString::from(interner, source.begin),             end: IString::from(interner, source.end),         }     } }  impl PartialEq&lt;source::ApplicationPeriod&gt; for ApplicationPeriod&lt;'_&gt; {     fn eq(&amp;self, other: &amp;source::ApplicationPeriod) -&gt; bool {         self.begin == other.begin &amp;&amp; self.end == other.end     } }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c interning: \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c 425 \u0440\u0430\u0437, \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0432 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u0446\u0435, \u0438 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 JSON (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/5297faabef807c535bba8c29ca665c72957f3ca0\" rel=\"noopener noreferrer nofollow\">5297faa<\/a>). \u041d\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0434\u0430\u043b\u0435\u043a\u043e \u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043f\u043e\u0441\u0442\u0430!<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%) Optimized to 529308335 bytes (relative size = 46.55%) - [0.84%] String interner: 56374 objects | 4433343 bytes (78.64 bytes\/object) | 23964083 references (425.09 refs\/object)<\/code><\/pre>\n<h4>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (7,6%)<\/h4>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f <code>Disruption<\/code>\u00a0\u043c\u043e\u0436\u0435\u0442 \u0434\u043b\u0438\u0442\u044c\u0441\u044f \u0447\u0430\u0441, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435, \u0438\u043b\u0438 \u043e\u043a\u043e\u043b\u043e \u043c\u0435\u0441\u044f\u0446\u0430, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0435\u043c\u043e\u043d\u0442. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u0430\u0436\u0434\u044b\u0435 2 \u043c\u0438\u043d\u0443\u0442\u044b, \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0445 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e.<\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0443 interning \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a: \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442 \u043b\u044e\u0431\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/doc.rust-lang.org\/rust-by-example\/generics.html\" rel=\"noopener noreferrer nofollow\">\u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438<\/a>, \u0447\u0442\u043e\u0431\u044b interning \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.Eq.html\" rel=\"noopener noreferrer nofollow\">Eq<\/a>\u00a0\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/hash\/trait.Hash.html\" rel=\"noopener noreferrer nofollow\">Hash<\/a>\u00a0(\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439).<\/p>\n<pre><code class=\"rust\">\/\/ \u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0442\u0438\u043f\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430. type IString&lt;'a&gt; = Interned&lt;'a, String&gt;;  struct Interned&lt;'a, T&gt; {     interner: &amp;'a Interner&lt;T&gt;,     id: usize, }  impl&lt;'a, T: Eq + Hash&gt; Interned&lt;'a, T&gt; {     fn from(interner: &amp;'a Interner&lt;T&gt;, value: T) -&gt; Self {         let id = interner.intern(value);         Self { interner, id }     }      fn lookup(&amp;self) -&gt; Rc&lt;T&gt; {         self.interner.lookup(self.id)     } }<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0439\u0442\u044b <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.PartialEq.html\" rel=\"noopener noreferrer nofollow\">PartialEq<\/a>,\u00a0<a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.Eq.html\" rel=\"noopener noreferrer nofollow\">Eq<\/a>\u00a0\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/hash\/trait.Hash.html\" rel=\"noopener noreferrer nofollow\">Hash<\/a>\u00a0\u0434\u043b\u044f <code>Interned&lt;_&gt;<\/code>, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 struct, \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041d\u0430\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0442\u0441\u044f \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0438\u043b\u0438 \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u043d\u043e \u0441\u043a\u043e\u0440\u043e \u043c\u044b \u043a \u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f.<\/p>\n<pre><code class=\"rust\">use std::hash::{Hash, Hasher};  impl&lt;T: Eq + Hash&gt; PartialEq for Interned&lt;'_, T&gt; {     fn eq(&amp;self, other: &amp;Self) -&gt; bool {         self.lookup().deref() == other.lookup().deref()     } }  impl&lt;T: Eq + Hash&gt; Eq for Interned&lt;'_, T&gt; {}  impl&lt;T: Eq + Hash&gt; Hash for Interned&lt;'_, T&gt; {     fn hash&lt;H&gt;(&amp;self, state: &amp;mut H)     where         H: Hasher,     {         self.lookup().deref().hash(state)     } }<\/code><\/pre>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440\u043e\u0432: \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440.<\/p>\n<pre><code class=\"rust\">#[derive(Default)] struct Interners&lt;'a&gt; {     string: Interner&lt;String&gt;,     disruption: Interner&lt;Disruption&lt;'a&gt;&gt;,     line: Interner&lt;Line&lt;'a&gt;&gt;,     application_period: Interner&lt;ApplicationPeriod&lt;'a&gt;&gt;,     impacted_object: Interner&lt;ImpactedObject&lt;'a&gt;&gt;, }<\/code><\/pre>\n<p>struct \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0445\u0435\u043c\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 struct, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>Interned&lt;'a, ApplicationPeriod&lt;'a&gt;&gt;<\/code> \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0442\u044c \u0442\u0440\u0435\u0439\u0442\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0438 \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"rust\">#[derive(Debug, Hash, PartialEq, Eq)] struct Disruption&lt;'a&gt; {     id: IString&lt;'a&gt;,     application_periods: Vec&lt;Interned&lt;'a, ApplicationPeriod&lt;'a&gt;&gt;&gt;,     last_update: IString&lt;'a&gt;,     cause: IString&lt;'a&gt;,     severity: IString&lt;'a&gt;,     tags: Option&lt;Vec&lt;IString&lt;'a&gt;&gt;&gt;,     title: IString&lt;'a&gt;,     message: IString&lt;'a&gt;,     disruption_id: Option&lt;IString&lt;'a&gt;&gt;, }<\/code><\/pre>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0432\u0441\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e <code>Interners<\/code>.<\/p>\n<pre><code class=\"rust\">impl&lt;'a&gt; Disruption&lt;'a&gt; {     fn from(interners: &amp;'a Interners&lt;'a&gt;, source: source::Disruption) -&gt; Self {         Self {             id: Interned::from(&amp;interners.string, source.id),             application_periods: source                 .application_periods                 .into_iter()                 .map(|x| {                     Interned::from(                         &amp;interners.application_period,                         ApplicationPeriod::from(interners, x),                     )                 })                 .collect(),             ...         }     } }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044e \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c: \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0448\u0435\u0441\u0442\u044c \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435, \u0438 \u0432 12 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/f532ef9aa822a77de496b8fae44b1642db47bef8\" rel=\"noopener noreferrer nofollow\">f532ef9<\/a>).<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%) Optimized to 86349519 bytes (relative size = 7.59%) [67.50%] Interners: 58288479 bytes - [5.13%] String interner: 56374 objects | 4433343 bytes (78.64 bytes\/object) | 23964083 references (425.09 refs\/object) - [1.81%] Disruption interner: 7550 objects | 1565896 bytes (207.40 bytes\/object) | 625760 references (82.88 refs\/object)   - [0.28%] ApplicationPeriod interner: 5883 objects | 245688 bytes (41.76 bytes\/object) | 631593 references (107.36 refs\/object) - [53.61%] Line interner: 97090 objects | 46289464 bytes (476.77 bytes\/object) | 930026 references (9.58 refs\/object)   - [6.66%] ImpactedObject interner: 56110 objects | 5754088 bytes (102.55 bytes\/object) | 3183332 references (56.73 refs\/object)<\/code><\/pre>\n<h4>\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 (2.8%)<\/h4>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>Interner<\/code>\u00a0\u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0435\u043c struct <code>Interned<\/code>. \u042d\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0441 (1) \u0432\u0435\u0437\u0434\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438 <code>'a<\/code>\u00a0\u0438 (2) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0449\u0443\u044e \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044e <code>Interner<\/code>\/<code>InternerImpl<\/code>.<\/p>\n<pre><code class=\"rust\">struct Interned&lt;'a, T&gt; {     interner: &amp;'a Interner&lt;T&gt;,     id: usize, }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432 \u043e\u0431\u044a\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f: struct \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <code>Disruption&lt;'a&gt;<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0441\u0435\u043c\u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440! \u0427\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u044d\u0442\u043e\u0433\u043e?<\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043a\u043e\u0434\u0430 \u0442\u0438\u043f <code>Interned<\/code>\u00a0<a href=\"https:\/\/stackoverflow.com\/questions\/5004162\/what-does-it-mean-for-a-data-structure-to-be-intrusive\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0442\u0440\u0443\u0437\u0438\u0432\u0435\u043d<\/a>\u00a0(\u043e\u043d \u0437\u043d\u0430\u0435\u0442 \u043e\u0431 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u043c \u0435\u0433\u043e <code>Interner<\/code>). \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440.<\/p>\n<pre><code class=\"rust\">use std::marker::PhantomData;  struct Interned&lt;T&gt; {     id: usize,     \/\/ \u041c\u0430\u0440\u043a\u0435\u0440, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f,     \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f T (\u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 lookup).     _phantom: PhantomData&lt;fn() -&gt; T&gt;, }  impl&lt;T: Eq + Hash&gt; Interned&lt;T&gt; {     \/\/ \u0421\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430.     fn from(interner: &amp;Interner&lt;T&gt;, value: T) -&gt; Self {         interner.intern(value)     }      \/\/ \u0417\u0434\u0435\u0441\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435.     fn lookup(&amp;self, interner: &amp;Interner&lt;T&gt;) -&gt; Rc&lt;T&gt; {         interner.lookup(self.id)     } }<\/code><\/pre>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u043c \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0438 \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f <code>Interned&lt;T&gt;<\/code>. \u042d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 API, \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0440\u0435\u0439\u0442\u0430\u043c\u0438 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.PartialEq.html\" rel=\"noopener noreferrer nofollow\"><code>PartialEq<\/code><\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.PartialEq.html#tymethod.eq\" rel=\"noopener noreferrer nofollow\"><code>eq()<\/code><\/a>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440\u0430): \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0442\u043e\u0433\u0434\u0430 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0440\u0430\u0432\u043d\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0435 (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435) \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c derive \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f <code>Interned<\/code>. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438 \u0434\u043b\u044f \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"rust\">#[derive(Debug, Hash, PartialEq, Eq)] struct Interned&lt;T&gt; { \/* ... *\/ }<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c <code>Interned&lt;T&gt;<\/code>\u00a0\u0441 <code>T<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u043d\u043e\u0432\u044b\u0439 \u0442\u0440\u0435\u0439\u0442 <code>EqWith<\/code>, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440\u0430 \u043a\u0430\u043a \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"rust\">trait EqWith&lt;Rhs, Helper&gt; {     fn eq_with(&amp;self, other: &amp;Rhs, helper: &amp;Helper) -&gt; bool; }  impl&lt;T: Eq + Hash&gt; EqWith&lt;T, Interner&lt;T&gt;&gt; for Interned&lt;T&gt; {     fn eq_with(&amp;self, other: &amp;T, interner: &amp;Interner&lt;T&gt;) -&gt; bool {         self.lookup(interner).deref() == other     } }<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c struct \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c.<\/p>\n<pre><code class=\"rust\">#[derive(Debug, Hash, PartialEq, Eq)] struct ApplicationPeriod {     begin: IString,     end: IString, }  impl EqWith&lt;source::ApplicationPeriod, Interners&gt; for ApplicationPeriod {     fn eq_with(&amp;self, other: &amp;source::ApplicationPeriod, interners: &amp;Interners) -&gt; bool {         self.begin.eq_with(&amp;other.begin, &amp;interners.string)             &amp;&amp; self.end.eq_with(&amp;other.end, &amp;interners.string)     } }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u0434\u0432\u043e\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 <code>Interned&lt;T&gt;<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0434\u0432\u043e\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0438 \u043e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/59fae78b25aa2cfd013992c68f3692a2336f7f23\" rel=\"noopener noreferrer nofollow\">59fae78<\/a>).<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%) Optimized to 49829943 bytes (relative size = 4.38%) [68.66%] Interners: 34215191 bytes - [8.90%] String interner: 56374 objects | 4433335 bytes (78.64 bytes\/object) | 23964083 references (425.09 refs\/object) - [2.17%] Disruption interner: 7550 objects | 1081928 bytes (143.30 bytes\/object) | 625760 references (82.88 refs\/object)   - [0.30%] ApplicationPeriod interner: 5883 objects | 151552 bytes (25.76 bytes\/object) | 631593 references (107.36 refs\/object) - [49.71%] Line interner: 97090 objects | 24768600 bytes (255.11 bytes\/object) | 930026 references (9.58 refs\/object)   - [7.59%] ImpactedObject interner: 56110 objects | 3779776 bytes (67.36 bytes\/object) | 3183332 references (56.73 refs\/object)<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0435\u0449\u0451 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u0434\u0432\u043e\u0435?<\/p>\n<p>\u0414\u0430! \u0412 <a href=\"https:\/\/matklad.github.io\/2020\/03\/22\/fast-simple-rust-interner.html\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u0442\u0435<\/a>\u00a0matklad\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441 <code>u32<\/code>, \u0430 \u043d\u0435 <code>usize<\/code>. \u042d\u0442\u043e \u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0441\u044b\u043b\u043e\u043a. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043e\u0434\u043d\u0438\u043c \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u0439 \u0437\u0430\u043f\u0430\u0441.<\/p>\n<pre><code class=\"rust\">struct Interned&lt;T&gt; {     id: u32,  \/\/ \u0422\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e 32-\u0431\u0438\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441.     _phantom: PhantomData&lt;fn() -&gt; T&gt;, }  impl&lt;T: Eq + Hash&gt; Interner&lt;T&gt; {     fn intern(&amp;mut self, value: T) -&gt; u32 {         if let Some(&amp;id) = self.map.get(&amp;value) {             return id;         }          \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 \u0441\u0440\u0435\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 u32.         let id = self.vec.len();         assert!(id &lt;= u32::MAX as usize);         let id = id as u32;          let rc: Rc&lt;T&gt; = Rc::new(value);         self.vec.push(Rc::clone(&amp;rc));         self.map.insert(rc, id);         id     }      fn lookup(&amp;self, id: u32) -&gt; Rc&lt;T&gt; {         Rc::clone(&amp;self.vec[id as usize])     } } <\/code><\/pre>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0443\u0436\u0435 \u043c\u0435\u043d\u0435\u0435 3% \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/84d79e72fd0ec828d975ffeeed1f10d6cd1db906\" rel=\"noopener noreferrer nofollow\">84d79e7<\/a>). \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441!<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%) Optimized to 31391391 bytes (relative size = 2.76%) [72.41%] Interners: 22730967 bytes - [14.12%] String interner: 56374 objects | 4433335 bytes (78.64 bytes\/object) | 23964083 references (425.09 refs\/object) - [2.48%] Disruption interner: 7550 objects | 779548 bytes (103.25 bytes\/object) | 625760 references (82.88 refs\/object)   - [0.33%] ApplicationPeriod interner: 5883 objects | 104488 bytes (17.76 bytes\/object) | 631593 references (107.36 refs\/object) - [45.86%] Line interner: 97090 objects | 14396532 bytes (148.28 bytes\/object) | 930026 references (9.58 refs\/object)   - [9.61%] ImpactedObject interner: 56110 objects | 3017064 bytes (53.77 bytes\/object) | 3183332 references (56.73 refs\/object) <\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0441\u0445\u0435\u043c\u0443<\/h3>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u0438\u043a interning \u2014 \u043d\u0435 \u043a\u043e\u043d\u0435\u0446 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u0437\u043d\u0430\u043d\u0438\u044f \u043e \u043d\u0430\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h4>\u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 (1,5%)<\/h4>\n<p>\u0412 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u2014 \u043f\u043e\u043b\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>Line<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u043a\u0430\u043a <code>Vec&lt;Interned&lt;ImpactedObject&gt;&gt;<\/code>, \u0430 \u043a\u0430\u0436\u0434\u044b\u0439 <code>ImpactedObject<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e ID \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435 <code>Vec&lt;IString&gt;<\/code>.<\/p>\n<pre><code class=\"rust\">struct Line {     id: IString,     name: IString,     short_name: IString,     mode: IString,     network_id: IString,     impacted_objects: Vec&lt;Interned&lt;ImpactedObject&gt;&gt;, }  struct ImpactedObject {     typ: IString,     id: IString,     name: IString,     disruption_ids: Vec&lt;IString&gt;, }<\/code><\/pre>\n<p>\u041b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u0447\u0442\u043e \u0441 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u044d\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430: \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u043a\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043b\u0438\u043d\u0438\u0438 \u043c\u0435\u0442\u0440\u043e, \u0430 \u043d\u0435 \u0442\u043e, \u0431\u044b\u043b \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u00ab\u0434\u043e\u00bb \u0434\u0440\u0443\u0433\u043e\u0433\u043e (\u0447\u0442\u043e \u0431\u044b \u044d\u0442\u043e \u043d\u0438 \u0437\u043d\u0430\u0447\u0438\u043b\u043e). \u041e\u0434\u043d\u0430\u043a\u043e \u0432 Rust \u0442\u0438\u043f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 <code>Vec<\/code>\u00a0\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d!<\/p>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u0432\u0430 <code>ImpactedObject<\/code> \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 <code>typ<\/code>,\u00a0<code>id<\/code>\u00a0\u0438\u00a0<code>name<\/code>, \u043d\u043e \u0441 <code>disruption_ids<\/code>, \u0440\u0430\u0432\u043d\u044b\u043c\u0438 [123, 42, 73]\u00a0\u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438 [73, 123, 42] \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430, \u0445\u043e\u0442\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043d\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b.<\/p>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e API \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 (\u0447\u0442\u043e, \u044f \u0434\u0443\u043c\u0430\u044e, \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446 \u0438\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0445\u044d\u0448\u0435\u0439). \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437 N\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d N! \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0432 JSON, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a N\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432).<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f: <code>Line<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e <code>ImpactedObject<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0430\u043c\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 <code>IString<\/code>. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445 <code>ImpactedObject<\/code>, \u0438\u043c\u0435\u0435\u0442 3!=6 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 2!=2 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u0430 <code>Line<\/code>\u00a0\u0438\u043c\u0435\u0435\u0442 \u0434\u043e 6\u22c56\u22c52=72 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439. \u0418 \u044d\u0442\u043e \u0435\u0449\u0451 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u0435\u0435, \u0447\u0435\u043c 3 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, <code>Interner&lt;Line&gt;<\/code>\u00a0\u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (97090) \u0438\u043c\u0435\u043b \u0440\u0430\u0437\u043c\u0435\u0440 14 \u041c\u0411, \u0447\u0442\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e 45% \u043e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u043e\u0432.<\/p>\n<pre><code class=\"rust\">Line {     impacted_objects: vec![         ImpactedObject {             disruption_ids: vec![1, 2, 3], ...         },         ImpactedObject {             disruption_ids: vec![4, 5, 6], ...         },     ],     ... }  \/\/ \u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. Line {     impacted_objects: vec![         ImpactedObject {             disruption_ids: vec![6, 4, 5], ...         },         ImpactedObject {             disruption_ids: vec![2, 1, 3], ...         },     ],     ... }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u0430\u043d\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430; \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0445 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f (\u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0442\u0440\u0435\u0439\u0442\u043e\u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.PartialOrd.html\" rel=\"noopener noreferrer nofollow\"><code>PartialOrd<\/code><\/a>\u00a0\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.Ord.html\" rel=\"noopener noreferrer nofollow\"><code>Ord<\/code><\/a>) \u043a\u043e \u0432\u0441\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0432 \u0441\u0445\u0435\u043c\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0442\u043e\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u044d\u0442\u043e \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f: \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 <code>Interned&lt;T&gt;<\/code>, \u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b! \u0418 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435: \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043b\u0438\u0448\u044c \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438 \u043d\u0430\u0441 \u043d\u0435 \u0432\u043e\u043b\u043d\u0443\u0435\u0442, \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>derive<\/code> <code>PartialOrd<\/code>\u00a0\u0434\u043b\u044f <code>Interned&lt;T&gt;<\/code>\u00a0, \u0435\u0441\u043b\u0438 \u0441\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 <code>T<\/code>\u00a0\u0435\u0433\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442. \u042d\u0442\u043e <a href=\"https:\/\/github.com\/rust-lang\/rust\/issues\/26925\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0434\u0430\u0432\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 <\/a><code>derive<\/code>\u00a0(<a href=\"https:\/\/github.com\/rust-lang\/rust\/issues\/7671\" rel=\"noopener noreferrer nofollow\">\u0435\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0441\u044f\u0442\u0438 \u043b\u0435\u0442<\/a>!).<\/p>\n<pre><code class=\"rust\">use std::marker::PhantomData;  #[derive(PartialEq, Eq, PartialOrd, Ord)] struct Interned&lt;T&gt; {     id: u32,     _phantom: PhantomData&lt;fn() -&gt; T&gt;, }  struct MyArbitraryType;  fn foo(set: &amp;mut [Interned&lt;MyArbitraryType&gt;]) {     \/\/ error[E0277]: the trait bound `MyArbitraryType: Ord` is not satisfied     set.sort_unstable(); }<\/code><\/pre>\n<pre><code class=\"powershell\">error[E0277]: the trait bound `MyArbitraryType: Ord` is not satisfied     --&gt; src\/lib.rs:13:9      | 13   |     set.sort_unstable();      |         ^^^^^^^^^^^^^ the trait `Ord` is not implemented for `MyArbitraryType`      |      = help: the trait `Ord` is implemented for `Interned&lt;T&gt;` note: required for `Interned&lt;MyArbitraryType&gt;` to implement `Ord`     --&gt; src\/lib.rs:3:37      | 3    | #[derive(PartialEq, Eq, PartialOrd, Ord)]      |                                     ^^^ unsatisfied trait bound introduced in this `derive` macro note: required by a bound in `core::slice::&lt;impl [T]&gt;::sort_unstable`     --&gt; \/playground\/.rustup\/toolchains\/stable-x86_64-unknown-linux-gnu\/lib\/rustlib\/src\/rust\/library\/core\/src\/slice\/mod.rs:2932:12      | 2930 |     pub fn sort_unstable(&amp;mut self)      |            ------------- required by a bound in this associated function 2931 |     where 2932 |         T: Ord,      |            ^^^ required by this bound in `core::slice::&lt;impl [T]&gt;::sort_unstable`      = note: this error originates in the derive macro `Ord` (in Nightly builds, run with -Z macro-backtrace for more info) help: consider annotating `MyArbitraryType` with `#[derive(Ord)]`      | 9    + #[derive(Ord)] 10   | struct MyArbitraryType;      | <\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f <code>Interned&lt;T&gt;<\/code> \u0442\u0440\u0435\u0439\u0442\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0441\u0442\u0440\u0430\u0448\u043d\u043e. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c <code>PartialEq<\/code>\u00a0\u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0442\u043e \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0433\u043e <code>derive(Hash)<\/code>, \u043d\u043e <a href=\"https:\/\/rust-lang.github.io\/rust-clippy\/master\/index.html#derived_hash_with_manual_eq\" rel=\"noopener noreferrer nofollow\">Clippy lint<\/a>\u00a0\u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0442\u044c \u043e \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e.<\/p>\n<pre><code class=\"rust\">use std::cmp::Ordering; use std::hash::{Hash, Hasher};  impl&lt;T&gt; PartialEq for Interned&lt;T&gt; {     fn eq(&amp;self, other: &amp;Self) -&gt; bool {         self.id.eq(&amp;other.id)     } }  impl&lt;T&gt; Eq for Interned&lt;T&gt; {}  impl&lt;T&gt; PartialOrd for Interned&lt;T&gt; {     fn partial_cmp(&amp;self, other: &amp;Self) -&gt; Option&lt;Ordering&gt; {         Some(self.cmp(other))     } }  impl&lt;T&gt; Ord for Interned&lt;T&gt; {     fn cmp(&amp;self, other: &amp;Self) -&gt; Ordering {         self.id.cmp(&amp;other.id)     } }  impl&lt;T&gt; Hash for Interned&lt;T&gt; {     fn hash&lt;H&gt;(&amp;self, state: &amp;mut H)     where         H: Hasher,     {         self.id.hash(state);     } }<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e <code>InternedSet&lt;T&gt;<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/primitive.slice.html#method.sort_unstable\" rel=\"noopener noreferrer nofollow\"><code>sort_unstable()<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0439 <a href=\"https:\/\/doc.rust-lang.org\/std\/primitive.slice.html#method.sort\" rel=\"noopener noreferrer nofollow\"><code>sort()<\/code><\/a>. \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u043a boxed-\u0441\u043b\u0430\u0439\u0441 <code>Box&lt;[_]&gt;<\/code>\u00a0\u0432\u043c\u0435\u0441\u0442\u043e <code>Vec&lt;_&gt;<\/code>, \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u0451\u043c\u043a\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<pre><code class=\"rust\">#[derive(Debug, Hash, PartialEq, Eq)] struct InternedSet&lt;T&gt; {     set: Box&lt;[Interned&lt;T&gt;]&gt;, }  impl&lt;T&gt; InternedSet&lt;T&gt; {     fn new(set: impl IntoIterator&lt;Item = Interned&lt;T&gt;&gt;) -&gt; Self {         let mut set: Box&lt;[_]&gt; = set.into_iter().collect();         set.sort_unstable();         Self { set }     } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0441\u0445\u0435\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<pre><code class=\"rust\">struct ImpactedObject {     typ: IString,     id: IString,     name: IString,     disruption_ids: InternedSet&lt;String&gt;, }  impl ImpactedObject {     fn from(interners: &amp;mut Interners, source: source::ImpactedObject) -&gt; Self {         Self {             typ: Interned::from(&amp;mut interners.string, source.typ),             id: Interned::from(&amp;mut interners.string, source.id),             name: Interned::from(&amp;mut interners.string, source.name),             disruption_ids: InternedSet::new(                 source                     .disruption_ids                     .into_iter()                     .map(|x| Interned::from(&amp;mut interners.string, x)),             ),         }     } }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>Line<\/code>\u00a0\u043d\u0430 14 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u043a\u043e\u0434 \u0432\u0434\u0432\u043e\u0435 (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/bdb00b523433db5f1f4a3150507f3b05eef76de5\" rel=\"noopener noreferrer nofollow\">bdb00b5<\/a>).<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%) Optimized to 16578863 bytes (relative size = 1.46%) [50.70%] Interners: 8405895 bytes - [26.74%] String interner: 56374 objects | 4433335 bytes (78.64 bytes\/object) | 23964083 references (425.09 refs\/object) - [3.97%] Disruption interner: 7550 objects | 658748 bytes (87.25 bytes\/object) | 625760 references (82.88 refs\/object)   - [0.63%] ApplicationPeriod interner: 5883 objects | 104488 bytes (17.76 bytes\/object) | 631593 references (107.36 refs\/object) - [4.06%] Line interner: 6880 objects | 672568 bytes (97.76 bytes\/object) | 930026 references (135.18 refs\/object)   - [15.30%] ImpactedObject interner: 55373 objects | 2536756 bytes (45.81 bytes\/object) | 3183332 references (57.49 refs\/object) <\/code><\/pre>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c enum (1,4%)<\/h4>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0435 struct <code>Data<\/code>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<pre><code class=\"rust\">struct Data {     status_code: Option&lt;i32&gt;,     error: Option&lt;IString&gt;,     message: Option&lt;IString&gt;,     disruptions: Option&lt;InternedSet&lt;Disruption&gt;&gt;,     lines: Option&lt;InternedSet&lt;Line&gt;&gt;,     last_updated_date: Option&lt;IString&gt;, }<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044f \u0438\u0434\u0443\u0442 \u0432\u043c\u0435\u0441\u0442\u0435: \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 <code>status_code<\/code>,\u00a0<code>error<\/code>\u00a0\u0438 <code>message<\/code>, \u0438\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 <code>disruptions<\/code>,\u00a0<code>lines<\/code>\u00a0\u0438 <code>last_updated_date<\/code>. \u0414\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441 \u0434\u0432\u0443\u043c\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438.<\/p>\n<pre><code class=\"rust\">enum Data {     Success {         disruptions: InternedSet&lt;Disruption&gt;,         lines: InternedSet&lt;Line&gt;,         last_updated_date: IString,     },     Error {         status_code: i32,         error: IString,         message: IString,     }, }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0430 \u043f\u043b\u044e\u0441\u0430: \u0441\u0445\u0435\u043c\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. <code>Interned&lt;T&gt;<\/code>\u00a0\u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 4 \u0431\u0430\u0439\u0442\u0430 (\u0438\u043d\u0434\u0435\u043a\u0441 u32), \u0430 <code>Option&lt;Interned&lt;T&gt;&gt;<\/code>\u00a0\u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 8 \u0431\u0430\u0439\u0442\u043e\u0432: 1 \u0431\u0438\u0442 \u043f\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0446\u0438\u0438 \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u043e \u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e 4 \u0431\u0430\u0439\u0442\u0430\u043c.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u043c (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/c8ac2611348f271c8deffeb26b11aee022387baa\" rel=\"noopener noreferrer nofollow\">c8ac261<\/a>).<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%) Optimized to 15847679 bytes (relative size = 1.39%) [53.04%] Interners: 8405895 bytes - [27.97%] String interner: 56374 objects | 4433335 bytes (78.64 bytes\/object) | 23964083 references (425.09 refs\/object) - [4.16%] Disruption interner: 7550 objects | 658748 bytes (87.25 bytes\/object) | 625760 references (82.88 refs\/object)   - [0.66%] ApplicationPeriod interner: 5883 objects | 104488 bytes (17.76 bytes\/object) | 631593 references (107.36 refs\/object) - [4.24%] Line interner: 6880 objects | 672568 bytes (97.76 bytes\/object) | 930026 references (135.18 refs\/object)   - [16.01%] ImpactedObject interner: 55373 objects | 2536756 bytes (45.81 bytes\/object) | 3183332 references (57.49 refs\/object) <\/code><\/pre>\n<h4>\u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c struct (0,82%)<\/h4>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 <code>ImpactedObject<\/code> \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f (<code>type<\/code>, <code>identifier<\/code>, <code>name<\/code>) \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u043b\u044f (\u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439). \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u043e\u0432\u044b\u0439 <code>ImpactedObject<\/code>\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u043b\u044f \u00ab\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u00bb \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0435\u0439 \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043f\u043e\u043b\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440.<\/p>\n<pre><code class=\"rust\">struct ImpactedObject {     \/\/ \u041d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430.     object: Interned&lt;Object&gt;,     disruption_ids: InternedSet&lt;String&gt;, }  \/\/ \u041d\u043e\u0432\u0430\u044f struct, \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430. struct Object {     typ: IString,     id: IString,     name: IString, }<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <code>ImpactedObject<\/code> (55373), \u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445: \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 <code>u32<\/code>\u00a0\u0434\u043b\u044f <code>Interned&lt;Object&gt;<\/code>\u00a0\u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0440\u0451\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 <code>IString<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <code>Object<\/code> \u0441\u0442\u0430\u043b\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435 (1679), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u0435 <code>ImpactedObject<\/code> (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/8914a64497362cab7847796d60a27aeb117134b5\" rel=\"noopener noreferrer nofollow\">8914a64<\/a>).<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%) Optimized to 15330607 bytes (relative size = 1.35%) [51.46%] Interners: 7888823 bytes - [28.92%] String interner: 56374 objects | 4433335 bytes (78.64 bytes\/object) | 23964083 references (425.09 refs\/object) - [4.30%] Disruption interner: 7550 objects | 658748 bytes (87.25 bytes\/object) | 625760 references (82.88 refs\/object)   - [0.68%] ApplicationPeriod interner: 5883 objects | 104488 bytes (17.76 bytes\/object) | 631593 references (107.36 refs\/object) - [3.67%] Line interner: 6880 objects | 562488 bytes (81.76 bytes\/object) | 930026 references (135.18 refs\/object)   - [0.01%] LineHeader interner: 45 objects | 1428 bytes (31.73 bytes\/object) | 930026 references (20667.24 refs\/object)   - [13.66%] ImpactedObject interner: 55373 objects | 2093772 bytes (37.81 bytes\/object) | 3183332 references (57.49 refs\/object)     - [0.23%] Object interner: 1679 objects | 34564 bytes (20.59 bytes\/object) | 3183332 references (1895.97 refs\/object)<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 <code>ImpactedObject<\/code>\u00a0, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u0414\u043e\u0431\u0430\u0432\u0438\u0432 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u043b\u043e\u0439 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 interning \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u043c\u044b \u0441\u043d\u043e\u0432\u0430 \u043c\u043e\u0436\u0435\u043c \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u043b\u0438\u0448\u044c 9127 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 ID \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/fcff0d5f1e9bc1089382170f5ed7f097190c48de\" rel=\"noopener noreferrer nofollow\">fcff0d5<\/a>).<\/p>\n<pre><code class=\"rust\">struct ImpactedObject {     object: Interned&lt;Object&gt;,     \/\/ \u0422\u043e\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u0443\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e.     disruption_ids: Interned&lt;InternedSet&lt;String&gt;&gt;, }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 \u0442\u0440\u0435\u0442\u044c.<\/p>\n<pre><code class=\"rust\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%) Optimized to 9364491 bytes (relative size = 0.82%) [94.79%] Interners: 8877035 bytes - [47.34%] String interner: 56374 objects | 4433335 bytes (78.64 bytes\/object) | 23964083 references (425.09 refs\/object) - [3.50%] InternedSet&lt;String&gt; interner: 9127 objects | 327620 bytes (35.90 bytes\/object) | 3183332 references (348.78 refs\/object) - [7.90%] InternedSet&lt;Disruption&gt; interner: 7066 objects | 739652 bytes (104.68 bytes\/object) | 30430 references (4.31 refs\/object)   - [7.03%] Disruption interner: 7550 objects | 658748 bytes (87.25 bytes\/object) | 625760 references (82.88 refs\/object)     - [1.12%] ApplicationPeriod interner: 5883 objects | 104488 bytes (17.76 bytes\/object) | 631593 references (107.36 refs\/object) - [11.88%] InternedSet&lt;Line&gt; interner: 7183 objects | 1112896 bytes (154.93 bytes\/object) | 30430 references (4.24 refs\/object)   - [6.01%] Line interner: 6880 objects | 562488 bytes (81.76 bytes\/object) | 930026 references (135.18 refs\/object)     - [0.02%] LineHeader interner: 45 objects | 1428 bytes (31.73 bytes\/object) | 930026 references (20667.24 refs\/object)     - [9.63%] ImpactedObject interner: 55373 objects | 901816 bytes (16.29 bytes\/object) | 3183332 references (57.49 refs\/object)       - [0.37%] Object interner: 1679 objects | 34564 bytes (20.59 bytes\/object) | 3183332 references (1895.97 refs\/object) <\/code><\/pre>\n<h4>\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0442\u0438\u043f\u044b (0,64%)<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430: \u043a\u0430\u0436\u0434\u044b\u0439 <code>Interner<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440 \u0441\u0442\u0440\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u043d\u043e\u0440\u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438: \u043e\u0434\u043d\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u044b\u043b\u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 HTML, \u0434\u0440\u0443\u0433\u0438\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0441\u0442, \u0442\u0440\u0435\u0442\u044c\u0438 \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Universally_unique_identifier\" rel=\"noopener noreferrer nofollow\">UUID<\/a>, \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0435 \u2014 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0430 \u0432\u0438\u0434\u0430: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438\u0445 \u0432 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043e\u0433\u0430\u0449\u0451\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b.<\/p>\n<p>\u0414\u043b\u044f UUID \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f <code>Uuid<\/code>\u00a0\u0438\u0437 \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/uuid\/\" rel=\"noopener noreferrer nofollow\"><code>uuid<\/code><\/a>. \u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0434 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0432\u0441\u0435\u0433\u043e 16 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e 36 \u0431\u0430\u0439\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 67e55044-10b1-426f-9247-bb680e5fe0c8\u00a0(\u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f + \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439).<\/p>\n<p>\u0414\u043b\u044f \u043c\u0435\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/chrono\/\" rel=\"noopener noreferrer nofollow\"><code>chrono<\/code><\/a>, \u0436\u0435\u043b\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0432 8 \u0431\u0430\u0439\u0442\u0430\u0445 (64-\u0431\u0438\u0442\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0441 \u044d\u043f\u043e\u0445\u0438 Unix) \u0432\u043c\u0435\u0441\u0442\u043e 15-24 \u0431\u0430\u0439\u0442\u043e\u0432 \u0434\u043b\u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 20240428T044500\u00a0\u0438\u043b\u0438 2024-05-01T00:59:25.384Z. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c: \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u044b\u043b\u0438 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <a href=\"https:\/\/tools.ietf.org\/html\/rfc3339\" rel=\"noopener noreferrer nofollow\">RFC 3339<\/a>\u00a0\u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u043c \u043f\u043e\u044f\u0441\u0435 UTC, \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430\u0438\u0432\u043d\u044b\u0435 \u0434\u0430\u0442\u0430 + \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0434\u043b\u044f \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u0430 \u041f\u0430\u0440\u0438\u0436\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u044f \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/chrono-tz\/\" rel=\"noopener noreferrer nofollow\"><code>chrono-tz<\/code><\/a>\u00a0\u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u043a\u0430\u043d\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0445 \u0432 UTC.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044c: \u0432 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/en.wikipedia.org\/wiki\/Daylight_saving_time\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043b\u0435\u0442\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f<\/a>, \u0432\u0440\u0435\u043c\u044f \u043c\u0435\u0436\u0434\u0443 2 \u0438 3 \u0447\u0430\u0441\u0430\u043c\u0438 \u043d\u043e\u0447\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e (\u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043b\u0438 \u043c\u044b \u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u043c \u043f\u043e\u044f\u0441\u0435 CET \u0438\u043b\u0438 CEST \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 3 \u043d\u0430 2 \u0447\u0430\u0441\u0430) \u0438\u043b\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e (\u043a\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0441 2 \u043d\u0430 3 \u0447\u0430\u0441\u0430). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0441\u0435\u0442\u044c \u043c\u0435\u0442\u0440\u043e\u043f\u043e\u043b\u0438\u0442\u0435\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0432\u0430\u0436\u043d\u0430. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043d\u043e\u0447\u043d\u044b\u0445 \u043f\u043e\u0435\u0437\u0434\u043e\u0432 \u044d\u0442\u043e \u0431\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u043b\u043e.<\/p>\n<pre><code class=\"rust\">use chrono::offset::LocalResult; use chrono::{DateTime, NaiveDateTime}; use chrono_tz::Europe::Paris;  struct TimestampSecondsParis(i64);  impl TimestampSecondsParis {     fn from_formatted(x: &amp;str, format: &amp;str) -&gt; Self {         let naive_datetime = NaiveDateTime::parse_from_str(x, format).unwrap_or_else(|_| {             panic!(\"Failed to parse datetime (custom format {format:?}) from {x}\")         });          \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043b\u0435\u0442\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.         let datetime = match naive_datetime.and_local_timezone(Paris) {             LocalResult::Single(x) =&gt; x,             LocalResult::Ambiguous(earliest, latest) =&gt; {                 eprintln!(\"Ambiguous mapping of {naive_datetime:?} to the Paris timezone: {earliest:?} or {latest:?}\");                 earliest             }             LocalResult::None =&gt; {                 panic!(\"Invalid mapping of {naive_datetime:?} to the Paris timezone\")             }         };          TimestampSecondsParis(datetime.timestamp())     } }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0432 \u0435\u0449\u0451 2 \u041c\u0411 (\u043a\u043e\u043c\u043c\u0438\u0442\u044b <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/2031f428a7d91019486d896e25824c17b1f0ce8f\" rel=\"noopener noreferrer nofollow\">2031f42<\/a>\u00a0\u0438 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/ad29181ff2ce5c0dff8d6d4e7010244456b60842\" rel=\"noopener noreferrer nofollow\">ad29181<\/a>).<\/p>\n<pre><code class=\"rust\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1322690141 bytes in memory (relative size = 116.31%) Optimized to 7264110 bytes (relative size = 0.64%) [89.93%] Interners: 6532926 bytes - [25.03%] String interner: 8050 objects | 1818466 bytes (225.90 bytes\/object) | 17309489 references (2150.25 refs\/object) - [2.25%] Uuid interner: 6617 objects | 163296 bytes (24.68 bytes\/object) | 4735218 references (715.61 refs\/object) - [10.18%] InternedSet&lt;Disruption&gt; interner: 7066 objects | 739652 bytes (104.68 bytes\/object) | 30430 references (4.31 refs\/object)   - [9.90%] Disruption interner: 7550 objects | 719148 bytes (95.25 bytes\/object) | 625760 references (82.88 refs\/object)     - [2.09%] ApplicationPeriod interner: 5883 objects | 151552 bytes (25.76 bytes\/object) | 631593 references (107.36 refs\/object) - [15.32%] InternedSet&lt;Line&gt; interner: 7183 objects | 1112896 bytes (154.93 bytes\/object) | 30430 references (4.24 refs\/object)   - [7.74%] Line interner: 6880 objects | 562488 bytes (81.76 bytes\/object) | 930026 references (135.18 refs\/object)     - [0.02%] LineHeader interner: 45 objects | 1428 bytes (31.73 bytes\/object) | 930026 references (20667.24 refs\/object)     - [12.41%] ImpactedObject interner: 55373 objects | 901816 bytes (16.29 bytes\/object) | 3183332 references (57.49 refs\/object)       - [0.48%] Object interner: 1679 objects | 34564 bytes (20.59 bytes\/object) | 3183332 references (1895.97 refs\/object)       - [4.51%] InternedSet&lt;Uuid&gt; interner: 9127 objects | 327620 bytes (35.90 bytes\/object) | 3183332 references (348.78 refs\/object) <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/890250\/\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0435\u0434\u0443\u0435\u0442<\/a>&#8230;<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/889874\/\"> https:\/\/habr.com\/ru\/articles\/889874\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u0441 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/a>\u00a0\u0441\u0435\u0442\u0438 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u041f\u0430\u0440\u0438\u0436\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e <a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\/catalogue-data?type=api\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 API<\/a>\u00a0\u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 <a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\/apis\/idfm-ivtr-requete_globale\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430<\/a>,\u00a0<a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\/apis\/idfm-disruptions_bulk\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f<\/a> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041c\u043e\u0451 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u043b\u0451\u043a <a href=\"https:\/\/prim.iledefrance-mobilites.fr\/en\/reutilisations\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u0434\u0435\u043b \u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0451\u043c \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/ratpstatus.fr\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0431-\u0441\u0430\u0439\u0442 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u0435\u0442\u0438 RATP <\/a>\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f\u0445 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0440\u043e, \u0441\u0435\u0442\u0438 \u044d\u043a\u0441\u043f\u0440\u0435\u0441\u0441\u043e\u0432\/\u043f\u043e\u0435\u0437\u0434\u043e\u0432 \u0438 \u0442\u0440\u0430\u043c\u0432\u0430\u0435\u0432.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0434\u0435\u043d\u044c \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 <a href=\"http:\/\/ratpstatus.fr\" rel=\"noopener noreferrer nofollow\">ratpstatus.fr<\/a>.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412<a href=\"https:\/\/github.com\/wincelau\/ratpstatus\" rel=\"noopener noreferrer nofollow\"> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub <\/a>\u0441\u0430\u0439\u0442\u0430 <a href=\"http:\/\/ratpstatus.fr\" rel=\"noopener noreferrer nofollow\">ratpstatus.fr<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f <a href=\"https:\/\/github.com\/wincelau\/ratpstatus\/tree\/main\/datas\" rel=\"noopener noreferrer nofollow\">\u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b JSON<\/a>, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 open-data API \u043a\u0430\u0436\u0434\u044b\u0435 \u0434\u0432\u0435 \u043c\u0438\u043d\u0443\u0442\u044b. \u0414\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043c \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 188 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 10 \u0413\u0411 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 (\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 git clone &#8212;depth=1) \u2014 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445! \u0423\u0442\u043e\u0447\u043d\u044e, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043a\u0440\u0438\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0412\u0435\u0431-\u0441\u0430\u0439\u0442 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u0435\u0442\u0438 RATP \u2014 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442, \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043e\u0432. [\u0418 \u043d\u0435\u0442, \u0441\u0430\u0439\u0442 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Rust. \u0412\u0435\u0431-\u0441\u0430\u0439\u0442 \u043d\u0430 PHP \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c!]<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (10 \u0413\u0411) \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f: \u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0436\u0430\u0442\u044c \u0435\u0451 \u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0430 \u044d\u0442\u043e \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0441\u043a\u0430\u0436\u0435\u043c \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435)? \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"https:\/\/en.wikipedia.org\/wiki\/Interning_(computer_science)\" rel=\"noopener noreferrer nofollow\">\u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f interning<\/a>\u00a0\u0432 Rust, \u0447\u0442\u043e\u0431\u044b \u0441\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0432 \u0434\u0432\u0435 \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437! \u041c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c \u0438 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 interning \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 JSON, \u0442\u043e \u0432\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e!<\/p>\n<h3>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 (135%)<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0430\u043b\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u0430 JSON \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"json\">{   \"disruptions\": [     {       \"id\": \"445a6032-d1ca-11ef-b3f5-0a58a9feac02\",       \"applicationPeriods\": [         {           \"begin\": \"20250113T180000\",           \"end\": \"20250228T230000\"         }       ],       \"lastUpdate\": \"20250113T172013\",       \"cause\": \"PERTURBATION\",       \"severity\": \"BLOQUANTE\",       \"title\": \"Activities in Aincourt\",       \"message\": \"&lt;p&gt;Due to work in Aincourt, the Centre and Eglise stops will not be served in both directions of traffic on line 95 15 and in the direction of Magny en Vexin Gare Routi\u00e8re only on line 95 44. &lt;br&gt;From 13\/01 until further notice. &lt;\/p&gt;&lt;br&gt;Please refer to Les Cadenas stops\"     },   ... } <\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443! \u042f\u0437\u044b\u043a <a href=\"https:\/\/www.rust-lang.org\/\" rel=\"noopener noreferrer nofollow\">Rust<\/a> \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/docs.rs\/serde\/\" rel=\"noopener noreferrer nofollow\">serde<\/a>\u00a0\u0438 <a href=\"https:\/\/docs.rs\/serde_json\/\" rel=\"noopener noreferrer nofollow\">serde_json<\/a>. \u0412 \u0441\u0432\u043e\u0451\u043c <a href=\"https:\/\/doc.rust-lang.org\/cargo\/reference\/manifest.html\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 Cargo.toml<\/a> \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439:<\/p>\n<pre><code class=\"json\">[dependencies] serde = { version = \"1.0.217\", features = [\"derive\"] } serde_json = \"1.0.137\"<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 struct\/enum \u044f\u0437\u044b\u043a\u0430 Rust \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/serde\/1.0.217\/serde\/derive.Deserialize.html\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441\u0430 derive Deserialize<\/a>\u00a0serde, \u0447\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0451 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/serde.rs\/container-attrs.html#deny_unknown_fields\" rel=\"noopener noreferrer nofollow\">\u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>deny_unknown_fields<\/code><\/a>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f JSON \u043d\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u043e\u043b\u0447\u0430. \u042d\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 <a href=\"http:\/\/serde.rs\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0435 serde.rs<\/a><a href=\"https:\/\/serde.rs\/attributes.html\" rel=\"noopener noreferrer nofollow\"> <\/a>(\u043d\u0435 \u0432 <a href=\"http:\/\/docs.rs\" rel=\"noopener noreferrer nofollow\">docs.rs<\/a>).<\/p>\n<pre><code class=\"rust\">use serde::Deserialize;  #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct Data {     #[serde(rename = \"statusCode\")]     status_code: Option&lt;i32&gt;,     error: Option&lt;String&gt;,     message: Option&lt;String&gt;,     disruptions: Option&lt;Vec&lt;Disruption&gt;&gt;,     lines: Option&lt;Vec&lt;Line&gt;&gt;,     #[serde(rename = \"lastUpdatedDate\")]     last_updated_date: Option&lt;String&gt;, }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b JSON \u0432 struct <code>Data<\/code>\u00a0\u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/docs.rs\/serde_json\/1.0.137\/serde_json\/fn.from_reader.html\" rel=\"noopener noreferrer nofollow\"><code>serde_json::from_reader()<\/code><\/a>.<\/p>\n<pre><code class=\"rust\">\/\/ \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f. let file = File::open(path)?; \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u043e\u0439 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 let reader = BufReader::new(file); \/\/ \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 JSON \u0432 Data. let data: Data = serde_json::from_reader(reader)?;<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 <code>Disruption<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0435\u0447\u0435\u0440 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0441\u044f\u0446\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0432\u0435\u0447\u0435\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c <code>ApplicationPeriod<\/code>.<\/p>\n<pre><code class=\"rust\">#[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct Disruption {     id: String,     #[serde(rename = \"applicationPeriods\")]     application_periods: Vec&lt;ApplicationPeriod&gt;,     #[serde(rename = \"lastUpdate\")]     last_update: String,     cause: String,     severity: String,     tags: Option&lt;Vec&lt;String&gt;&gt;,     title: String,     message: String,     disruption_id: Option&lt;String&gt;, }  #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct ApplicationPeriod {     begin: String,     end: String, }<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e <code>Line<\/code>, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0430\u043d\u0446\u0438\u0438), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043c\u0435\u0442\u0440\u043e.<\/p>\n<pre><code class=\"rust\">#[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct Line {     id: String,     name: String,     #[serde(rename = \"shortName\")]     short_name: String,     mode: String,     #[serde(rename = \"networkId\")]     network_id: String,     #[serde(rename = \"impactedObjects\")]     impacted_objects: Vec&lt;ImpactedObject&gt;, }  #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] struct ImpactedObject {     #[serde(rename = \"type\")]     typ: String,     id: String,     name: String,     #[serde(rename = \"disruptionIds\")]     disruption_ids: Vec&lt;String&gt;, }<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u0445\u043e\u0442\u0435\u043b \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439, \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0430\u043c\u0438 interning. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/doc.rust-lang.org\/std\/mem\/fn.size_of.html\" rel=\"noopener noreferrer nofollow\"><code>std::mem::size_of()<\/code>\u00a0<\/a>Rust \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u00ab\u0441\u0442\u0435\u043a\u0435\u00bb, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0432 \u043a\u0443\u0447\u0435 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e <a href=\"https:\/\/doc.rust-lang.org\/std\/vec\/struct.Vec.html\" rel=\"noopener noreferrer nofollow\"><code>Vec<\/code><\/a>). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u043d\u043e\u0432\u044b\u0439 \u0442\u0440\u0435\u0439\u0442 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u0434\u043b\u044f \u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u043d\u0435 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<pre><code class=\"rust\">trait EstimateSize: Sized {     \/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0432 \u043a\u0443\u0447\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.     fn allocated_bytes(&amp;self) -&gt; usize;      \/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u044d\u0442\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c.     fn estimated_bytes(&amp;self) -&gt; usize {         std::mem::size_of::&lt;Self&gt;() + self.allocated_bytes()     } }  impl EstimateSize for i32 {     fn allocated_bytes(&amp;self) -&gt; usize {         0  \/\/ \u0412 \u043a\u0443\u0447\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e.     } }  impl EstimateSize for String {     fn allocated_bytes(&amp;self) -&gt; usize {         self.len()  \/\/ \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442. \u0401\u043c\u043a\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f.     } }  impl&lt;T: EstimateSize&gt; EstimateSize for Vec&lt;T&gt; {     fn allocated_bytes(&amp;self) -&gt; usize {         \/\/ \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.         self.iter().map(|x| x.estimated_bytes()).sum()     } }<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (struct) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/doc.rust-lang.org\/reference\/procedural-macros.html#derive-macros\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441\u0430 derive <\/a>(\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e <code>Deserialize<\/code> serde), \u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043c\u043e\u0435\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043c\u043d\u0435 \u0438\u0437\u043b\u0438\u0448\u043d\u0435\u0439 \u0442\u0440\u0430\u0442\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<pre><code class=\"rust\">impl EstimateSize for Data {     fn allocated_bytes(&amp;self) -&gt; usize {         self.status_code.allocated_bytes()             + self.error.allocated_bytes()             + self.message.allocated_bytes()             + self.disruptions.allocated_bytes()             + self.lines.allocated_bytes()             + self.last_updated_date.allocated_bytes()     } }<\/code><\/pre>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0437\u0430 \u043c\u0430\u0439 2024 \u0433\u043e\u0434\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u0430\u043b\u043e \u043c\u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b: \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 1,1 \u0413\u0411 \u0444\u0430\u0439\u043b\u043e\u0432 JSON \u0432 struct \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 35% (\u043a\u043e\u043c\u043c\u0438\u0442 <a href=\"https:\/\/github.com\/gendx\/rust-interning\/commit\/d961e6e5f0cce53c2b328a7fd70482811e80f26e\" rel=\"noopener noreferrer nofollow\">d961e6e<\/a>). \u0414\u0432\u0438\u0436\u0435\u043c\u0441\u044f \u043d\u0435 \u0432 \u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438\u2026 \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439!<\/p>\n<pre><code class=\"powershell\">Parsed 1137178883 bytes from 30466 files (+ 21 failed files) Expanded to 1531039733 bytes in memory (relative size = 134.63%)<\/code><\/pre>\n<h3>Interning<\/h3>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u043e\u0441\u043d\u043e\u0432\u0430\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 interning \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0442\u0438\u043f\u0430\u043c.<\/p>\n<h4>\u0421\u0442\u0440\u043e\u043a\u0438 (47%)<\/h4>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f interning, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438; \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e\u043c \u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u043b\u0438 <a href=\"https:\/\/lib.rs\/keywords\/interning\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Rust \u0434\u043b\u044f interning<\/a>. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0435\u0431\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 interning.<\/p>\n<p>\u042f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u0442 matklad\u00a0\u0437\u0430 2020 \u0433\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/matklad.github.io\/2020\/03\/22\/fast-simple-rust-interner.html\" rel=\"noopener noreferrer nofollow\">Fast and Simple Rust Interner<\/a>, \u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043b \u0435\u0433\u043e \u0434\u0438\u0437\u0430\u0439\u043d. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c. \u0447\u0442\u043e \u044f \u043e\u0431\u0435\u0440\u043d\u0443\u043b \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/rc\/struct.Rc.html\" rel=\"noopener noreferrer nofollow\">Rc<\/a>\u00a0(\u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u0441 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a), \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0445 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u0431\u044b \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0442\u043e \u044f \u0431\u044b \u0432\u044b\u0431\u0440\u0430\u043b <a href=\"https:\/\/doc.rust-lang.org\/std\/sync\/struct.Arc.html\" rel=\"noopener noreferrer nofollow\">Arc<\/a>, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440? \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0442\u0440\u043e\u043a, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u043e\u043a, \u0441\u043e\u043f\u0440\u044f\u0436\u0451\u043d\u043d\u043e\u0433\u043e \u0441 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0443\u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0435.<\/p>\n<pre><code class=\"rust\">use std::collections::HashMap; use std::rc::Rc;  #[derive(Default)] struct StringInternerImpl {     vec: Vec&lt;Rc&lt;String&gt;&gt;,     map: HashMap&lt;Rc&lt;String&gt;, usize&gt;, }  impl StringInternerImpl {     fn intern(&amp;mut self, value: String) -&gt; usize {         if let Some(&amp;id) = self.map.get(&amp;value) {             return id;         }          let id = self.vec.len();         let rc: Rc&lt;String&gt; = Rc::new(value);         self.vec.push(Rc::clone(&amp;rc));         self.map.insert(rc, id);         id     }      fn lookup(&amp;self, id: usize) -&gt; Rc&lt;String&gt; {         Rc::clone(&amp;self.vec[id])     } }<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0440\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u0440\u043e\u043a.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0437 interning \u0438 \u0441 \u043d\u0438\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043d\u0442\u0435\u0440\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-452803","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/452803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=452803"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/452803\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=452803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=452803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=452803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}