{"id":320017,"date":"2021-03-22T09:00:47","date_gmt":"2021-03-22T09:00:47","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=320017"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=320017","title":{"rendered":"\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c Dart. \u041d\u0430\u0442\u0438\u0432\u043d\u043e, \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u043e"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/01d\/992\/078\/01d9920789a9afda7306ffc8ed56a6f9.jpg\" alt=\"\" title=\"\" width=\"1024\" height=\"683\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0435\u043b\u0438\u0437 <a href=\"https:\/\/medium.com\/dartlang\/announcing-dart-2-12-499a6e689c87\" rel=\"noopener noreferrer nofollow\">Dart 2.12<\/a> \u043f\u0440\u0438\u043d\u0451\u0441, \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e, <a href=\"https:\/\/dart.dev\/guides\/libraries\/c-interop\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 FFI<\/a> \u0432 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u043a \u0441\u0432\u043e\u0438\u043c \u043b\u044e\u0431\u0438\u043c\u044b\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0438\u0448\u043d\u044b\u0439 ABI \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430. \u0410 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 Rust, Go, Swift \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<hr>\n<h2>\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u044b<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Dart, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e, \u043d\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0442\u043e \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u043e\u0432.<\/p>\n<p>\u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0451\u0434, \u0441\u043a\u0430\u0436\u0443 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432\u044b\u0431\u0440\u0430\u043d, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 C \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0440\u0435\u0437\u0430\u043b \u0432 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"dart\">import 'dart:math';  \/\/ \u0441\u0447\u0438\u0442\u0430\u0435\u043c n \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 double log_loop(int n) {     double l = 0;     for (int i = 0; i &lt; n; i++) {         l = log(i);     }     return l; }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>main<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"dart\">var w = Stopwatch()..start();  double result = log_loop(100000000);  print('${w.elapsed.inMilliseconds}');<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>dart run<\/code>, \u0443\u0437\u043d\u0430\u0435\u043c \u0447\u0442\u043e \u0440\u0430\u0441\u0447\u0451\u0442\u044b  \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c <strong>10.05 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong>.<\/p>\n<p><em>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043de \u043f\u0440\u0438\u0432\u043e\u0436\u0443. \u0426\u0435\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438.<\/em><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043b\u0443\u0447\u0448\u0435? \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0434\u0430. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c <code>dart compile exe<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 10% \u0438\u043b\u0438 <strong>9.00 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong>.<\/p>\n<h2>\u0418\u0434\u0451\u043c \u0437\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0432\u0430\u0441 10 \u0441\u0435\u043a\u0443\u043d\u0434 &#8212; \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0438.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 C, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>log<\/code> \u0438\u0437 <code>&lt;math.h&gt;<\/code>. \u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <code>log<\/code> \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 libm \u0438\u0437 glibc, \u0430 \u043a\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f GCC 9.1.<\/p>\n<pre><code class=\"cpp\">\/\/ log_loop.c #include &lt;math.h&gt;  double log_loop(int n) {     double l = 0;     for (int i = 0; i &lt; n; i++) {         l = log(i);     }     return l; }<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u0442\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0443? \u0418 \u044f \u043d\u0435 \u0432\u0438\u0436\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 C. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 <code>log_loop.c<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 <code>main.c<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>main<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">clock_t ts = clock();  double result = log_loop(100000000);  printf(\"%.2f\\n\", 1000.0*(clock() - ts)\/CLOCKS_PER_SEC);<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 ELF \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>gcc -o main -lm main.c<\/code> \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430 <strong>1.69 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong>.<\/p>\n<p>\u041d\u0435 \u043c\u0443\u0434\u0440\u0441\u0442\u0432\u0443\u044f \u043b\u0443\u043a\u0430\u0432\u043e, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 <code>O3<\/code>, <code>O2<\/code> \u0438 <code>O1<\/code>:<\/p>\n<ul>\n<li>\n<p><code>03<\/code> &#8212; 0.822 \u0441<\/p>\n<\/li>\n<li>\n<p><code>02<\/code> &#8212; 0.832 \u0441<\/p>\n<\/li>\n<li>\n<p><code>01<\/code> &#8212; 0.834 \u0441<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439 <code>O3<\/code> \u0438 <code>O0<\/code>.<\/p>\n<h3>\u0421\u0442\u044b\u043a\u0443\u0435\u043c\u0441\u044f<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>dart:ffi<\/code> \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u0435\u0441\u0451\u0442 \u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f FFI, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u043a\u043e\u0434\u0430 \u043d\u0430 C, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0438\u0448\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 <em><abbr title=\"\u043e\u0434\u043d\u043e \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 &quot;foreign&quot;\">\u0438\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0435<\/abbr><\/em>.<\/p>\n<p>\u0412 \u043d\u0430\u0448 <code>main.c<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 <code>double log_loop(int)<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c <code>log_loop.c<\/code> \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0447\u0435\u0440\u0435\u0437 <code>gcc -c -o log_loop.o log_loop.c<\/code> \u0438 \u0434\u0430\u043b\u0435\u0435:<\/p>\n<ul>\n<li>\n<p><code>ar rcs liblog_loop.a log_loop.o<\/code> \u2014 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0438\u043d\u043a\u0443\u0435\u043c\u044b\u0439 \u0430\u0440\u0445\u0438\u0432<\/p>\n<\/li>\n<li>\n<p><code>gcc -L. -o main -lm -llog_loop main.c<\/code> \u2014 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c <strong>1.69 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O0<\/code> \u0438 <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O3<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u044d\u0442\u0438 \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 <code>dart:ffi<\/code>:<\/p>\n<ul>\n<li>\n<p><code>gcc -shared -o liblog_loop.so log_loop.o<\/code> \u2014 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><code>gcc -L. -o main -lm -llog_loop main.c<\/code> \u2014 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u043d\u0430 <code>log_loop.so<\/code> \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>LD_LIBRARY_PATH=.<\/code>.<br \/>\u0417\u0434\u0435\u0441\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0436\u0435: <strong>1.70 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O0<\/code> \u0438 <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O3<\/code>.<\/p>\n<h3>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u0442\u044c<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 FFI, \u0435\u0451 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e <code>dlopen<\/code>.<\/p>\n<p>\u0412 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043c, \u0430 \u0432\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"cpp\">#include &lt;dlfcn.h&gt;  \/\/ \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443  void *loader; if ((loader = dlopen(\"liblog_loop.so\", RTLD_NOW)) == NULL)  \/\/ \u0432 \u043a\u043e\u043d\u0446\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e dlclose(loader) \treturn 1;  double (*log_loop)(int); *(void **)(&amp;log_loop) = dlsym(l, \"log_loop\");  \/\/ \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/code><\/pre>\n<p>\u0418 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f: <strong>1.69 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O0<\/code> \u0438 <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O3<\/code>.<\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0442\u043e\u0433<\/h3>\n<p>\u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a &#8212; \u0431\u0443\u0434\u044c \u0442\u043e <code>dlopen<\/code>, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043b\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <strong>1.69 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O0<\/code> \u0438 <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O3<\/code>.<\/p>\n<h2>\u041f\u043e\u0435\u0445\u0430\u043b\u0438<\/h2>\n<p>\u041d\u0443 \u0448\u0442\u043e\u0448, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0442\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438\u0441\u044c.<\/p>\n<h3>\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e<\/h3>\n<p>\u041a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0420\u0430\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>log<\/code> \u0435\u0441\u0442\u044c \u0432 <code>libm<\/code>, \u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u0442\u0443\u0434\u0430 \u0435\u0451 \u0438 \u0432\u0437\u044f\u0442\u044c.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044e <code>main<\/code> \u0432 \u043d\u0430\u0448\u0435\u043c dart-\u043a\u043e\u0434\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439, \u0430 \u0432\u043e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"dart\">import 'dart:ffi';  typedef LogFFI = Double Function(Double); typedef Log = double Function(double);  double log_loop(int n) {     final libm = DynamicLibrary.open(\"\/lib\/...\/libm.so\");  \/\/ \u043f\u0443\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 libc      double l = 0;     for (int i = 0; i &lt; n; i++) {       \tfinal log = libm.lookup&lt;NativeFunction&lt;LogFFI&gt;&gt;('log').asFunction&lt;Log&gt;();         l = log(i * 1.0);     }      return l; }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432 Dart \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 <code>dlopen<\/code>, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0435\u043d. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>double log(double)<\/code>\u0438\u0437 <code>libm.so<\/code> \u0447\u0435\u0440\u0435\u0437 \u0442\u0438\u043f\u044b <code>dart:ffi<\/code> \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0435\u0451 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 Dart.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 <strong>70 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0438 <strong>75 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0447\u0435\u0440\u0435\u0437 <code>dart run<\/code>, \u0447\u0442\u043e \u0432 7 \u0440\u0430\u0437 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0447\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code>dart:math<\/code>.<\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u0412 \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430, \u043d\u043e \u043f\u043e \u043d\u0435\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0435\u0451 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u041f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e-\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443, \u0432\u044b\u043d\u0435\u0441\u044f <code>lookup<\/code> \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0446\u0438\u043a\u043b\u0430:<\/p>\n<pre><code class=\"dart\">double log_loop(int n) {     final libm = DynamicLibrary.open(\"\/lib\/...\/libm.so\");  \/\/ \u043f\u0443\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 libc   \tfinal log = libm.lookup&lt;NativeFunction&lt;LogFFI&gt;&gt;('log').asFunction&lt;Log&gt;();      double l = 0;     for (int i = 0; i &lt; n; i++) {         l = log(i * 1.0);     }      return l; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u0438\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043c <strong>2.96 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0438 <strong>3.08 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0447\u0435\u0440\u0435\u0437 <code>dart run<\/code>. \u042d\u0442\u043e \u0432 3 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 3.5 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u0441\u0430\u043c\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 C.<\/p>\n<h3>\u0414\u0435\u043b\u0430\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e<\/h3>\n<p>\u0420\u0430\u0437 \u043c\u044b \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0432\u0437\u044f\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435? \u0421\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u0432\u043c\u0435\u0441\u0442\u043e <code>libm<\/code> \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>log_loop<\/code> \u043d\u0430 C. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"dart\">import 'dart:ffi';  \/\/ \u0412 Dart \u043d\u0435\u0442 \u0442\u0438\u043f\u0430 Int \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c \u0447\u0442\u043e \u0435\u0441\u0442\u044c typedef LogLoopFFI = Double Function(IntPtr); typedef LogLoop = double Function(int);<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>main<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043c\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>lib\/<\/code>):<\/p>\n<pre><code class=\"dart\">final loader = DynamicLibrary.open(\"lib\/liblog_loop.so\"); final log_loop = loader.lookup&lt;NativeFunction&lt;LogLoopFFI&gt;&gt;('log_loop').asFunction&lt;LogLoop&gt;();<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 <code>O3<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u043c <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/strong> \u0434\u043b\u044f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438 <strong>0.86 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>dart run<\/code>.<\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u044d\u0442\u043e \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 10 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Dart \u0438 \u0432 2.5 \u0440\u0430\u0437\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>log<\/code>\u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 <code>libm<\/code>.<\/p>\n<h2>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0442\u043e\u0433<\/h2>\n<p>\u0417\u0430\u043a\u0440\u0443\u0433\u043b\u044f\u044f\u0441\u044c, \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u0432\u043e\u0434\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"198\" width=\"198\">\n<p align=\"center\"><strong>\u0421\u0440\u0435\u0434\u0430<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"center\"><strong>-O<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\"><strong>exe<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"center\"><strong>\u0412\u0440\u0435\u043c\u044f, \u0441\u0435\u043a<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p><strong>C<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td rowspan=\"8\" data-colwidth=\"83\" width=\"83\">\n<p align=\"center\"><strong>+<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.69<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\"><strong>3<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\"><strong>0.82<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>\u0421 (shared)<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.70<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">3<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">0.83<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>C (static)<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.69<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">3<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">0.83<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>C (dlopen)<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.69<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">3<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">0.83<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p><strong>Dart<\/strong><\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\"><strong>+<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\"><strong>9.00<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">10.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>Dart (libm, loop lookup)<\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">70.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">75.8<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>Dart (libm, fixed)<\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">2.96<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">3.07<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>Dart (ffi)<\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.71<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.72<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p><strong>Dart (ffi)<\/strong><\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<p align=\"right\"><strong>3<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\"><strong>+<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\"><strong>0.83<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">0.86<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 FFI. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 <code>log<\/code> \u0447\u0435\u0440\u0435\u0437 FFI \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043c\u0435\u0436\u0434\u0443 Dart \u0438 C.<\/p>\n<p>\u041f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043d\u0430 C \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0447\u0442\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>log<\/code> Dart \u0442\u0440\u0430\u0442\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e (2.96-0.83)\u00d71e8\/1e9 = 0.213 \u043d\u0441 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. \u0421\u0447\u0438\u0442\u0430\u044f, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 0.82\u00d71e8\/1e9 = 0.082 \u043d\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443.<\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043a\u043e\u0434, \u0442\u0435\u043c \u043c\u0435\u043d\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 FFI. \u041d\u043e \u044d\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0438\u0441\u0445\u043e\u0434 \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442, \u043e\u0434\u043d\u0430\u043a\u043e, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u043c\u0430\u0440\u043a\u0443, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0438\u0437 <code>Utf8Pointer<\/code> \u0438 \u0442. \u0434. \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u0442 \u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0443. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u043e\u0442\u043c\u0435\u0447\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/pub.dev\/packages\/ffigen\" rel=\"noopener noreferrer nofollow\">ffigen<\/a> \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c \u0438\u0437 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c8a\/243\/ba4\/c8a243ba4b2076d3e275308a66dd9ead.jpeg\" width=\"640\" height=\"480\"><figcaption><\/figcaption><\/figure>\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\/547946\/\"> https:\/\/habr.com\/ru\/post\/547946\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"bordered full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0435\u043b\u0438\u0437 <a href=\"https:\/\/medium.com\/dartlang\/announcing-dart-2-12-499a6e689c87\" rel=\"noopener noreferrer nofollow\">Dart 2.12<\/a> \u043f\u0440\u0438\u043d\u0451\u0441, \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e, <a href=\"https:\/\/dart.dev\/guides\/libraries\/c-interop\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 FFI<\/a> \u0432 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u043a \u0441\u0432\u043e\u0438\u043c \u043b\u044e\u0431\u0438\u043c\u044b\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0438\u0448\u043d\u044b\u0439 ABI \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430. \u0410 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 Rust, Go, Swift \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<hr>\n<h2>\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u044b<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Dart, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e, \u043d\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0442\u043e \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u043e\u0432.<\/p>\n<p>\u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0451\u0434, \u0441\u043a\u0430\u0436\u0443 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432\u044b\u0431\u0440\u0430\u043d, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 C \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0440\u0435\u0437\u0430\u043b \u0432 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"dart\">import 'dart:math';  \/\/ \u0441\u0447\u0438\u0442\u0430\u0435\u043c n \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 double log_loop(int n) {     double l = 0;     for (int i = 0; i &lt; n; i++) {         l = log(i);     }     return l; }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>main<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"dart\">var w = Stopwatch()..start();  double result = log_loop(100000000);  print('${w.elapsed.inMilliseconds}');<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>dart run<\/code>, \u0443\u0437\u043d\u0430\u0435\u043c \u0447\u0442\u043e \u0440\u0430\u0441\u0447\u0451\u0442\u044b  \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c <strong>10.05 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong>.<\/p>\n<p><em>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043de \u043f\u0440\u0438\u0432\u043e\u0436\u0443. \u0426\u0435\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438.<\/em><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043b\u0443\u0447\u0448\u0435? \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0434\u0430. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c <code>dart compile exe<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 10% \u0438\u043b\u0438 <strong>9.00 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong>.<\/p>\n<h2>\u0418\u0434\u0451\u043c \u0437\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0432\u0430\u0441 10 \u0441\u0435\u043a\u0443\u043d\u0434 &#8212; \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u0441\u0435\u0431\u0435 \u0432 \u043d\u043e\u0433\u0438.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 C, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>log<\/code> \u0438\u0437 <code>&lt;math.h&gt;<\/code>. \u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <code>log<\/code> \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 libm \u0438\u0437 glibc, \u0430 \u043a\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f GCC 9.1.<\/p>\n<pre><code class=\"cpp\">\/\/ log_loop.c #include &lt;math.h&gt;  double log_loop(int n) {     double l = 0;     for (int i = 0; i &lt; n; i++) {         l = log(i);     }     return l; }<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u0442\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0443? \u0418 \u044f \u043d\u0435 \u0432\u0438\u0436\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 C. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 <code>log_loop.c<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 <code>main.c<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>main<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">clock_t ts = clock();  double result = log_loop(100000000);  printf(\"%.2f\\n\", 1000.0*(clock() - ts)\/CLOCKS_PER_SEC);<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 ELF \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>gcc -o main -lm main.c<\/code> \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430 <strong>1.69 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong>.<\/p>\n<p>\u041d\u0435 \u043c\u0443\u0434\u0440\u0441\u0442\u0432\u0443\u044f \u043b\u0443\u043a\u0430\u0432\u043e, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 <code>O3<\/code>, <code>O2<\/code> \u0438 <code>O1<\/code>:<\/p>\n<ul>\n<li>\n<p><code>03<\/code> &#8212; 0.822 \u0441<\/p>\n<\/li>\n<li>\n<p><code>02<\/code> &#8212; 0.832 \u0441<\/p>\n<\/li>\n<li>\n<p><code>01<\/code> &#8212; 0.834 \u0441<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439 <code>O3<\/code> \u0438 <code>O0<\/code>.<\/p>\n<h3>\u0421\u0442\u044b\u043a\u0443\u0435\u043c\u0441\u044f<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>dart:ffi<\/code> \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u0435\u0441\u0451\u0442 \u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f FFI, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u043a\u043e\u0434\u0430 \u043d\u0430 C, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0438\u0448\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 <em><abbr title=\"\u043e\u0434\u043d\u043e \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 &quot;foreign&quot;\"> &quot;foreign&quot;&#187;>\u0438\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0435<\/abbr><\/em>.<\/p>\n<p>\u0412 \u043d\u0430\u0448 <code>main.c<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 <code>double log_loop(int)<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c <code>log_loop.c<\/code> \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0447\u0435\u0440\u0435\u0437 <code>gcc -c -o log_loop.o log_loop.c<\/code> \u0438 \u0434\u0430\u043b\u0435\u0435:<\/p>\n<ul>\n<li>\n<p><code>ar rcs liblog_loop.a log_loop.o<\/code> \u2014 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0438\u043d\u043a\u0443\u0435\u043c\u044b\u0439 \u0430\u0440\u0445\u0438\u0432<\/p>\n<\/li>\n<li>\n<p><code>gcc -L. -o main -lm -llog_loop main.c<\/code> \u2014 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c <strong>1.69 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O0<\/code> \u0438 <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O3<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u044d\u0442\u0438 \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 <code>dart:ffi<\/code>:<\/p>\n<ul>\n<li>\n<p><code>gcc -shared -o liblog_loop.so log_loop.o<\/code> \u2014 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><code>gcc -L. -o main -lm -llog_loop main.c<\/code> \u2014 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u043d\u0430 <code>log_loop.so<\/code> \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>LD_LIBRARY_PATH=.<\/code>.<br \/>\u0417\u0434\u0435\u0441\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0436\u0435: <strong>1.70 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O0<\/code> \u0438 <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O3<\/code>.<\/p>\n<h3>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u0442\u044c<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 FFI, \u0435\u0451 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e <code>dlopen<\/code>.<\/p>\n<p>\u0412 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043c, \u0430 \u0432\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"cpp\">#include &lt;dlfcn.h&gt;  \/\/ \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443  void *loader; if ((loader = dlopen(\"liblog_loop.so\", RTLD_NOW)) == NULL)  \/\/ \u0432 \u043a\u043e\u043d\u0446\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e dlclose(loader) \treturn 1;  double (*log_loop)(int); *(void **)(&amp;log_loop) = dlsym(l, \"log_loop\");  \/\/ \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/code><\/pre>\n<p>\u0418 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f: <strong>1.69 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O0<\/code> \u0438 <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O3<\/code>.<\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0442\u043e\u0433<\/h3>\n<p>\u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a &#8212; \u0431\u0443\u0434\u044c \u0442\u043e <code>dlopen<\/code>, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043b\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <strong>1.69 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O0<\/code> \u0438 <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>O3<\/code>.<\/p>\n<h2>\u041f\u043e\u0435\u0445\u0430\u043b\u0438<\/h2>\n<p>\u041d\u0443 \u0448\u0442\u043e\u0448, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0442\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438\u0441\u044c.<\/p>\n<h3>\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e<\/h3>\n<p>\u041a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0420\u0430\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>log<\/code> \u0435\u0441\u0442\u044c \u0432 <code>libm<\/code>, \u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u0442\u0443\u0434\u0430 \u0435\u0451 \u0438 \u0432\u0437\u044f\u0442\u044c.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044e <code>main<\/code> \u0432 \u043d\u0430\u0448\u0435\u043c dart-\u043a\u043e\u0434\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439, \u0430 \u0432\u043e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"dart\">import 'dart:ffi';  typedef LogFFI = Double Function(Double); typedef Log = double Function(double);  double log_loop(int n) {     final libm = DynamicLibrary.open(\"\/lib\/...\/libm.so\");  \/\/ \u043f\u0443\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 libc      double l = 0;     for (int i = 0; i &lt; n; i++) {       \tfinal log = libm.lookup&lt;NativeFunction&lt;LogFFI&gt;&gt;('log').asFunction&lt;Log&gt;();         l = log(i * 1.0);     }      return l; }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432 Dart \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 <code>dlopen<\/code>, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0435\u043d. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>double log(double)<\/code>\u0438\u0437 <code>libm.so<\/code> \u0447\u0435\u0440\u0435\u0437 \u0442\u0438\u043f\u044b <code>dart:ffi<\/code> \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0435\u0451 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 Dart.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 <strong>70 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0438 <strong>75 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0447\u0435\u0440\u0435\u0437 <code>dart run<\/code>, \u0447\u0442\u043e \u0432 7 \u0440\u0430\u0437 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0447\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code>dart:math<\/code>.<\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u0412 \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430, \u043d\u043e \u043f\u043e \u043d\u0435\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0435\u0451 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u041f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e-\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443, \u0432\u044b\u043d\u0435\u0441\u044f <code>lookup<\/code> \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0446\u0438\u043a\u043b\u0430:<\/p>\n<pre><code class=\"dart\">double log_loop(int n) {     final libm = DynamicLibrary.open(\"\/lib\/...\/libm.so\");  \/\/ \u043f\u0443\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 libc   \tfinal log = libm.lookup&lt;NativeFunction&lt;LogFFI&gt;&gt;('log').asFunction&lt;Log&gt;();      double l = 0;     for (int i = 0; i &lt; n; i++) {         l = log(i * 1.0);     }      return l; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u0438\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043c <strong>2.96 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0438 <strong>3.08 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0447\u0435\u0440\u0435\u0437 <code>dart run<\/code>. \u042d\u0442\u043e \u0432 3 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 3.5 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u0441\u0430\u043c\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 C.<\/p>\n<h3>\u0414\u0435\u043b\u0430\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e<\/h3>\n<p>\u0420\u0430\u0437 \u043c\u044b \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0432\u0437\u044f\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435? \u0421\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u0432\u043c\u0435\u0441\u0442\u043e <code>libm<\/code> \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>log_loop<\/code> \u043d\u0430 C. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"dart\">import 'dart:ffi';  \/\/ \u0412 Dart \u043d\u0435\u0442 \u0442\u0438\u043f\u0430 Int \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c \u0447\u0442\u043e \u0435\u0441\u0442\u044c typedef LogLoopFFI = Double Function(IntPtr); typedef LogLoop = double Function(int);<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>main<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043c\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>lib\/<\/code>):<\/p>\n<pre><code class=\"dart\">final loader = DynamicLibrary.open(\"lib\/liblog_loop.so\"); final log_loop = loader.lookup&lt;NativeFunction&lt;LogLoopFFI&gt;&gt;('log_loop').asFunction&lt;LogLoop&gt;();<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 <code>O3<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u043c <strong>0.83 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/strong> \u0434\u043b\u044f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438 <strong>0.86 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong> \u0434\u043b\u044f <code>dart run<\/code>.<\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u044d\u0442\u043e \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 10 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Dart \u0438 \u0432 2.5 \u0440\u0430\u0437\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>log<\/code>\u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 <code>libm<\/code>.<\/p>\n<h2>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0442\u043e\u0433<\/h2>\n<p>\u0417\u0430\u043a\u0440\u0443\u0433\u043b\u044f\u044f\u0441\u044c, \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u0432\u043e\u0434\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"198\" width=\"198\">\n<p align=\"center\"><strong>\u0421\u0440\u0435\u0434\u0430<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"center\"><strong>-O<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\"><strong>exe<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"center\"><strong>\u0412\u0440\u0435\u043c\u044f, \u0441\u0435\u043a<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p><strong>C<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td rowspan=\"8\" data-colwidth=\"83\" width=\"83\">\n<p align=\"center\"><strong>+<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.69<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\"><strong>3<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\"><strong>0.82<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>\u0421 (shared)<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.70<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">3<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">0.83<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>C (static)<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.69<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">3<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">0.83<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>C (dlopen)<\/p>\n<\/td>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.69<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">3<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">0.83<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p><strong>Dart<\/strong><\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\"><strong>+<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\"><strong>9.00<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">10.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>Dart (libm, loop lookup)<\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">70.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">75.8<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>Dart (libm, fixed)<\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">2.96<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">3.07<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p>Dart (ffi)<\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<p align=\"right\">0<\/p>\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">+<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.71<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">1.72<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td rowspan=\"2\" data-colwidth=\"198\" width=\"198\">\n<p><strong>Dart (ffi)<\/strong><\/p>\n<\/td>\n<td rowspan=\"2\" data-colwidth=\"61\" width=\"61\">\n<p align=\"right\"><strong>3<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\"><strong>+<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\"><strong>0.83<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"83\" width=\"83\">\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"right\">0.86<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 FFI. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 <code>log<\/code> \u0447\u0435\u0440\u0435\u0437 FFI \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043c\u0435\u0436\u0434\u0443 Dart \u0438 C.<\/p>\n<p>\u041f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043d\u0430 C \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0447\u0442\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>log<\/code> Dart \u0442\u0440\u0430\u0442\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e (2.96-0.83)\u00d71e8\/1e9 = 0.213 \u043d\u0441 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. \u0421\u0447\u0438\u0442\u0430\u044f, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430 0.82\u00d71e8\/1e9 = 0.082 \u043d\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443.<\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043a\u043e\u0434, \u0442\u0435\u043c \u043c\u0435\u043d\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 FFI. \u041d\u043e \u044d\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0438\u0441\u0445\u043e\u0434 \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442, \u043e\u0434\u043d\u0430\u043a\u043e, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u043c\u0430\u0440\u043a\u0443, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0438\u0437 <code>Utf8Pointer<\/code> \u0438 \u0442. \u0434. \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u0442 \u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0443. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u043e\u0442\u043c\u0435\u0447\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/pub.dev\/packages\/ffigen\" rel=\"noopener noreferrer nofollow\">ffigen<\/a> \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c \u0438\u0437 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<figure class=\"bordered full-width\"><figcaption><\/figcaption><\/figure>\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\/547946\/\"> https:\/\/habr.com\/ru\/post\/547946\/<\/a><br \/><\/br><\/br><\/hr>\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-320017","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320017","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=320017"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320017\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=320017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=320017"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=320017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}