<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Комментарии к публикации «Глобально оптимальный, восьмой и наиболее быстрый вид интерпретаторов байткода»]]></title>
    <link>https://habr.com/ru/articles/856480/</link>
    <description><![CDATA[Комментарии к публикации «Глобально оптимальный, восьмой и наиболее быстрый вид интерпретаторов байткода»]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Sat, 25 Apr 2026 15:07:08 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      

      
        
  
    <item>
      <title>14.11.2024 05:22:25 PrinceKorwin</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27552576</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27552576</link>
      <description><![CDATA[<p>Проблема с printf в том, что она не выполняется за константное время. Поэтому и результаты замера получаются смазанными.</p><p>Если вы хотите чтобы кэш процессора "вымывался", то стоит вызывать что-то другое, не работающее с I/O. </p>]]></description>
      <pubDate>Thu, 14 Nov 2024 05:22:25 GMT</pubDate>
      <dc:creator><![CDATA[PrinceKorwin]]></dc:creator>
    </item>
  

  
    <item>
      <title>13.11.2024 14:23:58 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27550340</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27550340</link>
      <description><![CDATA[<p>Вариант без printf() несложно получить, но я упорствую в своем глупом мнении, что printf() это правильная, реальная нагрузка, которая в числе прочего вымывает из кэша полезные для производительности линии.<br><br>(32*<em>1024) / (255*</em>6)<br>32килобайтный кэш / 6 вариантов всех 255 инструкций</p>]]></description>
      <pubDate>Wed, 13 Nov 2024 14:23:58 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>13.11.2024 00:42:58 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27547686</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27547686</link>
      <description><![CDATA[<blockquote><p>На этих бенчмарках вызов printf() не удалялся</p></blockquote><p>Таким образом Вы опять измеряете производительность операционной системы, а не своего алгоритма.</p><p>Хочу видеть результат без printf(). :-)</p><blockquote><p> c 32 килобайтами средний размер процедуры будет только 21 байт, что уже несколько стесняет, даже если мы будем расширять большие процедуры за счет тех что меньше среднего размера.</p></blockquote><p>Не понял, откуда такие цифры ? 32768 / 128 = 256 сервисных функций по 128 байт. Помоему это овердохрена. Сервисные функции длиной более 128 байт поделить на четыре отдельных опкода, но таких функций быть вообще-то не должно!</p>]]></description>
      <pubDate>Wed, 13 Nov 2024 00:42:58 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>12.11.2024 23:53:44 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27547658</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27547658</link>
      <description><![CDATA[<p>Да, проверил трамплины: <a href="https://habr.com/ru/articles/856480/comments/#comment_27547640" rel="noopener noreferrer nofollow">https://habr.com/ru/articles/856480/comments/#comment_27547640</a></p>]]></description>
      <pubDate>Tue, 12 Nov 2024 23:53:44 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>12.11.2024 23:41:44 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27547640</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27547640</link>
      <description><![CDATA[<p>Я нашел время проверить, насколько трамплины замедляют выполнение, сделал таблицу трамплинов:</p><pre><code class="assembly">trampoline_table:
    jmp srv_Break
    .byte 0x90, 0x90, 0x90
    jmp srv_Nop
    .byte 0x90, 0x90, 0x90
    jmp srv_Halt
    .byte 0x90, 0x90, 0x90
    &lt;....&gt;
    jmp sr_Pick
    .byte 0x90, 0x90, 0x90</code></pre><p>на старте ее адрес загружается в %rdi<br><br>dispatch теперь стал таким:</p><pre><code class="assembly">.macro DISPATCH
    lea    (%rdi, opcode64, 8), opcode64
    jmp    *opcode64
.endm</code></pre><p>Вот результаты бенчмарка с размером задачи 100000 (как в оригинале). Интересующий нас столбец - asmtrm</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/343/76f/eb5/34376feb5eff50aa7d0f4e1e1675a11a.png" width="640" height="480"></figure><p>В результате мы экономим пространство за счет времени исполнения (в asmexp все функции выровнены на 0x80, а в asmtrm - на 0x10). На моей машине L1 кэш инструкций составляет 704 килобайта, поэтому имеет смысл использовать трамплины для  того чтобы иметь несколько наборов кода - пока мы попадаем в кэш. <br><br>Можно попробовать оценить, сколько можно иметь кодовых наборов. За образец можно взять виртуальную машину WASM,  у нее однобайтовый опкод, на текущий момент занято где-то 200 команд, но можно брать по максимуму - 255. <br><br>Даже если кешировать три элемента стека (а не два, как сейчас) и мы хотим варианты наборов процедур для всех перестановок, нам нужно 6 вариантов. Тогда мы попадаем в этот кэш при среднем размере процедуры в 471 байт (что довольно много).<br><br>На практике не все опкоды из этих 255 работают со стеком, так что можно чувствовать себя еще свободнее. Но на машине <a class="mention" href="/users/checkpoint">@checkpoint</a> c 32 килобайтами средний размер процедуры будет только 21 байт, что уже несколько стесняет, даже если мы будем расширять большие процедуры за счет тех что меньше среднего размера.</p><p>На этих бенчмарках вызов printf() не удалялся</p><p></p>]]></description>
      <pubDate>Tue, 12 Nov 2024 23:41:44 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.11.2024 09:56:57 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27539894</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27539894</link>
      <description><![CDATA[<p>Я проверил - c res не оптимизирует, а без неё - да. :)</p><p>Судя по ассемблерному коду который привел пользователь <a class="mention" href="/users/e2k_sid">@e2k_sid</a> в своей ответной статье, явовскому JIT компилятору (и JVM) до оптимума еще как до Китая пешим драпом. Честно говоря я был неприятно удивлен.</p>]]></description>
      <pubDate>Mon, 11 Nov 2024 09:56:57 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.11.2024 09:34:46 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27539754</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27539754</link>
      <description><![CDATA[<p>Возможно res стоит возвращать: я не знаю насколько умный компилятор Java но он может соптимизировать цикл т.к. res нигде не применяется</p>]]></description>
      <pubDate>Mon, 11 Nov 2024 09:34:46 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.11.2024 09:32:48 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27539738</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27539738</link>
      <description><![CDATA[<p>Предлагаю проверить. Я немного занят рабочей задачей прямо сейчас, смогу вернуться к интерпретатору после ее решения</p>]]></description>
      <pubDate>Mon, 11 Nov 2024 09:32:48 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.11.2024 09:24:36 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27539678</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27539678</link>
      <description><![CDATA[<p>Спасибо за уточнение и, конечно, за оригинальную статью, она вдохновляет.<br><br>Мне кажется в этой теме еще довольно много пространства для работы студентов: не только оптимизация, но и, например:<br>- написание отладчика байткода, <br>- сэмплирующего профайлера, <br>- инструмента для определения целей для Instr_Jump, Instr_Je и Instr_Jne, чтобы правильно собирать суперинструкции, <br>- сама сборка суперинструкций,<br>- и наконец, jit-компилятор, опирающийся на профилировку времени исполнения. <br><br>Уже хватит на несколько курсовых, ну или семестровых работ - я не знаю актуальный уровень студентов. У меня ушло где-то две недели по вечерам на написание ассемблерного интерпретатора, допускаю что среднему студенту потребуется больше времени. <br><br>А ведь можно взяться за что-то посложнее: <br>- применение деоптимизаций в случаях есть байткоду позволяется самомодификция (нужно будет расширить список опкодов), <br>- компилятор небольшого подмножества си-подобного языка в байткод, <br>- построение объектной системы, <br>- эвристический декомпилятор, восстанавливающий высокоуровневые конструкции языка из байткода, <br>- написание генетического алгоритма построения программы для прохождения какой-нибудь классической игры, вроде диггера, или даже марио и минимизация её методами машинного обучения.<br><br>Что-то из этого (или даже все) я бы с удовольствием прочел на хабре.</p><p></p>]]></description>
      <pubDate>Mon, 11 Nov 2024 09:24:36 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.11.2024 08:47:02 Atakua</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27539494</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27539494</link>
      <description><![CDATA[<p>Пример, хотя конкретно здесь я не смог <code>--coverage</code> сломаться. Но в реальном проекте с более хитрыми ограничениями на хостовые регистры эта проблема всплывает.</p><pre><code>atakua@localhost:~$ cat no-stack-frame.c 

register long long a asm("%rbp");
int main() {
    return (int)a;
};

atakua@localhost:~$ gcc no-stack-frame.c 
no-stack-frame.c: In function ‘main’:
no-stack-frame.c:4:5: error: frame pointer required, but reserved
    4 | int main() {
      |     ^~~~
no-stack-frame.c:1:20: note: for ‘a’
    1 | register long long a asm("%rbp");
      |                    ^

atakua@localhost:~$ gcc -fomit-frame-pointer no-stack-frame.c 
# OK

</code></pre>]]></description>
      <pubDate>Mon, 11 Nov 2024 08:47:02 GMT</pubDate>
      <dc:creator><![CDATA[Atakua]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.11.2024 08:27:08 Atakua</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27539400</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27539400</link>
      <description><![CDATA[<p>Очень интересное исследование получилось! Мой оригинальный проект был нацелен на то, чтобы быть иллюстрацией методов интерпретации для студентов, а также как упражнение для них по изменению некоторых аспектов работы интерпретаторов. Мне тогда не пришло в голову давать кому-то задачу по дальнейшей профилировке и ускорению.</p><p>У меня есть один комментарий по поводу следующего утверждения из статьи:</p><blockquote><p>Рекомендация компилятору привязать одну глобальную переменную к регистру - это только рекомендация, и компилятор может ее проигнорировать.</p></blockquote><p>В случае с GCC и расширения <code>asm("reg-name")</code> это не так. Компилятор действительно перестаёт использовать указанный регистр для своих целей. Фактически, за модификации в ABI после этого отвечает сам программист.<br> Можно даже поставить компилятор в тупик и заставить его отказаться от компиляции кода, в котором важные для ABI регистры были у него "забраны". Например, если прибить RBP на x86-64, то компиляция с <code>--coverage</code> становится невозможной. GCC хочет использовать RBP  для stack frame, который необходим для инструментации покрытия кода.</p>]]></description>
      <pubDate>Mon, 11 Nov 2024 08:27:08 GMT</pubDate>
      <dc:creator><![CDATA[Atakua]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 10:41:51 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536578</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536578</link>
      <description><![CDATA[<p>Что-то получилось с трамплинами ?</p><p>Мне почему-то кажется, что лишний jump испортит картину.</p>]]></description>
      <pubDate>Sun, 10 Nov 2024 10:41:51 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 10:32:57 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536556</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536556</link>
      <description><![CDATA[<p>Разумеется тупо закоментировать printf() ни к чему хорошему не приведет - компилятор соптимизирует цикл. Я ввел переменную в которую суммирую результат, этого оказалось достаточно.</p><details class="spoiler"><summary>Java код без printf()</summary><div class="spoiler__content"><pre><code class="java">public class Main {
    public static void main(String[] args) {
	int res = 0;
        for (int i = 2; i &lt; 300000; i++) {
            boolean isPrime = true;
            for (int divisor = 2; divisor &lt; i; divisor++) {
                if (i % divisor == 0) {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime)
                res = res + i; //System.out.printf("[%d]\n", i);
        }
    }
}</code></pre><p></p></div></details><p>В asmexp убран вызов библиотечной функции, сам опкод для печати остается, но он ничего не делает. Это равносильно суммированию в Java коде.</p><p></p>]]></description>
      <pubDate>Sun, 10 Nov 2024 10:32:57 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 08:34:03 vadimr</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536258</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536258</link>
      <description><![CDATA[<p>Ну я и говорю, что интерпретатор - это выкрученный в ноль компилятор. </p>]]></description>
      <pubDate>Sun, 10 Nov 2024 08:34:03 GMT</pubDate>
      <dc:creator><![CDATA[vadimr]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 08:31:26 qw1</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536254</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536254</link>
      <description><![CDATA[<p>Компилятор можно крутить в разные стороны: дольше компилировать / быстрее выполнять, а то и вообще стартовать на интерпретаторе и в фоне компилировать. У интерпретатора нет такой гибкости.</p>]]></description>
      <pubDate>Sun, 10 Nov 2024 08:31:26 GMT</pubDate>
      <dc:creator><![CDATA[qw1]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 08:15:02 vadimr</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536202</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536202</link>
      <description><![CDATA[<p>Нативный код – да, но мы же сравниваем эффективность выполнения данной нам программы на входном языке (или байткоде), а не эффективность уже полученного из неё машинного кода в сравнении с интерпретацией ещё не обработанного байткода. Чтобы получить нативный код, сначала должен отработать компилятор, что составляет весьма значительные начальные затраты.</p>]]></description>
      <pubDate>Sun, 10 Nov 2024 08:15:02 GMT</pubDate>
      <dc:creator><![CDATA[vadimr]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 08:08:55 qw1</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536188</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536188</link>
      <description><![CDATA[<p>Скорее наоборот, нативный код является предельным частным случаем интерпретатора, когда байт-код + интерпретатор кладут в чёрный ящик и объявляют "нативной реализацией". Поэтому "нативная реализация" всегда будет как минимум не хуже интерпретатора.</p>]]></description>
      <pubDate>Sun, 10 Nov 2024 08:08:55 GMT</pubDate>
      <dc:creator><![CDATA[qw1]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 07:50:18 vadimr</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536150</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536150</link>
      <description><![CDATA[<p>Я вовсе не пытаюсь сказать, что компилятор вообще бесполезен. Я говорю только о том, что сравнительная эффективность компиляции и интерпретации может быть разной в зависимости от конкретного обрабатываемого кода.</p><p>В конце концов, интерпретатор является предельным частным случаем компилятора, в котором вся работа переложена на библиотеку времени выполнения.</p>]]></description>
      <pubDate>Sun, 10 Nov 2024 07:50:18 GMT</pubDate>
      <dc:creator><![CDATA[vadimr]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 07:47:11 qw1</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536140</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536140</link>
      <description><![CDATA[<p>Могу предложить контр-аргумент: есть конструкции, которые не могут быть эффективно выражены в байт-коде (из-за его фиксированного набора опкодов), но для которых есть инструкции на целевой архитектуре, и компилятор может использовать их, распознав некоторый знакомый паттерн. Наиболее частый пример - авто-векторизация.</p>]]></description>
      <pubDate>Sun, 10 Nov 2024 07:47:11 GMT</pubDate>
      <dc:creator><![CDATA[qw1]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 07:29:44 vadimr</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27536106</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27536106</link>
      <description><![CDATA[<p>Но время работы компилятора тоже не бесплатное. </p><p>Кроме того, существуют языковые конструкции, которые по самой своей природе не поддаются компиляции (например, когда программа меняет синтаксис или семантику своего собственного языка в ходе исполнения). И это не абстрактная казуистическая возможность, хотя и не имеет прямого отношения к теме обсуждения. </p><p></p>]]></description>
      <pubDate>Sun, 10 Nov 2024 07:29:44 GMT</pubDate>
      <dc:creator><![CDATA[vadimr]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.11.2024 03:58:10 imitron</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27535918</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27535918</link>
      <description><![CDATA[<p>Возможно не совсем корректно убирать печать. Я еще не проверял, но могу продположить что Java-вариант должен оптимизировать</p><p><code>if (isPrime) System.out.printf("[%d]\n", i);</code></p><p>убирая соответствующие байткоды, а в отключенном asmexp убирается только сам вызов функции, судя по патчу, накладные расходы остаются</p>]]></description>
      <pubDate>Sun, 10 Nov 2024 03:58:10 GMT</pubDate>
      <dc:creator><![CDATA[imitron]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 18:43:37 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27535246</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27535246</link>
      <description><![CDATA[<p>Прогнал этот вариант без внесения каких либо изменений. На моей машине результат прежний:</p><pre><code>rz@butterfly:~/rigidus/interpreters-comparison % time ./asmexp &gt; /dev/null
24.809u 0.000s 0:24.81 99.9%	848+2896k 0+8io 0pf+0w

rz@butterfly:~/rigidus/interpreters-comparison % time ./asmopt &gt; /dev/null
36.961u 0.015s 0:36.97 100.0%	843+2896k 0+8io 0pf+0w</code></pre><p>Это выборка из нескольких прогонов, с минимальным значением.</p><p>Моя машина - ноут Lenovo Ideapad Gaming:</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/012/a07/aa3/012a07aa313d7764aa081a313d3d6fdb.png" width="740" height="773"></figure><p></p>]]></description>
      <pubDate>Sat, 09 Nov 2024 18:43:37 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 17:57:44 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27535092</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27535092</link>
      <description><![CDATA[<p>Попробуйте пожалуйста ветку noprintf. Там задача 300000 чисел и отключен вызов printf.</p><p>Update:</p><p>На моей машне Java без printf на задаче в 300000 чисел дает такой результат:</p><pre><code>rz@butterfly:~/interpreters-comparison % time java -Xint Main
31.386u 0.055s 0:31.43 100.0%	5+167k 0+4io 0pf+0w

rz@butterfly:~/interpreters-comparison % time java Main
5.340u 0.031s 0:05.36 100.1%	17+171k 0+4io 0pf+0w</code></pre><p>JIT вариант ожидаемо дает результат близкий к native, а вот JVM существенно проигрывает asmexp (22s) и близок к asmopt (32s). Хочу увидеть эти же тесты на других машинах. Есть основания полагать, что вариант предложенный автором + моя идея с вычислимым адресом, несколько более эффективен. Но результат сильно зависит от конкретной модели микропроцессора.</p><p></p>]]></description>
      <pubDate>Sat, 09 Nov 2024 17:57:44 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 17:55:59 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27535086</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27535086</link>
      <description><![CDATA[<p>Почитайте выше мою переписку с автором. В asmexp реализован вычислимый способ получения адреса сервисной процедуры, без заглядывания в таблицу. На моей машине (ноутбук с AMD Ryzen5) этот метод на 23% быстрее чем asmopt. У автора почему-то этот результат куда более скромный. Интересно какой будет у Вас. Ну и сравним его с JIT и JVM.</p><p>В моём репозитории для способов native, asmopt и asmexp отключен вызов printf, а задача увеличена до 300000 числе. Это делает эксперимент более точным.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 17:55:59 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 16:05:15 e2k_sid</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534776</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534776</link>
      <description><![CDATA[<p><code>$ time java Main &gt; /dev/null<br>real    0m1,786s<br><br>$ time java -Xint Main &gt; /dev/null<br>real    0m6,686s<br><br>model name      : Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz<br>openjdk 11.0.6 2020-01-14<br></code></p><p>Кстати, 6.7 s на openjdk - это меньше, чем 7.7 s на asmopt.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 16:05:15 GMT</pubDate>
      <dc:creator><![CDATA[e2k_sid]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 15:51:09 e2k_sid</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534746</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534746</link>
      <description><![CDATA[<p>В репозитории из статьи взял ветку asmexp:</p><p><code>$ time ./asmopt &gt; /dev/null<br>real    0m7,739s<br><br>$ time ./asmexp &gt; /dev/null<br>real    0m8,787s<br><br>$ time ./native &gt; /dev/null<br>real    0m1,253s</code></p>]]></description>
      <pubDate>Sat, 09 Nov 2024 15:51:09 GMT</pubDate>
      <dc:creator><![CDATA[e2k_sid]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 15:38:45 e2k_sid</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534714</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534714</link>
      <description><![CDATA[<p>В статье приведен другой репозиторий. В чем отличие? Чем asmoptll.S отличается от asmexpll.S? Что должны демонстрировать тесты native, asmopt и asmexp?</p><p></p>]]></description>
      <pubDate>Sat, 09 Nov 2024 15:38:45 GMT</pubDate>
      <dc:creator><![CDATA[e2k_sid]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 14:39:54 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534634</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534634</link>
      <description><![CDATA[<p>Экспериментирую тут <a href="https://github.com/rigidus/interpreters-comparison/tree/checkpoint" rel="noopener noreferrer nofollow">https://github.com/rigidus/interpreters-comparison/tree/checkpoint</a> (можно на ты, так как-то привычнее -  я родом из интернета до роскомнадзора)</p><p></p>]]></description>
      <pubDate>Sat, 09 Nov 2024 14:39:54 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 14:24:02 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534596</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534596</link>
      <description><![CDATA[<p>Думаю о комбинации этих идей: <a href="https://habr.com/ru/articles/856480/comments/#comment_27534590" rel="noopener noreferrer nofollow">https://habr.com/ru/articles/856480/comments/#comment_27534590</a></p>]]></description>
      <pubDate>Sat, 09 Nov 2024 14:24:02 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 14:21:32 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534590</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534590</link>
      <description><![CDATA[<p>Да, конечно, забыл, но в оправдание могу сказать, что я просто хотел чтобы ось Y начиналась от нуля, а то это получается "лгать при помощи графиков".<br><br>Сейчас я пытаюсь проверить, как распределение кода влияет на промахи кэша. Выше уже предложили (а я немного адаптировал идею), что если оставлять в начале сервисной процедуры только 16-32 байт кода, а до остального прыгать jump-ом то может быть это сможет дать лучшее попадание в кэш для тех процедур, которые не превышают эти 16-32 байта и не такую большую просадку из-за jump-а потому что он будет хорошо предсказываться. </p><p></p>]]></description>
      <pubDate>Sat, 09 Nov 2024 14:21:32 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 13:09:16 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534376</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534376</link>
      <description><![CDATA[<blockquote><p>«А мне тут вообще всё не нравится».</p></blockquote><p>Это про меня. :)</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 13:09:16 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 12:08:47 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534216</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534216</link>
      <description><![CDATA[<blockquote><p>$ time java Main &gt; /dev/null</p><p>real    0m6,139s<br><br>$ time java -Xint Main &gt; /dev/null</p><p>real    0m22,493s</p></blockquote><p>Эти результаты, кстати, очень хорошо перекликаются с тем, что выдают варианты native и asmexp. Попробуйте запустить тест native, asmopt и asmexp из <a href="https://github.com/pointcheck/interpreters-comparison.git" rel="noopener noreferrer nofollow">моего репозитория</a> (ветка noprintf), интересно какие будут абсолютные цифры на Вашей машине. Сравним их JVM и JIT.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 12:08:47 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 11:41:33 qw1</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27534154</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27534154</link>
      <description><![CDATA[<p>Предполагается, что jit хороший, долгий проект, где все очевидные оптимизации сделаны. И интерпретатор байт-кода такой же хороший, оптимизированный.</p><blockquote><p>преобразование одной в другую сожрет существенную часть производительности</p></blockquote><p>Только jit будет нести расходы на несоответстие vm и архитектуры в compile-time, а интерпретатор - в run-time.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 11:41:33 GMT</pubDate>
      <dc:creator><![CDATA[qw1]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 10:21:43 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27533862</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27533862</link>
      <description><![CDATA[<p>Нет, не очевидно, так как не понято в какой именно набор инструкций компилирует JIT. Так как нативная платформа существенно отличается по "архитектуре" от виртуальной, то преобразование одной в другую сожрет существенную часть производительности.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 10:21:43 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 07:19:18 qw1</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27533292</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27533292</link>
      <description><![CDATA[<p>Вам не очевидно, что любой интерпретатор будет проигрывать native? Хотя бы потому что, процессору приходится выполнять в разы больше инструкций для выполнения одного и того же действия.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 07:19:18 GMT</pubDate>
      <dc:creator><![CDATA[qw1]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 00:56:38 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27532858</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27532858</link>
      <description><![CDATA[<p>Да, volatile для всех переменных в цикле native тоже не забудьте. Иначе компилятор сожмет его до пустого цикла. :-)</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 00:56:38 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 00:54:05 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27532854</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27532854</link>
      <description><![CDATA[<p>Вы задачу у native увеличить не забыли ? У меня native выполняется на этой задаче более 5 сек.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 00:54:05 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 00:49:06 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27532844</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27532844</link>
      <description><![CDATA[<p>Кажется что разница значительная, но на самом деле картинка вводит в заблуждение. Добавление native варианта позволяет сопоставить в масштабе</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/26f/93e/0fc/26f93e0fca6754d56412b7833ae5071f.png" width="640" height="480"></figure><p></p>]]></description>
      <pubDate>Sat, 09 Nov 2024 00:49:06 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 00:47:01 checkpoint</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27532838</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27532838</link>
      <description><![CDATA[<p>Не густо, но тоже результат. :) </p><p>Дайте мне свой код, я прогоню его на моей машине.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 00:47:01 GMT</pubDate>
      <dc:creator><![CDATA[checkpoint]]></dc:creator>
    </item>
  

  
    <item>
      <title>09.11.2024 00:34:12 Rigidus</title>
      <guid isPermaLink="true">https://habr.com/ru/articles/856480/#comment_27532822</guid>
      <link>https://habr.com/ru/articles/856480/#comment_27532822</link>
      <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/b03/1f9/762/b031f9762a5703f387e97f2be366d42b.png" width="640" height="480"></figure><p>У меня вот такие результаты.</p>]]></description>
      <pubDate>Sat, 09 Nov 2024 00:34:12 GMT</pubDate>
      <dc:creator><![CDATA[Rigidus]]></dc:creator>
    </item>
  

      

      

    
  </channel>
</rss>
