MouseOver Studio

MouseOver Studio header image 2

Apresentando CompiledScript e Compilable para melhorar a performance de teus programas JRuby e similares

agosto 31st, 2008 por Diego Carrion · 4 comentários

Quando avaliamos alguma script na JVM utilizando o método eval da classe javax.script.ScriptEngine basicamente são realizadas duas tarefas: a compilação do script e a execução dele.

Caso queiramos avaliar x vezes o mesmo script e estejamos chamando o método eval mencionado, o script ira ser compilado x vezes.

O mesmo script precisa ser compilado x vezes?

Não!

O que fazer ao respeito?

A especificação JSR-233 conta com uma classe chamada CompiledScript que como o mesmo nome diz, representa um script compilado, de modo que quando queiramos avaliar o script o único que vamos ter que fazer é executar ele.

Para compilar um script primeiro temos que realizar um casting do engine para a interfase Compilable e logo chamar o metodo compile:

CompiledScript compiledScript = ((Compilable) engine).compile(script)

Logo, quando queiramos avaliar o script compilado o único que vamos ter que fazer e chamar o método eval, passando como parâmetro o contexto (opcional):

Object result = compiledScript.eval(context)

Tags: java · jruby · jsr · optimizacao · ruby · Uncategorized

4 respostas ate agora ↓

  • 1 Cid R Andrade // set 11, 2008 at 4:45 pm

    Diego, tem uma homenagem para você e para o MouseOver no meu blog. Quando puder, visite-o!

  • 2 Davis Zanetti Cabral // set 14, 2008 at 10:37 am

    Graaaande Diego!

    Obrigado pela informação no meu blog! Realmente é verdade, há diferença entre os exemplos.

    Abraço!

  • 3 Abraao Isvi // set 14, 2008 at 12:01 pm

    Olá vc saberia me dizer, se existe alguma maneira de chamar uma função de um compiledscript? tipo eu desejo usar um mesmo compiled script mas com contextos diferentes e chamando as funções em separado. Você saberia como me responder?

    Grato!

  • 4 Diego Carrion // set 14, 2008 at 2:08 pm

    @Davis

    nao foi nada :) obrigado voce pelo excelente post

    @Abraao

    No Haml4j eu utilizo na inicializaçao:

    compiledScript = ((Compilable) engine).compile(“render()”);

    e futuramente:

    (String) compiledScript.eval(context);

    e também poderia fazer:

    compiledScript.eval(context2);
    compiledScript.eval(context3);

    É isso o que voce quer fazer?

Deixar um comentário