{"id":315107,"date":"2020-12-18T15:00:49","date_gmt":"2020-12-18T15:00:49","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=315107"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=315107","title":{"rendered":"\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Flutter \u043d\u0430 \u0438\u0437\u043e\u043b\u044f\u0442\u0430\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/121\/4fd\/4f1\/1214fd4f15ce9ea52b0d246d6862b3ed.png\" width=\"1894\" height=\"1292\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e Flutter \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 WebSocket, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0432\u0440\u043e\u0434\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430) \u0432\u0441\u0435 \u044d\u0442\u043e, <em>\u043e\u0431\u044b\u0447\u043d\u043e<\/em>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435. \u041c\u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u043f\u0430\u043a\u0435\u0442, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0438\u0437\u043e\u043b\u044f\u0442\u044b, \u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0438 <a href=\"https:\/\/pub.dev\/packages\/isolator\" rel=\"noopener noreferrer nofollow\">\u0434\u0440\u0443\u0433\u043e\u0439<\/a> (<em>\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u0439<\/em>). \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u0441 \u043d\u0438\u043c \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0431\u0443\u0434\u0443 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c\u0438 &#8212; <strong>\u0438\u0437\u043e\u043b\u044f\u0442<\/strong> \u0438 <strong>\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a.<\/strong> \u041e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0431\u044b\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u0430\u0432\u0442\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u043d, \u043d\u043e \u043f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a &#8212; \u0442\u043e\u0436\u0435 \u0438\u0437\u043e\u043b\u044f\u0442. \u0422\u0430\u043a\u0436\u0435 \u0442\u0443\u0442 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0437\u0430\u0442\u044c \u0441\u043b\u0443\u0445 (\u0438\u043b\u0438 \u0433\u043b\u0430\u0437\u0430) \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0443\u0442\u043a\u0438\u043c \u043d\u0430\u0442\u0443\u0440\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u043e\u0448\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0432\u043e\u0438 \u0438\u0437\u0432\u0438\u043d\u0435\u043d\u0438\u044f &#8212; \u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435. \u0412\u0441\u0435 \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c <em>\u043a\u0443\u0440\u0441\u0438\u0432\u043e\u043c<\/em>. \u0422\u0430\u043a\u0436\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <em>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438<\/em> &#8212; \u044f \u0431\u0443\u0434\u0443 \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434. \u0410 <em>\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438<\/em> &#8212; \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0432\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0435\u0433\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0418\u0437\u043e\u043b\u044f\u0442\u044b \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a\u043e\u0433\u0434\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442 \u0435\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f &#8212; \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0432\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0435\u0442\u0435\u0441\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u043d\u0430\u0447\u043d\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0432\u0440\u0435\u043c\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u0432\u0430\u043c \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e ~16ms, \u044d\u0442\u043e \u043e\u043a\u043d\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 2\u0445 \u043a\u0430\u0434\u0440\u043e\u0432 \u043f\u0440\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 60FPS. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u0434\u0438\u0441\u043f\u043b\u0435\u044f, \u0438 \u0442\u0430\u043a, \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0439 &#8212; \u0442\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u043a\u043d\u043e \u0440\u0430\u0432\u043d\u043e \u0443\u0436\u0435 ~11.11ms, \u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f 90FPS.<\/p>\n<h2>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>compute<\/code>  \u0434\u043b\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u042f\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u043b\u044f\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0435 OnePlus 7 Pro, \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c Snapdragon 855, \u0438 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 90Hz. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>flutter run --profile<\/code>. \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434).<\/p>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f JSON &#8212; \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 2273 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435. \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0430 1.12Mb. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c 5.6Mb JSON&#8217;\u0430 (\u043d\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 2273).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b7e\/8cc\/e76\/b7e8cce76a57eae9b9afb1ab8a64a2bf.png\" alt=\"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\" title=\"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\" width=\"2922\" height=\"996\"><figcaption>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0432\u0441\u0435 \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e \u0442\u0430\u043a\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c &#8212; \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u0430\u0434\u0440\u0430, \u0432\u0440\u0435\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \/ \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430. <\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0432\u044b\u0439: \u041f\u0430\u0447\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430<\/h2>\n<p>\u0415\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"dart\">Future&lt;void&gt; loadItemsOnMainThread() async {   _startFpsMeter();   isLoading = true;   notifyListeners();   List&lt;Item&gt; mainThreadItems;   for (int i = 0; i &lt; 10; i++) {     bench.startTimer('Load items in main thread');     mainThreadItems = await makeManyRequests(5);     final double diff = bench.endTimer('Load items in main thread');     requestDurations.add(diff);   }   items.clear();   items.addAll(mainThreadItems);   isLoading = false;   notifyListeners();   _stopFpsMeter();   requestDurations.clear(); } <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0435\u0439\u0442\u0435, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 &#8212; 14,036ms \/ 71.25FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.148ms \/ 89.70FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 &#8212; 100,332ms \/ 9.97FPS<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 &#8212; 226.894ms<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0442\u043e\u0440\u043e\u0439: Compute<\/h2>\n<pre><code class=\"dart\">Future&lt;void&gt; loadItemsWithComputed() async {   _startFpsMeter();   isLoading = true;   notifyListeners();   List&lt;Item&gt; computedItems;   \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f   \/\/\/ \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0447\u043a\u0430 \u0438\u0437 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e,   \/\/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430\u0441\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 compute   if (true) {     for (int i = 0; i &lt; 10; i++) {       bench.startTimer('Load items in computed');       computedItems = await compute&lt;dynamic, List&lt;Item&gt;&gt;(_loadItemsWithComputed, null);       final double diff = bench.endTimer('Load items in computed');       requestDurations.add(diff);     }     \/\/\/ \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 - \u0432\u0441\u0435 10 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e 5 \u0448\u0442\u0443\u043a \u0432 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 compute   } else {     bench.startTimer('Load items in computed');     computedItems = await compute&lt;dynamic, List&lt;Item&gt;&gt;(_loadAllItemsWithComputed, null);     final double diff = bench.endTimer('Load items in computed');     requestDurations.add(diff);   }   items.clear();   items.addAll(computedItems);   isLoading = false;   notifyListeners();   _stopFpsMeter();   requestDurations.clear(); }  Future&lt;List&lt;Item&gt;&gt; _loadItemsWithComputed([dynamic _]) async {   return makeManyRequests(5); }  Future&lt;List&lt;Item&gt;&gt; _loadAllItemsWithComputed([dynamic _]) async {   List&lt;Item&gt; items;   for (int i = 0; i &lt; 10; i++) {     items = await makeManyRequests(5);   }   return items; }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0432 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445: \u043a\u0430\u0436\u0434\u044b\u0435 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 10 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0432 \u0441\u0432\u043e\u0435\u043c compute:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.254ms \/ 88.86FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.152ms \/ 89.67FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 22.304ms \/ 44.84FPS<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 &#8212; 386.253ms<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u0432\u0441\u0435 10 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u043c compute:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.252ms \/ 88.87FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.152ms \/ 89.67FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 22.306ms \/ 44.83FPS<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0441\u0447\u0438\u0442\u0430\u043b\u043e\u0441\u044c, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 10 \u043f\u043e 5 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 compute, \u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 10) &#8212; 231.747ms<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0440\u0435\u0442\u0438\u0439: Isolate<\/h2>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435: \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0442\u0435\u0439\u0442\u0430 (\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f):<\/p>\n<ul>\n<li>\n<p>Frontend-\u0441\u0442\u0435\u0439\u0442 &#8212; \u043d\u0435\u043a\u0438\u0439 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Backend, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 UI, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043d \u0445\u0440\u0430\u043d\u0438\u0442 \u043b\u0435\u0433\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 UI. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>Backend-\u0441\u0442\u0435\u0439\u0442 &#8212; \u0442\u044f\u0436\u0435\u043b\u044b\u0439 \u0441\u0442\u0435\u0439\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0444\u0440\u043e\u043d\u0442\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442\u044b \u0444\u0440\u043e\u043d\u0442\u0443 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (\u0442\u0443\u0442, \u043a\u0430\u043a \u0432\u0430\u043c \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f).<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0434 \u0438\u0437 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0438\u0437\u043e\u043b\u044f\u0442\u043e\u043c. \u041c\u0435\u0442\u043e\u0434\u044b \u0444\u0440\u043e\u043d\u0442\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e Future&lt;void&gt; loadItemsWithIsolate() async {   \/\/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u0430\u0434\u0440\u043e\u0432 \u043f\u0435\u0440\u0435\u0434 \u0432\u0441\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439   _startFpsMeter();   isLoading = true;   notifyListeners();   \/\/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432   bench.startTimer('Load items in separate isolate');   \/\/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \"\u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u0443\u044e\" \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u0439\u0442\u0430, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u0443\u044e \u043d\u0430 \u0438\u0437\u043e\u043b\u044f\u0442\u0435   send(Events.startLoadingItems); }  \/\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f [Events.loadingItems] \u043f\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u0438\u0437\u043e\u043b\u044f\u0442\u0430 void _middleLoadingEvent() {   final double time = bench.endTimer('Load items in separate isolate');   requestDurations.add(time);   bench.startTimer('Load items in separate isolate'); }  \/\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f [Events.endLoadingItems] \u0438\u0437 \u0438\u0437\u043e\u043b\u044f\u0442\u0430 Future&lt;void&gt; _endLoadingEvents(List&lt;Item&gt; items) async {   this.items.clear();   \/\/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0435\u0439\u0442\u0435   this.items.addAll(items);   \/\/\/ \u0417\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432   final double time = bench.endTimer('Load items in separate isolate');   requestDurations.add(time);   isLoading = false;   notifyListeners();   \/\/\/ \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u0430\u0434\u0440\u043e\u0432   _stopFpsMeter();   requestDurations.clear(); }<\/code><\/pre>\n<p>\u0410 \u0442\u0443\u0442 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0431\u044d\u043a\u0430, \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u043d\u0430\u043c \u043b\u043e\u0433\u0438\u043a\u043e\u0439:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f [Events.startLoadingItems] Future&lt;void&gt; _loadingItems() async {   _items.clear();   for (int i = 0; i &lt; 10; i++) {     _items.addAll(await makeManyRequests(5));     if (i &lt; (10 - 1)) {       \/\/\/ \u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e - \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435       send(Events.loadingItems);     } else {       \/\/\/ \u0414\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0437 10\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 - \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438       send(Events.endLoadingItems, _items);     }   } }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.151ms \/ 89.68FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.151ms \/ 89.68FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.152ms \/ 89.67FPS<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0438\u0442\u043e\u0433\u0438<\/h2>\n<p>\u041f\u0440\u043e\u0432\u0435\u0434\u044f \u0442\u0440\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>Main Thread<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>Compute 1req in 1<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>Compute 10req in 1<\/p>\n<\/td>\n<td>\n<p>Isolate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>14.036ms<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>11.254ms<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>11.252ms<\/p>\n<\/td>\n<td>\n<p>11.151ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>11.148ms<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>11.152ms<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>11.152ms<\/p>\n<\/td>\n<td>\n<p>11.151ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>100.332ms<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>22.304ms<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>22.306ms<\/p>\n<\/td>\n<td>\n<p>11.152ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0447\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>226.894ms<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>386.253ms<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>231.747ms<\/p>\n<\/td>\n<td>\n<p>218.731ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 (\u0431\u043e\u043b\u044c\u0448\u0435 &#8212; \u0441\u043b\u043e\u0436\u043d\u0435\u0435)<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>1<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>2<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>3<\/p>\n<\/td>\n<td>\n<p>4<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u0434\u044f \u043f\u043e \u0434\u0430\u043d\u043d\u044b\u043c \u0446\u0438\u0444\u0440\u0430\u043c, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b:<\/p>\n<ul>\n<li>\n<p>Flutter \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 ~90FPS<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 &#8212; \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0430\u0433\u0438<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e<\/p>\n<\/li>\n<li>\n<p>Compute \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0441\u0442\u044c \u043b\u0430\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Compute \u043d\u0435\u0441\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f (\u0447\u0438\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043d\u0435\u0442 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0438 \u0442.\u0434.)<\/p>\n<\/li>\n<li>\n<p>Overhead \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 compute \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 ~150-160ms<\/p>\n<\/li>\n<li>\n<p>Isolate \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043b\u0430\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u043e\u0432 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0434\u043d\u0435\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u0435\u043d \u043f\u043e \u0432\u0441\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c.<\/p>\n<h2>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043d\u043e\u043c\u0435\u0440 \u0434\u0432\u0430: \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a<\/h2>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0432\u0432\u043e\u0434\u0438\u043c\u043e\u043c\u0443 \u0432 \u0438\u043d\u043f\u0443\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u0414\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c: \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0438\u043d\u043f\u0443\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e 3 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u0432 3 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438\u0437 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a, \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0441\u043f\u0438\u0441\u043a\u0430. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043e \u0432 10 \u0440\u0430\u0437 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 <strong>22730<\/strong> \u0448\u0442\u0443\u043a.<\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u043b\u0441\u044f \u0432 2\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445 &#8212; \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/pub.dev\/packages\/string_similarity\" rel=\"noopener noreferrer nofollow\">\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430<\/a> \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 &#8212; compute \/ isolate \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u043e\u0438\u0441\u043a. \u0422.\u0435. \u0441\u0445\u0435\u043c\u0430 \u0442\u0430\u043a\u0430\u044f &#8212; \u0432\u0432\u0435\u0434\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u0438\u043d\u043f\u0443\u0442, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a, \u043f\u043e\u043a\u0430 \u043e\u043d \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f &#8212; \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f UI, \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u0438\u043d\u043f\u0443\u0442 \u043d\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b, \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u042d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b &#171;\u043a\u043e\u043f\u0438\u043c&#187; \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441, \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043e\u043d\u0438 \u0432\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c.<\/p>\n<p>\u0417\u0430\u043c\u0435\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043f\u043e\u0438\u0441\u043a, \u0442.\u0435. \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435, \u043d\u0435 \u0432\u043b\u0438\u044f\u043b\u0438 \u043d\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043f\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \/\/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u0430\u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0440\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 void cacheItems() {   _notFilteredItems.clear();   final List&lt;Item&gt; multipliedItems = [];   for (int i = 0; i &lt; 10; i++) {     multipliedItems.addAll(items);   }   _notFilteredItems.addAll(multipliedItems); }<\/code><\/pre>\n<pre><code class=\"dart\">\/\/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0430\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \/\/\/ \u043f\u043e \u0432\u0432\u043e\u0434\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u043f\u0443\u0442 Future&lt;void&gt; _testSearch() async {   List&lt;String&gt; words = items.map((Item item) =&gt; item.profile.replaceAll('https:\/\/opencollective.com\/', '')).toSet().toList();   words = words     .map((String word) {       final String newWord = word.substring(0, min(word.length, 3));       return newWord;     })     .toSet()     .take(3)     .toList();    \/\/\/ \u0421\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u0430\u0434\u0440\u043e\u0432   _startFpsMeter();   for (String word in words) {     final List&lt;String&gt; letters = word.split('');     String search = '';     for (String letter in letters) {       search += letter;       await _setWord(search);     }     while (search.isNotEmpty) {       search = search.substring(0, search.length - 1);       await _setWord(search);     }   }   \/\/\/ \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a   _stopFpsMeter(); }<\/code><\/pre>\n<pre><code class=\"dart\">\/\/\/ \u0412\u0432\u043e\u0434\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \/\/\/ \u0432 800\u043c\u0441, \u043d\u043e \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \/\/\/ \u0444\u0438\u043b\u044c\u0442\u0440\u0430 (computed \/ isolate) \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0438, \/\/\/ \u0442\u043e \u0436\u0434\u0435\u043c \u0438\u0445 Future&lt;void&gt; _setWord(String word) async {   if (!canPlaceNextLetter) {     await wait(800);     await _setWord(word);   } else {     searchController.value = TextEditingValue(text: word);     await wait(800);   } }<\/code><\/pre>\n<pre><code class=\"dart\">\/\/\/ \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430 [USE_SIMILARITY] \/\/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043d\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0441\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c\u044e \u0441\u0442\u0440\u043e\u043a List&lt;Item&gt; filterItems(Packet2&lt;List&lt;Item&gt;, String&gt; itemsAndInputValue) {   return itemsAndInputValue.value.where((Item item) {     return item.profile.contains(itemsAndInputValue.value2) || (USE_SIMILARITY &amp;&amp; isStringsSimilar(item.profile, itemsAndInputValue.value2));   }).toList(); }  bool isStringsSimilar(String first, String second) {   return max(StringSimilarity.compareTwoStrings(first, second), StringSimilarity.compareTwoStrings(second, first)) &gt;= 0.3); }<\/code><\/pre>\n<h2>\u041f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435<\/h2>\n<pre><code class=\"dart\">Future&lt;void&gt; runSearchOnMainThread() async {   cacheItems();   isLoading = true;   notifyListeners();   searchController.addListener(_searchOnMainThread);   await _testSearch();   searchController.removeListener(_searchOnMainThread);   isLoading = false;   notifyListeners(); }  void _searchOnMainThread() {   final String searchValue = searchController.text;   if (searchValue.isEmpty &amp;&amp; items.length != _notFilteredItems.length) {     items.clear();     items.addAll(_notFilteredItems);     notifyListeners();     return;   }   items.clear();   \/\/\/ Packet2 - \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439   items.addAll(filterItems(Packet2(_notFilteredItems, searchValue)));   notifyListeners(); }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0438\u0441\u043a:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 21.588ms \/ 46.32FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.154ms \/ 89.65FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 668,986ms \/ 1.50FPS<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0438\u0441\u043a \u0441\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c\u044e:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 43,123ms \/ 23.19FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11,152ms \/ 89.67FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 2&nbsp;440,910ms \/ 0.41FPS<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u0438\u0441\u043a \u0447\u0435\u0440\u0435\u0437 Compute<\/h2>\n<pre><code class=\"dart\">Future&lt;void&gt; runSearchWithCompute() async {   cacheItems();   isLoading = true;   notifyListeners();   searchController.addListener(_searchWithCompute);   await _testSearch();   searchController.removeListener(_searchWithCompute);   isLoading = false;   notifyListeners(); }  Future&lt;void&gt; _searchWithCompute() async {   canPlaceNextLetter = false;   \/\/\/ \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438   \/\/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c   \/\/\/ \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f   isSearching = true;   notifyListeners();   final String searchValue = searchController.text;   if (searchValue.isEmpty &amp;&amp; items.length != _notFilteredItems.length) {     items.clear();     items.addAll(_notFilteredItems);     isSearching = false;     notifyListeners();     await wait(800);     canPlaceNextLetter = true;     return;   }   final List&lt;Item&gt; filteredItems = await compute(filterItems, Packet2(_notFilteredItems, searchValue));   \/\/\/ \u041f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b   isSearching = false;   notifyListeners();   await wait(800);   items.clear();   items.addAll(filteredItems);   notifyListeners();   canPlaceNextLetter = true; }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0438\u0441\u043a:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 12,682ms \/ 78.85FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11,154ms \/ 89.65FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 111,544ms \/ 8.97FPS<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0438\u0441\u043a \u0441\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c\u044e:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 12,515ms \/ 79.90FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11,153ms \/ 89.66FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 111,527ms \/ 8.97FPS<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u0438\u0441\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Isolate<\/h2>\n<\/p>\n<p><s>\u041d\u0435<\/s>\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432 \u0438\u0437\u043e\u043b\u044f\u0442\u0435 Future&lt;void&gt; runSearchInIsolate() async {   send(Events.cacheItems); }  void _middleLoadingEvent() {   final double time = bench.endTimer('Load items in separate isolate');   requestDurations.add(time);   bench.startTimer('Load items in separate isolate'); }  \/\/\/ \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 [Events.cacheItems], \/\/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0438\u0437 \u0438\u0437\u043e\u043b\u044f\u0442\u0430 Future&lt;void&gt; _startSearchOnIsolate() async {   isLoading = true;   notifyListeners();   searchController.addListener(_searchInIsolate);   await _testSearch();   searchController.removeListener(_searchInIsolate);   isLoading = false;   notifyListeners(); }  \/\/\/ \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u043f\u0443\u0442\u0430 \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0438\u0437\u043e\u043b\u044f\u0442 void _searchInIsolate() {   canPlaceNextLetter = false;   isSearching = true;   notifyListeners();   send(Events.startSearch, searchController.text); }  \/\/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0438\u0437\u043e\u043b\u044f\u0442\u0430 Future&lt;void&gt; _setFilteredItems(List&lt;Item&gt; filteredItems) async {   isSearching = false;   notifyListeners();   await wait(800);   items.clear();   items.addAll(filteredItems);   notifyListeners();   canPlaceNextLetter = true; }  Future&lt;void&gt; _endLoadingEvents(List&lt;Item&gt; items) async {   this.items.clear();   this.items.addAll(items);   final double time = bench.endTimer('Load items in separate isolate');   requestDurations.add(time);   await wait(800);   isLoading = false;   notifyListeners();   _stopFpsMeter();   print('Load items in isolate -&gt;' + requestDurations.join(' ').replaceAll('.', ','));   requestDurations.clear(); }<\/code><\/pre>\n<p>\u0410 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u0431\u044d\u043a\u0435\u043d\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f [Events.cacheItems] void _cacheItems() {   _notFilteredItems.clear();   final List&lt;Item&gt; multipliedItems = [];   for (int i = 0; i &lt; 10; i++) {     multipliedItems.addAll(_items);   }   _notFilteredItems.addAll(multipliedItems);   send(Events.cacheItems); }  \/\/\/ \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 [Events.startSearch] \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \/\/\/ \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u043e\u0442\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432 \u043b\u0435\u0433\u043a\u0438\u0439 \u0441\u0442\u0435\u0439\u0442 void _filterItems(String searchValue) {   if (searchValue.isEmpty) {     _items.clear();     _items.addAll(_notFilteredItems);     send(ThirdEvents.setFilteredItems, _items);     return;   }   final List&lt;Item&gt; filteredItems = filterItems(Packet2(_notFilteredItems, searchValue));   _items.clear();   _items.addAll(filteredItems);   send(Events.setFilteredItems, _items); }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0438\u0441\u043a:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11,354ms \/ 88.08FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11,153ms \/ 89.66FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 33,455ms \/ 29.89FPS<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0438\u0441\u043a \u0441\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c\u044e:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11,353ms \/ 88.08FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11,153ms \/ 89.66FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 33,459ms \/ 29.89FPS<\/p>\n<\/li>\n<\/ul>\n<h2>\u0415\u0449\u0435 \u043e\u0434\u043d\u0438 \u0432\u044b\u0432\u043e\u0434\u044b<\/h2>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<\/td>\n<td data-colwidth=\"159\" width=\"159\">\n<p>Main Thread<\/p>\n<\/td>\n<td data-colwidth=\"227\" width=\"227\">\n<p>Compute<\/p>\n<\/td>\n<td>\n<p>Isolate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"159\" width=\"159\">\n<p>21.588ms<\/p>\n<\/td>\n<td data-colwidth=\"227\" width=\"227\">\n<p>12.682ms<\/p>\n<\/td>\n<td>\n<p>11.354ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"159\" width=\"159\">\n<p>668.986ms<\/p>\n<\/td>\n<td data-colwidth=\"227\" width=\"227\">\n<p>111.544ms<\/p>\n<\/td>\n<td>\n<p>33.455ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 (\u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c)<\/p>\n<\/td>\n<td data-colwidth=\"159\" width=\"159\">\n<p>43.123ms<\/p>\n<\/td>\n<td data-colwidth=\"227\" width=\"227\">\n<p>12.515ms<\/p>\n<\/td>\n<td>\n<p>11.353ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 (\u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c)<\/p>\n<\/td>\n<td data-colwidth=\"159\" width=\"159\">\n<p>2&nbsp;440.910ms<\/p>\n<\/td>\n<td data-colwidth=\"227\" width=\"227\">\n<p>111.527ms<\/p>\n<\/td>\n<td>\n<p>33.459ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 (\u0431\u043e\u043b\u044c\u0448\u0435 &#8212; \u0441\u043b\u043e\u0436\u043d\u0435\u0435)<\/p>\n<\/td>\n<td data-colwidth=\"159\" width=\"159\">\n<p>1<\/p>\n<\/td>\n<td data-colwidth=\"227\" width=\"227\">\n<p>2<\/p>\n<\/td>\n<td>\n<p>3<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 &gt; 16ms (\u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c, \u0445\u043e\u0442\u044f \u0431\u044b, 60FPS)<\/p>\n<\/li>\n<li>\n<p>Compute \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u044b\u0445 \u0438 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 overhead \u0432 \u0442\u0435 \u0436\u0435 150ms, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u043e\u043c (\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438, \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 &#8212; \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u043e\u043b\u044f\u0442, \u0447\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432)<\/p>\n<\/li>\n<li>\n<p>Isolate &#8212; \u0441\u0430\u043c\u044b\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Flutter<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u0436\u0435, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u0437\u043e\u043b\u044f\u0442\u044b &#8212; \u044d\u0442\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0438 \u0434\u0430\u0436\u0435 Google \u0441\u043e\u0432\u0435\u0442\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (<em>\u044d\u0442\u043e \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0446\u0430, \u043f\u0440\u0443\u0444\u043e\u0432 \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b <\/em>?). \u041d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435 &#8212; \u044d\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u044b\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0431\u0435\u0437 \u043d\u0435\u0435 &#8212; \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e, \u043d\u0430\u043c\u043d\u043e\u043e\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c &#8212; \u043f\u043e\u0441\u043b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0440\u043e\u043d\u0442\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043f\u043e\u0440\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u044d\u0442\u043e \u043e\u0442\u043d\u0438\u043c\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0430 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435. <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043d\u0430\u043b\u0430 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0438\u0437\u043e\u043b\u044f\u0442\u0430\u043c\u0438. \u0414\u043b\u044f \u0435\u0435 \u043e\u0446\u0435\u043d\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0442\u0430\u043a\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439:<\/p>\n<pre><code class=\"dart\">class Item {   const Item(     this.id,     this.createdAt,     this.profile,     this.imageUrl,   );    final int id;   final DateTime createdAt;   final String profile;   final String imageUrl; }<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 &#8212; \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 5000 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 UI, \u0442.\u0435. \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043d\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f. \u0411\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e 1 000 000 \u0442\u0430\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u0447\u043a\u0430\u043c\u0438 \u043f\u043e 5 000 \u0448\u0442\u0443\u043a \u0437\u0430 \u0440\u0430\u0437 \u0441 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u0443\u0437\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u043f\u0430\u0447\u0435\u043a \u0432 8ms, \u0447\u0435\u0440\u0435\u0437 <code>Future&lt;void&gt;.delayed<\/code> , \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u043d\u0435 \u043e\u043f\u0443\u0441\u043a\u0430\u043b\u0430\u0441\u044c \u043d\u0438\u0436\u0435 80FPS. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u0435\u043b\u0430\u043b \u044f \u044d\u0442\u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0441\u0443\u0445\u0438\u0445 \u0446\u0438\u0444\u0440 \u043d\u0435\u0442 (\u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 &#8212; \u0442\u043e \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f).<\/p>\n<\/p>\n<p>\u041c\u043d\u043e\u0433\u0438\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0438\u0437\u043e\u043b\u044f\u0442\u0430\u043c\u0438, \u0438 \u043b\u044e\u0434\u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 <code>compute<\/code> . \u0422\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 API \u043a \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0435 <code>compute<\/code>, \u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"dart\">\/\/\/ Frontend part Future&lt;void&gt; decrement([int diff = 1]) async {   counter = await runBackendMethod&lt;int, int&gt;(Events.decrement, diff); }  \/\/\/ -----  \/\/\/ Backend part Future&lt;int&gt; _decrement(int diff) async {   counter -= diff;   return counter; }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043f\u043e ID, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 ID &#8212; \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0433\u0435\u0442\u0442\u0435\u0440\u0430\u0445:<\/p>\n<pre><code class=\"dart\">\/\/\/ Frontend part \/\/\/ \u0414\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437 \u0438\u0437\u043e\u043b\u044f\u0442\u0430 @override Map&lt;Events, Function&gt; get tasks =&gt; {   Events.increment: _setCounter,   Events.decrement: _setCounter,   Events.error: _setCounter, };  \/\/\/ -----  \/\/\/ Backend part \/\/\/ \u0410 \u0434\u0430\u043d\u043d\u044b\u0439 - \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 @override Map&lt;Events, Function&gt; get operations =&gt; {   Events.increment: _increment,   Events.decrement: _decrement, };<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:<\/p>\n<p><strong>1<\/strong> <em>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435<\/em> \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u044f\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/p>\n<p>1.1 Frontend-\u0441\u0442\u0435\u0439\u0442 (\u0442\u043e\u0442, \u0447\u0442\u043e \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0437\u0430\u043c\u0438\u043a\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441 <code>BackendMixin&lt;EventType&gt;<\/code> ) \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 Backend-\u0441\u0442\u0435\u0439\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 <code>send<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 ID \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442.<\/p>\n<pre><code class=\"dart\">enum Events {   increment, }  class FirstState with BackendMixin&lt;Events&gt; {   int counter = 0;    void increment([int diff = 1]) {     send(Events.increment, diff);   }    void _setCounter(int value) {     counter = value;     notifyListeners();   }    @override   Map&lt;Events, Function&gt; get tasks =&gt; {     Events.increment: _setCounter,   }; }<\/code><\/pre>\n<p>1.2 \u042d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u044d\u043a\u0435\u043d\u0434 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043c<\/p>\n<pre><code class=\"dart\">class FirstBackend extends Backend&lt;Events&gt; {   FirstBackend(SendPort toFrontend) : super(toFrontend);    int counter = 0;    void _increment(int diff) {     counter += diff;     send(Events.increment, counter);   }    @override   Map&lt;Events, Function&gt; get operations =&gt; {     Events.increment: _increment,   }; }<\/code><\/pre>\n<p>1.3 Backend-\u0441\u0442\u0435\u0439\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u0433\u043e\u0442\u043e\u0432\u043e! \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &#8212; \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0431\u044d\u043a\u0435\u043d\u0434\u0430 (<code>return<\/code>) (\u0442\u043e\u0433\u0434\u0430 \u043e\u0442\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0441 \u0442\u0435\u043c \u0436\u0435 ID \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0438 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d), \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u044f\u0432\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>send<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u043a\u0430\u043a\u0438\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043b\u044e\u0431\u044b\u043c\u0438, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u0430\u043c\u0438 ID. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438\u043c ID \u0431\u044b\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u044b-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e, \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fa8\/cb4\/d34\/fa8cb4d343d4d72a24648469d52bd0d0.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f Frontend - Backend \u0441\u0442\u0435\u0439\u0442\u043e\u0432\" title=\"\u0421\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f Frontend - Backend \u0441\u0442\u0435\u0439\u0442\u043e\u0432\" width=\"1914\" height=\"1724\"><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f Frontend &#8212; Backend \u0441\u0442\u0435\u0439\u0442\u043e\u0432<\/figcaption><\/figure>\n<p>\u0416\u0435\u043b\u0442\u0430\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430 &#8212; \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438-\u043b\u0438\u0431\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0438\u0437 \u0432\u043d\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u043d\u0435\u043a\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. \u0410 \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u0430\u044f, \u0438\u0434\u0443\u0449\u0430\u044f \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043a \u0431\u044d\u043a\u0443 &#8212; \u044d\u0442\u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#8212; WebSocket.<\/p>\n<p><strong>2<\/strong> <em>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435<\/em> \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043f\u043e \u0435\u0435 ID<\/p>\n<p>2.1 Frontend \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>runBackendMethod<\/code> , \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f ID, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0431\u044d\u043a\u0430, \u0435\u043c\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u043e\u0442\u0432\u0435\u0442 \u0442\u0443\u0442 \u0436\u0435. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0430\u0436\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0437\u0430\u0434\u0430\u0447 (<code>tasks<\/code>) \u0432\u0430\u0448\u0435\u0433\u043e \u0444\u0440\u043e\u043d\u0442\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 onBackendResponse \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0440\u043e\u043d\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0430\u0448\u0438\u043c \u0444\u0440\u043e\u043d\u0442-\u0441\u0442\u0435\u0439\u0442\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0442 \u0431\u044d\u043a\u0430.<\/p>\n<pre><code class=\"dart\">enum Events {   decrement, }  class FirstState with ChangeNotifier, BackendMixin&lt;Events&gt; {   int counter = 0;    Future&lt;void&gt; decrement([int diff = 1]) async {     counter = await runBackendMethod&lt;int, int&gt;(Events.decrement, diff);   }    \/\/\/ Automatically notification after any event from backend   @override   void onBackendResponse() {     notifyListeners();   } }<\/code><\/pre>\n<p>2.2 Backend-\u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 &#8212; \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u044d\u043a\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 &#171;\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e&#187;, \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>send<\/code>, \u0441 \u0442\u0435\u043c \u0436\u0435 ID, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u0442\u043e\u0434 <code>_decrement<\/code> \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>send(Events.decrement)<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043e\u0436\u0435\u0442.<\/p>\n<pre><code class=\"dart\">class FirstBackend extends Backend&lt;Events&gt; {   FirstBackend(SendPort toFrontend) : super(toFrontend);    int counter = 0;    \/\/\/ Or, you can simply return a value   Future&lt;int&gt; _decrement(int diff) async {     counter -= diff;     return counter;   }    @override   Map&lt;Events, Function&gt; get operations =&gt; {     Events.decrement: _decrement,   }; }<\/code><\/pre>\n<p>\u0421\u0445\u0435\u043c\u0430 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439, \u0437\u0430 \u0442\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u0432\u043e \u0444\u0440\u043e\u043d\u0442\u0435 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0445 \u0441 \u0431\u044d\u043a\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fde\/d86\/fa7\/fded86fa740396ea94dd9845cd3fa0e1.png\" width=\"1870\" height=\"1714\"><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0431\u044b \u0435\u0449\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c&#8230;<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0432\u044f\u0437\u043a\u0443 &#8212; \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u044d\u0442\u0438 \u0431\u044d\u043a\u0435\u043d\u0434\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 <code>BackendMixin&lt;EventType&gt;<\/code> \u0437\u0430\u043b\u043e\u0436\u0435\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u044d\u043a\u0430 &#8212; \u043c\u0435\u0442\u043e\u0434 <code>initBackend<\/code>. \u0412 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0431\u044d\u043a\u0435\u043d\u0434\u0430. \u042d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u0442\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (<em>top-level<\/em>, \u043a\u0430\u043a \u0433\u043b\u0430\u0441\u0438\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Flutter), \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430. \u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u043b\u044f\u0442\u0430 ~200ms.<\/p>\n<pre><code class=\"dart\">enum Events {   increment,   decrement, }  class FirstState with ChangeNotifier, BackendMixin&lt;Events&gt; {   int counter = 0;    void increment([int diff = 1]) {     send(Events.increment, diff);   }    Future&lt;void&gt; decrement([int diff = 1]) async {     counter = await runBackendMethod&lt;int, int&gt;(Events.decrement, diff);   }    void _setCounter(int value) {     counter = value;   }    Future&lt;void&gt; initState() async {     await initBackend(createFirstBackend);   }    \/\/\/ Automatically notification after any event from backend   @override   void onBackendResponse() {     notifyListeners();   }    @override   Map&lt;Events, Function&gt; get tasks =&gt; {     Events.increment: _setCounter,   }; }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f Backend-\u0447\u0430\u0441\u0442\u0438:<\/p>\n<pre><code class=\"dart\">typedef Creator&lt;TDataType&gt; = void Function(BackendArgument&lt;TDataType&gt; argument);  void createFirstBackend(BackendArgument&lt;void&gt; argument) {   FirstBackend(argument.toFrontend); }  @protected Future&lt;void&gt; initBackend&lt;TDataType extends Object&gt;(Creator&lt;TDataType&gt; creator, {TDataType data, ErrorHandler errorHandler}) async { \t\/\/\/ ... }<\/code><\/pre>\n<h2>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f<\/h2>\n<ul>\n<li>\n<p>\u0412\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e <a href=\"https:\/\/api.flutter.dev\/flutter\/dart-isolate\/Isolate-class.html\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u043e\u043b\u044f\u0442\u0430<\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f &#171;\u0431\u044d\u043a\u0435\u043d\u0434\u0430&#187; \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439 \u0438\u0437\u043e\u043b\u044f\u0442 \u0438 \u043f\u0440\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 &#8212; \u0432\u0440\u0435\u043c\u044f \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u0445, \u0441\u043a\u0430\u0436\u0435\u043c, \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e 30 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 &#8212; \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0432 <code>--release<\/code> \u0440\u0435\u0436\u0438\u043c\u0435 \u0437\u0430\u043d\u044f\u043b\u043e 6 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432 \u0438\u0437\u043e\u043b\u044f\u0442\u0430\u0445 (\u0431\u044d\u043a\u0435\u043d\u0434\u0430\u0445). \u0422\u0443\u0442, \u0435\u0441\u043b\u0438 \u0432\u0430\u0441 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>initBackend<\/code> \u0438\u0437 <code>BackendMixin<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435, \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435<\/p>\n<\/li>\n<\/ul>\n<h2>\u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u0432\u0430\u043c <strong>\u043d\u0435 \u043d\u0443\u0436\u043d\u043e<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u043b\u044f\u0442\u044b (\u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430), \u0435\u0441\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <code>compute<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u0430\u043c \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0438\u0437\u043e\u043b\u044f\u0442\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u0426\u0438\u043a\u043b \u0436\u0438\u0437\u043d\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439, \u0447\u0442\u043e \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0435\u0433\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 <a href=\"https:\/\/pub.dev\/packages\/isolator\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u043a\u0435\u0442<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442 \u0432\u0430\u0448\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0438\u0437\u043e\u043b\u044f\u0442\u0430\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0438\u0434\u0435\u043e \u0432\u0441\u0435\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\"><iframe id=\"5fdbc7072cbf1a1445b3539b\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc7072cbf1a1445b3539b\" class=\"embed_video embed__content\"><\/iframe><iframe id=\"5fdbc727d4323713fd415944\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc727d4323713fd415944\" class=\"embed_video embed__content\"><\/iframe><iframe id=\"5fdbc739102304e11bb8d68b\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc739102304e11bb8d68b\" class=\"embed_video embed__content\"><\/iframe><iframe id=\"5fdbc79bcb79a1e12d66649d\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc79bcb79a1e12d66649d\" class=\"embed_video embed__content\"><\/iframe><iframe id=\"5fdbc7b53b295d140fdb3923\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc7b53b295d140fdb3923\" class=\"embed_video embed__content\"><\/iframe><iframe id=\"5fdbc7c93b295d140fdb3924\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc7c93b295d140fdb3924\" class=\"embed_video embed__content\"><\/iframe><iframe id=\"5fdbc7df05d782142ffea53b\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc7df05d782142ffea53b\" class=\"embed_video embed__content\"><\/iframe><iframe id=\"5fdbc7f5fd7c16e10ee4a85e\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc7f5fd7c16e10ee4a85e\" class=\"embed_video embed__content\"><\/iframe><iframe id=\"5fdbc80dcb79a1e12d66649e\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5fdbc80dcb79a1e12d66649e\" class=\"embed_video embed__content\"><\/iframe><\/p>\n<\/div>\n<\/details>\n<\/div>\n<p> \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\/post\/532862\/\"> https:\/\/habr.com\/ru\/post\/532862\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e Flutter \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 WebSocket, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0432\u0440\u043e\u0434\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430) \u0432\u0441\u0435 \u044d\u0442\u043e, <em>\u043e\u0431\u044b\u0447\u043d\u043e<\/em>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435. \u041c\u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u043f\u0430\u043a\u0435\u0442, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0438\u0437\u043e\u043b\u044f\u0442\u044b, \u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0438 <a href=\"https:\/\/pub.dev\/packages\/isolator\" rel=\"noopener noreferrer nofollow\">\u0434\u0440\u0443\u0433\u043e\u0439<\/a> (<em>\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u0439<\/em>). \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u0441 \u043d\u0438\u043c \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0431\u0443\u0434\u0443 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c\u0438 &#8212; <strong>\u0438\u0437\u043e\u043b\u044f\u0442<\/strong> \u0438 <strong>\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a.<\/strong> \u041e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0431\u044b\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u0430\u0432\u0442\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u043d, \u043d\u043e \u043f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a &#8212; \u0442\u043e\u0436\u0435 \u0438\u0437\u043e\u043b\u044f\u0442. \u0422\u0430\u043a\u0436\u0435 \u0442\u0443\u0442 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0437\u0430\u0442\u044c \u0441\u043b\u0443\u0445 (\u0438\u043b\u0438 \u0433\u043b\u0430\u0437\u0430) \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0443\u0442\u043a\u0438\u043c \u043d\u0430\u0442\u0443\u0440\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u043e\u0448\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0432\u043e\u0438 \u0438\u0437\u0432\u0438\u043d\u0435\u043d\u0438\u044f &#8212; \u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435. \u0412\u0441\u0435 \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c <em>\u043a\u0443\u0440\u0441\u0438\u0432\u043e\u043c<\/em>. \u0422\u0430\u043a\u0436\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <em>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438<\/em> &#8212; \u044f \u0431\u0443\u0434\u0443 \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434. \u0410 <em>\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438<\/em> &#8212; \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0432\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0435\u0433\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0418\u0437\u043e\u043b\u044f\u0442\u044b \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a\u043e\u0433\u0434\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442 \u0435\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f &#8212; \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0432\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0435\u0442\u0435\u0441\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u043d\u0430\u0447\u043d\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0432\u0440\u0435\u043c\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u0432\u0430\u043c \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e ~16ms, \u044d\u0442\u043e \u043e\u043a\u043d\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 2\u0445 \u043a\u0430\u0434\u0440\u043e\u0432 \u043f\u0440\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 60FPS. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043e\u0432 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u0434\u0438\u0441\u043f\u043b\u0435\u044f, \u0438 \u0442\u0430\u043a, \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0439 &#8212; \u0442\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u043a\u043d\u043e \u0440\u0430\u0432\u043d\u043e \u0443\u0436\u0435 ~11.11ms, \u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f 90FPS.<\/p>\n<h2>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>compute<\/code>  \u0434\u043b\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u042f\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u043b\u044f\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0435 OnePlus 7 Pro, \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c Snapdragon 855, \u0438 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 90Hz. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>flutter run --profile<\/code>. \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 10 \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434).<\/p>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f JSON &#8212; \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 2273 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435. \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0430 1.12Mb. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c 5.6Mb JSON&#8217;\u0430 (\u043d\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 2273).<\/p>\n<figure class=\"full-width\"><figcaption>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0432\u0441\u0435 \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e \u0442\u0430\u043a\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c &#8212; \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u0430\u0434\u0440\u0430, \u0432\u0440\u0435\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \/ \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430. <\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0432\u044b\u0439: \u041f\u0430\u0447\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430<\/h2>\n<p>\u0415\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"dart\">Future&lt;void&gt; loadItemsOnMainThread() async {   _startFpsMeter();   isLoading = true;   notifyListeners();   List&lt;Item&gt; mainThreadItems;   for (int i = 0; i &lt; 10; i++) {     bench.startTimer('Load items in main thread');     mainThreadItems = await makeManyRequests(5);     final double diff = bench.endTimer('Load items in main thread');     requestDurations.add(diff);   }   items.clear();   items.addAll(mainThreadItems);   isLoading = false;   notifyListeners();   _stopFpsMeter();   requestDurations.clear(); } <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0435\u0439\u0442\u0435, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 &#8212; 14,036ms \/ 71.25FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.148ms \/ 89.70FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 &#8212; 100,332ms \/ 9.97FPS<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 &#8212; 226.894ms<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0442\u043e\u0440\u043e\u0439: Compute<\/h2>\n<pre><code class=\"dart\">Future&lt;void&gt; loadItemsWithComputed() async {   _startFpsMeter();   isLoading = true;   notifyListeners();   List&lt;Item&gt; computedItems;   \/\/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f   \/\/\/ \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0447\u043a\u0430 \u0438\u0437 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e,   \/\/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430\u0441\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 compute   if (true) {     for (int i = 0; i &lt; 10; i++) {       bench.startTimer('Load items in computed');       computedItems = await compute&lt;dynamic, List&lt;Item&gt;&gt;(_loadItemsWithComputed, null);       final double diff = bench.endTimer('Load items in computed');       requestDurations.add(diff);     }     \/\/\/ \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 - \u0432\u0441\u0435 10 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e 5 \u0448\u0442\u0443\u043a \u0432 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 compute   } else {     bench.startTimer('Load items in computed');     computedItems = await compute&lt;dynamic, List&lt;Item&gt;&gt;(_loadAllItemsWithComputed, null);     final double diff = bench.endTimer('Load items in computed');     requestDurations.add(diff);   }   items.clear();   items.addAll(computedItems);   isLoading = false;   notifyListeners();   _stopFpsMeter();   requestDurations.clear(); }  Future&lt;List&lt;Item&gt;&gt; _loadItemsWithComputed([dynamic _]) async {   return makeManyRequests(5); }  Future&lt;List&lt;Item&gt;&gt; _loadAllItemsWithComputed([dynamic _]) async {   List&lt;Item&gt; items;   for (int i = 0; i &lt; 10; i++) {     items = await makeManyRequests(5);   }   return items; }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0432 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445: \u043a\u0430\u0436\u0434\u044b\u0435 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 10 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0432 \u0441\u0432\u043e\u0435\u043c compute:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.254ms \/ 88.86FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.152ms \/ 89.67FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 22.304ms \/ 44.84FPS<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 &#8212; 386.253ms<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u0432\u0441\u0435 10 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u043c compute:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.252ms \/ 88.87FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.152ms \/ 89.67FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 22.306ms \/ 44.83FPS<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f 5 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0441\u0447\u0438\u0442\u0430\u043b\u043e\u0441\u044c, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 10 \u043f\u043e 5 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 compute, \u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 10) &#8212; 231.747ms<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0440\u0435\u0442\u0438\u0439: Isolate<\/h2>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435: \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u0442\u0435\u0439\u0442\u0430 (\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f):<\/p>\n<ul>\n<li>\n<p>Frontend-\u0441\u0442\u0435\u0439\u0442 &#8212; \u043d\u0435\u043a\u0438\u0439 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Backend, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 UI, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043d \u0445\u0440\u0430\u043d\u0438\u0442 \u043b\u0435\u0433\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 UI. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>Backend-\u0441\u0442\u0435\u0439\u0442 &#8212; \u0442\u044f\u0436\u0435\u043b\u044b\u0439 \u0441\u0442\u0435\u0439\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0444\u0440\u043e\u043d\u0442\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442\u044b \u0444\u0440\u043e\u043d\u0442\u0443 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u0435. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (\u0442\u0443\u0442, \u043a\u0430\u043a \u0432\u0430\u043c \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f).<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0434 \u0438\u0437 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0438\u0437\u043e\u043b\u044f\u0442\u043e\u043c. \u041c\u0435\u0442\u043e\u0434\u044b \u0444\u0440\u043e\u043d\u0442\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e Future&lt;void&gt; loadItemsWithIsolate() async {   \/\/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u0430\u0434\u0440\u043e\u0432 \u043f\u0435\u0440\u0435\u0434 \u0432\u0441\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439   _startFpsMeter();   isLoading = true;   notifyListeners();   \/\/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432   bench.startTimer('Load items in separate isolate');   \/\/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \"\u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u0443\u044e\" \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u0439\u0442\u0430, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u0443\u044e \u043d\u0430 \u0438\u0437\u043e\u043b\u044f\u0442\u0435   send(Events.startLoadingItems); }  \/\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f [Events.loadingItems] \u043f\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u0438\u0437\u043e\u043b\u044f\u0442\u0430 void _middleLoadingEvent() {   final double time = bench.endTimer('Load items in separate isolate');   requestDurations.add(time);   bench.startTimer('Load items in separate isolate'); }  \/\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f [Events.endLoadingItems] \u0438\u0437 \u0438\u0437\u043e\u043b\u044f\u0442\u0430 Future&lt;void&gt; _endLoadingEvents(List&lt;Item&gt; items) async {   this.items.clear();   \/\/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0435\u0439\u0442\u0435   this.items.addAll(items);   \/\/\/ \u0417\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432   final double time = bench.endTimer('Load items in separate isolate');   requestDurations.add(time);   isLoading = false;   notifyListeners();   \/\/\/ \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u0430\u0434\u0440\u043e\u0432   _stopFpsMeter();   requestDurations.clear(); }<\/code><\/pre>\n<p>\u0410 \u0442\u0443\u0442 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0431\u044d\u043a\u0430, \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u043d\u0430\u043c \u043b\u043e\u0433\u0438\u043a\u043e\u0439:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f [Events.startLoadingItems] Future&lt;void&gt; _loadingItems() async {   _items.clear();   for (int i = 0; i &lt; 10; i++) {     _items.addAll(await makeManyRequests(5));     if (i &lt; (10 - 1)) {       \/\/\/ \u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e - \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435       send(Events.loadingItems);     } else {       \/\/\/ \u0414\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0437 10\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 - \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438       send(Events.endLoadingItems, _items);     }   } }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.151ms \/ 89.68FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.151ms \/ 89.68FPS<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430 &#8212; 11.152ms \/ 89.67FPS<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0438\u0442\u043e\u0433\u0438<\/h2>\n<p>\u041f\u0440\u043e\u0432\u0435\u0434\u044f \u0442\u0440\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>Main Thread<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>Compute 1req in 1<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>Compute 10req in 1<\/p>\n<\/td>\n<td>\n<p>Isolate<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>14.036ms<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>11.254ms<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>11.252ms<\/p>\n<\/td>\n<td>\n<p>11.151ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u041c\u0435\u0434\u0438\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>11.148ms<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>11.152ms<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>11.152ms<\/p>\n<\/td>\n<td>\n<p>11.151ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0434\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>100.332ms<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>22.304ms<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>22.306ms<\/p>\n<\/td>\n<td>\n<p>11.152ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0447\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>226.894ms<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>386.253ms<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>231.747ms<\/p>\n<\/td>\n<td>\n<p>218.731ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"268\" width=\"268\">\n<p>\u0421\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 (\u0431\u043e\u043b\u044c\u0448\u0435 &#8212; \u0441\u043b\u043e\u0436\u043d\u0435\u0435)<\/p>\n<\/td>\n<td data-colwidth=\"110\" width=\"110\">\n<p>1<\/p>\n<\/td>\n<td data-colwidth=\"111\" width=\"111\">\n<p>2<\/p>\n<\/td>\n<td data-colwidth=\"121\" width=\"121\">\n<p>3<\/p>\n<\/td>\n<td>\n<p>4<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u0434\u044f \u043f\u043e \u0434\u0430\u043d\u043d\u044b\u043c \u0446\u0438\u0444\u0440\u0430\u043c, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b:<\/p>\n<ul>\n<li>\n<p>Flutter \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 ~90FPS<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 &#8212; \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0430\u0433\u0438<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e<\/p>\n<\/li>\n<li>\n<p>Compute \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0441\u0442\u044c \u043b\u0430\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Compute \u043d\u0435\u0441\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f (\u0447\u0438\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043d\u0435\u0442 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0438 \u0442.\u0434.)<\/p>\n<\/li>\n<li>\n<p>Overhead \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 compute \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 ~150-160ms<\/p>\n<\/li>\n<li>\n<p>Isolate \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043b\u0430\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u0437\u043e\u043b\u044f\u0442\u043e\u0432 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0434\u043d\u0435\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u0435\u043d \u043f\u043e \u0432\u0441\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c.<\/p>\n<h2>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043d\u043e\u043c\u0435\u0440 \u0434\u0432\u0430: \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a<\/h2>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 <\/p>\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-315107","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315107","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=315107"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315107\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}