dburtsev (dburtsev) wrote,
dburtsev
dburtsev

Categories:

Может ли скриптовый язык обогнать С?

Но питон, как язык, не обязан быть медленным - у него медленная только эталонная реализация, которая накладывает достаточное кол-во ограничений на программу, чтобы гарантировать невозможность значительной оптимизации. Да, к сожалению, стандартная библиотека питона никуда не годится. Но давай вспомним, почему она вообще возникла такая?

А произошло это потому, что первые реализации питона были беспросветно тормознутыми, и банальная работа со строками не могла быть написана на питоне - слишком медленно. Отсюда возникло знаменитое движение по созданию Си функций на каждый чих и пук — мне особенно понравилась функция для вычисления exp1, который вычисляет «e^x - 1» — даже такое банальное вычисление засунули в функцию на Си. Здесь возникает проблема статичной компиляции, которую мало кто из кодеров понимает. А дело в том, что JIT-компилированный код может легко обскакивать по производительности модульный AOT-компилированный, даже с учетем накладных расходов на трассировку и компиляцию во время выполнения. В частности, не так давно в «benchmarking game» LuaJIT выносил неокрепшие мозги, обгоняя по скорости выполнения проги на C/C++.

Но как так может быть, что скриптовуха дает пососать сишечке? Поясню на примере:
import math

def sum_exp(list):
sum = 0.0
for val in list:
sum += math.exp(val)

print(sum_exp([a, b, c, d]))

Не считая импортов, здесь CPython сделает 4 разных запроса к ассоциативному массиву по ключу-строке, из них два, math и exp, будут в цикле (__iter__ и __next__ являются слотами, потому на них всегда есть быстрые указатели). Трассирующий компилятор или AOT-оракул-бабаванга-компилятор сможет превратить это в ноль выборок из ассоциативных массивов и вызов одной единственной функции print, производя все вычисления в регистрах при помощи несколько десятков машинных команд. В отсутствие ветвления производительность такого кода будет огромной. Что-то близкео к этому мог бы сделать PyPy, но ограничения языка не дают ему развернуться в полной мере. Даже GCC с вызовами функций из отдельно скомпилированных библиотек будет работать медленнее, чем оптимальный код питона. Это одна из причин, почему в жаве библиотеки сделаны на жаве — они JIT-инлайнятся в нужные места по необходимости, а JNI использовать не рекомендуется. В итоге Java код отстается от сишного только потому, что сишный код использует небезопасные операции.
https://www.linux.org.ru/forum/development/15379357?cid=15418054

Ссылка на "обгоняя по скорости выполнения проги на C/C++"
https://web.archive.org/web/20081224093034/http://shootout.alioth.debian.org/u32q/benchmark.php?test=pidigits&lang=all

Сам автор поправился "Ну да, LuaJIT где-то на уровне жавы/шарпа. Но близко к сям, согласитесь."
Tags: it
Subscribe

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments