R:Оптимизация/Компиляция в байт-код — различия между версиями

Материал Psylab.info - энциклопедии психодиагностики
Перейти к: навигация, поиск
м (Примечания)
м (Компиляция функций и выражений)
Строка 29: Строка 29:
  
 
== Компиляция функций и выражений ==
 
== Компиляция функций и выражений ==
 +
 +
Компиляция функций осуществляется с помощью функции <code>cmpfun()</code>. Возьмём пример из документации к функции <code>cmpfun()</code>, вкотором предлагается сравнить производительность различных реализаций функции <code>lapply()</code>, а также их скомпилированных версий:
 +
 +
{{r-code|code=<nowiki># old R version of lapply
 +
la1 <- function(X, FUN, ...) {
 +
    FUN <- match.fun(FUN)
 +
    if (!is.list(X))
 +
        X <- as.list(X)
 +
    rval <- vector("list", length(X))
 +
    for(i in seq(along = X))
 +
        rval[i] <- list(FUN(X[[i]], ...))
 +
    names(rval) <- names(X)   # keep `names' !
 +
    return(rval)
 +
}
 +
# a small variation
 +
la2 <- function(X, FUN, ...) {
 +
    FUN <- match.fun(FUN)
 +
    if (!is.list(X))
 +
        X <- as.list(X)
 +
    rval <- vector("list", length(X))
 +
    for(i in seq(along = X)) {
 +
        v <- FUN(X[[i]], ...)
 +
        if (is.null(v))
 +
            rval[i] <- list(v)
 +
        else
 +
            rval[[i]] <- v
 +
    }
 +
    names(rval) <- names(X)   # keep `names' !
 +
    return(rval)
 +
}</nowiki>}}
 +
 +
Скомпилируем эти функции в бат-код:
 +
 +
{{r-code|code=<nowiki>> la1c <- cmpfun(la1)
 +
> la2c <- cmpfun(la2)
 +
> lapplyc <- compfun(lapply)</nowiki>}}
  
 
== Компиляция скриптов ==
 
== Компиляция скриптов ==

Версия 13:08, 4 мая 2014


В данном материале рассматривается один из способов ускорения выполнения кода путём компиляции в байт-код. Байт-код - машинно-независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором. Большинство инструкций байт-кода эквивалентны одной или нескольким командам ассемблера. Трансляция в байт-код занимает промежуточное положение между компиляцией в машинный код и интерпретацией.

Программа на байт-коде обычно выполняется интерпретатором байт-кода (обычно он называется виртуальной машиной, поскольку подобен компьютеру). Преимущество - в портируемости, т. е. один и тот же байт-код может исполняться на разных платформах и архитектурах. То же самое преимущество дают интерпретируемые языки. Однако, поскольку байт-код обычно менее абстрактный, более компактный и более «компьютерный», чем исходный код, эффективность байт-кода обычно выше, чем чистая интерпретация исходного кода, предназначенного для правки человеком.

В составе базовых пакетов R поставляется пакет compiler, который входит состав ядра R, но не загружается по умолчанию при старте R-сессии. Данный пакет включает в себя ряд функций для компиляции R-кода в байт-код.

Параметры компиляции

Все рассмотренные ранее функции из пакета compiler имеют опции, которые могут быть переданы в качестве аргументов функциям компиляции (аргумент options), или заданы глобально с помощью функции setCompilerOptions().

Рассмотрим эти опции:

  • optimize --- определяет уровень оптимизации: принимает значения от 0 до 3 (по умолчанию 2);
  • suppressAll --- управляет сообщениями: принимает значения TRUE или FALSE (по умолчанию code>FALSE</code>);
  • suppressUndefined --- управление сообщения о неопределённых (undefined) переменных: может принимать значения TRUE или список имён переменных (по умолчанию ".Generic", .Method", ".Random.seed", ".self").

Получить текущее значение глобальных опций компиляции можно с помощью функции getCompilerOption():

КодR

<syntaxhighlight lang="r">> getCompilerOption("optimize") [1] 2 > getCompilerOption("suppressAll") [1] FALSE > getCompilerOption("suppressUndefined") [1] ".Generic" ".Method" ".Random.seed" ".self"</syntaxhighlight>

Компиляция функций и выражений

Компиляция функций осуществляется с помощью функции cmpfun(). Возьмём пример из документации к функции cmpfun(), вкотором предлагается сравнить производительность различных реализаций функции lapply(), а также их скомпилированных версий:

КодR

<syntaxhighlight lang="r"># old R version of lapply la1 <- function(X, FUN, ...) { FUN <- match.fun(FUN) if (!is.list(X)) X <- as.list(X) rval <- vector("list", length(X)) for(i in seq(along = X)) rval[i] <- list(FUN(X[[i]], ...)) names(rval) <- names(X) # keep `names' ! return(rval) } # a small variation la2 <- function(X, FUN, ...) { FUN <- match.fun(FUN) if (!is.list(X)) X <- as.list(X) rval <- vector("list", length(X)) for(i in seq(along = X)) { v <- FUN(X[[i]], ...) if (is.null(v)) rval[i] <- list(v) else rval[[i]] <- v } names(rval) <- names(X) # keep `names' ! return(rval) }</syntaxhighlight>

Скомпилируем эти функции в бат-код:

КодR

<syntaxhighlight lang="r">> la1c <- cmpfun(la1) > la2c <- cmpfun(la2) > lapplyc <- compfun(lapply)</syntaxhighlight>

Компиляция скриптов

Ещё одна возможность, предоставляемая пакетом compiler - это компиляция R-скриптов. Создание скомпилированных файлов осуществляется с помощью функции \texttt{cmpfile()}, а загрузка скомпилированных файлов с помощью функции loadcmp(). Если выходной файл не указан, то выходной файл имеет тоже имя, что и входной, но с расширением .Rc. Пример использования:

КодR

<syntaxhighlight lang="r">> cmpfile("script.R", "script.Rc") > loadcmp("script.Rc")</syntaxhighlight>

Примечания