CajuScript - Nova Versão! Um grande salto

31 respostas
eduveks

:arrow: http://www.cajuscript.org/

Olá a todos,

Depois de muito trabalhinho e muitos testes, finalmente esta pronta a versão 0.2, com muitas novidades:

:arrow: Muito mais rápido como podem ver no gráfico.

:arrow: A Syntax pode ser custumizada, até é possível fazer uma syntax em português, código que o cliente pode mexer pode ser útil, mas também para quem não aprecia a syntax padrão pode criar a sua.

:arrow: Suporte a Try/Catch, com a possibilidade de usar a variável da exception no finally.

:arrow: E no loop agora é suportado o Break e o Continue.

:arrow: Também é suportado o conceito de contexto global e local nas funções.

E de ter algum orgulho nacional… onde as duas linguagens mais rápidas para Java são feitas por brasileiros! :stuck_out_tongue:

Outras caracteristicas do CajuScript podem ser conferidas no post de lançamento aqui no forum:

:arrow: http://www.guj.com.br/posts/list/79718.java

E mais uma vez faço o convite para quem estiver interesse em participar de alguma forma com o projeto, será muito bem vindo pois temos muito mais desafios pela frente.

Aguardo ai sugestões, dúvidas e críticas.

Abraço.

31 Respostas

O

Como eu disse em outro post preferiria que fosse em portugues, algo do tipo aon invés de try um tentar, ao invés de um catch um pegar… aí sim seria uma linguagem realmente brasileira.

Assim me parece uma linguagem feita por brasileiros tentando ser americana.

Com isso teria uma grande utilidade nas aulas de algoritmos das universidades, que utilizam o antigo visualg.

E esse tipo de comparação não engana ninguém, vc não pode comparar uma linguagem 0.2 com uma outra 1.0. Conforme sua linguagem crescer ela vai ficar mais lenta. Compara quando vc tiver uma versão 1.0. Aí vamos ver essa tal velocidade.

E como ter “orgulho nacional” se até o site do projeto é todo em inglês? :oops:

eduveks

Acho que não entendeu ou eu não fui claro o suficiente, custumizar a syntax é criar a syntax como quiser, inclusive fazer uma syntax em português, veja com atenção este link:

http://code.google.com/p/cajuscript/wiki/sampleSyntax

Outra quanto a velocidade não é bem assim, pois o loop não muda! Por mais que a linguagem cresça isto não influencia no desempenho em loop e a qualidade do parser. :wink:

A syntax é totalmente custumizável, para Inglês, Português, Espanhol, Russo, Japonês, etc :stuck_out_tongue:

Rubem_Azenha

onolox:
Como eu disse em outro post preferiria que fosse em portugues, algo do tipo aon invés de try um tentar, ao invés de um catch um pegar… aí sim seria uma linguagem realmente brasileira.

Assim me parece uma linguagem feita por brasileiros tentando ser americana.

Com isso teria uma grande utilidade nas aulas de algoritmos das universidades, que utilizam o antigo visualg.

E esse tipo de comparação não engana ninguém, vc não pode comparar uma linguagem 0.2 com uma outra 1.0. Conforme sua linguagem crescer ela vai ficar mais lenta. Compara quando vc tiver uma versão 1.0. Aí vamos ver essa tal velocidade.

E como ter “orgulho nacional” se até o site do projeto é todo em inglês? :oops:

Qual o problema do site ser em inglês? Acho legal uma pessoa da comunidade desenvolver um projeto como este e entendo que como a maioria dos desenvovledores do mundo não falam português, o cara queira deixar o site em inglês para mais pessoas teram acesso ao mesmo. E é até melhor que ele mantenha apenas um site em inglês e se concentre em melhorar o projeto dele do que ficar gastando tempo em traduzir para português. Inclusive quem se incomodar tanto com isso pode ajudar o cara traduzindo o site.

Agora, linguagem em portugues? Isso iria limitar muito o uso da linguagem.

pcalcado

Edu, parabéns. Ainda não testei o caju mas é muito legal ver gente fazendo algo em áreas mais complexas do que webapps.

eduveks

Obrigado pelo apoio Rubem, e é isto mesmo, o teu ponto de vista é mais ou menos o meu, em inglês o público alvo é maior, e infelizmente o pessoal reclama que o Brasil tem poucos projetos opensource e quando alguem toma iniciativa recebe pouco apoio, mas isto não importa por que independente disto o projeto foi pra frente e esta indo, e minhas razões e motivações para este projeto são outras, se alguém vai usar não sei, eu sei q eu e minha empresa usamos e muito, e é isto q interessa.

Mas quanto a tradução para o portugues era interessante alguem que tiver disponibilidade fazer isto, pois eu não sou dois nem 3, e não consigo fazer tudo, e como ja convidei, volto a convidar, quem estiver interessado as portas estão abertas.

Quanto a linguagem em português, fazer um motor de scripts só para uma syntax em Português seria algo que não vingaria com certeza, por isso a Syntax é dinâmica, é customizavél, é possível criar a syntax que quiser, como já expliquei acima, claro que em alguns casos isto pode ser muito útil.

Por exemplo o cliente que entende pouco de programação poderá ter a liberdade de fazer pequenas alteraçõe quando precisar e ai convém ter um código em português por exemplo, e o CajuScript esta pronto para isto! Imagina uma regra para calcular as notas de cada curso, ou para calcular o imposto dos produtos, são regras que mudam e é interessante o cliente ter esta liberdade com uma linguagem feita a sua medida, é um ponto que pode fazer a diferença com a concorrência.

As linguagens de script tem muitas saídas, o problema é até as vezes falta alguma criatividade. No CajuScript o objetivo é ser o mais dinâmico, leve e fácil de usar e se adaptar as situações, mantendo sempre a simplicidade. E há muitos cenários em que o CajuScript pode ser usado com algumas caracteristicas mais fortes que outras linguagens.

eduveks

Obrigado, mas… o CajuScript esta a ser usado em Web :stuck_out_tongue:

Foi até para este fim que foi feito :lol:

O CajuScript faz parte de outros porjetos voltados para Webapps usando linguagens de scripts e muito mais, é toda uma plataforma de desenvolvimento que tenho vindo a trabalhar a cerca de 5 anos, e o CajuScript é a ponta de um iceberg, vou abrir outros projetos também, mas talvez 1 deles se eu conseguir o patrocinio ideal vai ser comercial, e este é que une todos os outros projetos. O CajuScript foi o último a nascer e foi o que saio pra fora primeiro, espero dentro em breve lançar os outros 4 projetos.

E ja há alguns sites pequenos usando CajuScript, em breve terá um site de uma multinacional também com CajuScript, que é o qual estamos trabalhando no momento, quando o site estiver pronto e no ar eu anuncio aqui, para ficarem por dentro :wink:

eduveks

onolox, fiz este exemplo pra ti:

Sintaxe em Português usando o CajuScript:

http://eduveks.blogspot.com/2008/03/que-tal-uma-sintaxe-em-portugues.html

Só fazer o download do arquivo, extrair, e depois fazer o download do CajuScript também, colocar tudo dentro da mesma pasta, e ai é só executar o .bat.

:wink:

S

onolox:

Assim me parece uma linguagem feita por brasileiros tentando ser americana.

Não sabia que o único lugar do mundo onde se fala inglês é nos EUA. :roll:

Parabéns, eduveks. Ainda não tive oportunidade de testar, mas parece bem interessante.

mchiareli

algum motivo especial para a classe CajuScriptEngine não implementar Compilable??

eduveks

falta de tempo mesmo, mas não achei q fosse tão importante para já, e não dei prioridade, infelizmente… tb fica a disposição para alguém tomar a iniciativa :wink:

MauNunes

Eu acho interessante essa área, porem ainda não vi nenhuma vantagem na criação de uma linguagem de script.
Porem queria parabenizar o eduveks , pelo trabalho feito. Só falta melhorar a documentação, porque eu nem sei como fazer funcionar o o caju script. Se alguem puder me ajudar eu agradeço.

E tem mais, parabenizo o eduveks , pelo fato de estar criando algo diferente dentro da plataforma aqui bo Brasil, e não é mais um framework mvc.

Abraços

eduveks

Obrigado pelo apoio, e para te ajudar, tem este codigo na homepage:

javax.script.ScriptEngine caju = new org.cajuscript.CajuScriptEngine(); String javaHello = "Java: Hello!"; caju.put("javaHello", javaHello); String script = "$java.lang;"; script += "System.out.println(javaHello);"; script += "cajuHello = 'Caju: Hi!';"; caju.eval(script); System.out.println(caju.get("cajuHello"));

Isto ja ´e um começo, repare q o Java manda um objeto para o Caju e pega um Objeto do Caju, depois tem o resumo da Syntax:

http://code.google.com/p/cajuscript/wiki/tutorialSyntax

E nesta pagina da Syntax tem o link para mais detalhes de cada bloco.

Claro q isto tudo da syntax ´e mais para a syntax padrao, se for uma syntax personalizada ´e outra historia…

Mas ´e muito simples, em 10 minutos dedicando atençao se aprende CajuScript.

Marky.Vasconcelos

Gosteido CajuScript to começando a testar.

E só uma ideia porque não cria algo para sobrecarregarmos operadores?

rodrigoallemand

Obrigado, mas… o CajuScript esta a ser usado em Web :stuck_out_tongue:

Foi até para este fim que foi feito :lol:

Acho que o que ele quiz dizer (e como eu tb penso) é que vc está fazendo um projeto que é mais do que um simples sistema Web, por mais complexa que esta WebApp possa ser… sacou?!? Vc está desenvolvndo uma coisa que fomenta a curiosidade e o estudo nas pessoas, o que evolui o simples desenvolvedor…
Ah, meus parabêns tb!!!

eduveks

Obrigado, mas… o CajuScript esta a ser usado em Web :stuck_out_tongue:

Foi até para este fim que foi feito :lol:

Acho que o que ele quiz dizer (e como eu tb penso) é que vc está fazendo um projeto que é mais do que um simples sistema Web, por mais complexa que esta WebApp possa ser… sacou?!? Vc está desenvolvndo uma coisa que fomenta a curiosidade e o estudo nas pessoas, o que evolui o simples desenvolvedor…
Ah, meus parabêns tb!!!

Sim sim, eu entendi, mas tb só quiz explicar que o CajuScript esta sendo também usado em projetos web, só por informação…

Mas obrigado pelo exclarecimento e nesta sua última frase:

Nunca tinha pensado neste sentido, mas a minha intensão de fazer uma sintaxe custumizável também é de ser um recurso de auxílio em aulas de iniciação a programação, podendo ter a sintaxe em português, onde o professor pode definir a sua sintaxe para melhor explicar ao aluno, fazendo com que o aprendizado seja muito mais fácil e mais intuitivo… e também para quem já entende bem o que é um if, um while, uma function, pra que digitar palavras tão longas, e pode ter uma sintaxe mais geek, e isto faz alguma diferença :wink:

eduveks

Mark_Ameba:
Gosteido CajuScript to começando a testar.

E só uma ideia porque não cria algo para sobrecarregarmos operadores?

Isto é algo muito importante, os únicos que são suportados no momento são:

+= -= *= /= %=

Para o resto temos ainda muito por onde pegar neste sentido…

Se esta usando, e esta gostando, e tem idéias, que tal participar do projeto? Fica ai o convite, seria muito bom :wink:

O jfbarro entrou para o projeto e tem uma tarefa importantissima que vai melhorar e muito a customização da sintaxe.

Se quiser um desafiozinho para ir “brincando” de vez em quando, seria muito bem vindo, assim como qualquer outro com interesse em ajudar o projeto.

Marky.Vasconcelos

Eu digo sobrecarregar operadores nas classes
Algo como no C

Por exemplo numa classe Vector3d (Comum em programas 3D)

Voce tem algo assim

public Vector3d add(Vector3d other){
return new Vector3d(x+other.x,y+other.y,z+other.z);
}

Minha ideia é em script não ter que chamar assim

var vec1 = Vector(0.f,0.f,0.f);
var vec2 = Vector(.5f,.5f,.5f);
var vec = vec1 + vec2;

Entende?

Mas é claro precisaria implementar os métodos certos na classe.

eduveks

Isto é um conceito interessante, somar objetos baseado no construtor/objeto? Se for o mesmo objeto e tiver o mesmo construtor faz a soma?

O problema é definir o padrão, por exemplo, como vou pegar os valores do obj1 + obj2 = obj3? Seria por métodos get? Variáveis públicas?

Meio complicado definir um padrão, só se estas classes implementassem uma interface, ou se o cajuscript tivesse um objeto especifico para este fim e fizesse isto automaticamente para este determinado objeto…

O que quero fazer ainda é suportar a soma de arrays do tipo int/long/float/double fazer as somas de cada posição…

a = array.create(“int”, 2)

array.set(a, 0, 1)

array.set(a, 1, 2)

b = array.create(“int”, 2)

array.set(b, 0, 1)

array.set(b, 1, 2)

c = b + a

o C seria igual a {2, 4}…

e também o objetivo nas próximas versões é acabar com o objeto “array.*” e sim ser como em outras linguagens de script […]

com a funcionalidade de somar arrays já não resolveria o teu problema? quando tiver suportando isto das somas do array claro :stuck_out_tongue:

vou tentar acrescentar este recursos para a próxima versão do CajuScript.

Marky.Vasconcelos

Acho que oque falei seria algo assim:

Em java

public class Vector3d{
private double x,y,z;
public Vector3d(double x, double y, double z){
this.x = x;
this.y = y;
this.z = z;
}

//Método necessário para rodar o script
public Vector3d operatorAdd(Vector3d vec){
return new Vector3d(x+vec.x,y+vec.y,z+vec.z);
}
}

no CajuScript

var vec1 = Vector3d(0.0d,0.0d,0.0d);   
var vec2 = Vector3d(0.5d,0.5d,0.5d);   
var vec = vec1 + vec2; //Essa linha chamaria o método sobrecarregado operatorAdd

O mesmo para os operadores - , * e / substituindo por operatorMinus, operatorTimes, …

Entende?

Eu queria tentar implementar mas acho muito complicado pegar todos os sources pelo SVN Repository e sempre me complico, se voce tiver um modo mais fáçil de baixar as fontes eu posso tentar fazer.

Marky.Vasconcelos

O melhor esquema seria implementar uma interface com os operadores.

eduveks

Sim, uma interface seria o melhor! Se quiser avançar com isso posso te ajudar no caminho das pedras.

Para pegar a source custumo usar o http://www.syntevo.com/smartsvn/download.html

A url do repositório é http://cajuscript.googlecode.com/svn/trunk/

Mas se prefirir eu te mando um e-mail com a source em zip… falamos melhor por mensagens privadas e e-mail :wink:

G

Olá.

Eu tenho problemas com desempenho do Groovy. No sistema que faço parte precisavos fazer importação de grandes arquivos de texto com formatos diferenciados. A solução que usamos foi utilizar grovvy para customização. Até aí tudo bem, mas notamos que 80% do tempo de importação é gasto com a execução do script. Quando vi o CajuScript informar ser até 50% mais rapido resolvi testar.

Com o teste que foi executado realmente o caju é mais rápido, porém quando aumentamos o numero de interações para 1 milhão e 10 milhões o groovy se demonstrou bem mais rápido. Chegou a ficar até 2 vezes mais rápido. Talvez seja necessário um teste mais preciso para avaliar qual dos dois seia mais rápido. Vou prosseguir nos testes realizando comparações, utilização de condicionais e arrays e postarei os resultados.

Abraços

eduveks

gugarn:
Olá.

Eu tenho problemas com desempenho do Groovy. No sistema que faço parte precisavos fazer importação de grandes arquivos de texto com formatos diferenciados. A solução que usamos foi utilizar grovvy para customização. Até aí tudo bem, mas notamos que 80% do tempo de importação é gasto com a execução do script. Quando vi o CajuScript informar ser até 50% mais rapido resolvi testar.

Com o teste que foi executado realmente o caju é mais rápido, porém quando aumentamos o numero de interações para 1 milhão e 10 milhões o groovy se demonstrou bem mais rápido. Chegou a ficar até 2 vezes mais rápido. Talvez seja necessário um teste mais preciso para avaliar qual dos dois seia mais rápido. Vou prosseguir nos testes realizando comparações, utilização de condicionais e arrays e postarei os resultados.

Abraços

Olá Gugarn,

Exatamente, a situação real é a seguinte, CajuScript é muito rápido para iniciar, carregar o script e executar o script, mas quando tem muitos loops demorados por exemplo, como parece ser o teu caso, o CajuScript não consegue bater o Groovy.

Eu tenho noção das limitações do CajuScript comparado com o Rhino, existe apenas dois pontos que o Rhino é ainda mais rápido que o CajuScript, é ao criar novas instâncias de classes Java em Loops longos, e chamada de métodos com parâmetros em loops longos também. Invocação a métodos sem parâmetros em loops longos o CajuScript é mais rápido que o Rhino, mas em loops curtos o CajuScript sempre ganha, que é o que o teste que esta postado no site quer demonstrar.

O Rhino no desenvolvimento da versão 0.3 foi o ponto de referência, tentamos bater ele nos pontos que pudemos, e deixamos outros objetivos para as próximas versões, quanto a performance CajuScript vs Groovy nem faziamos muita idéia, como temos nos baseado somente no Rhino.

Bem com o CajuScript estamos o deixando apto para alta performance em ambiente Web, voltado para a framework que estamos desenvolvendo, e já usando em produção.

No nosso cenário os scripts são com loops curtos, é preciso criar várias instâncias do engine de script em multithreads e por isso tem que ser leve e o mais rápido possível neste cenário. E o CajuScript já alcansou este patamar de satisfação na versao 0.2, entretanto na versão 0.3 chega a ser 30% mais rápido no mínimo. Para o ambiente web creio que o CajuScript é o que consegue a melhor performance entre todos os outros, por que também estamos a faze-lo voltado para isto.

Agora quanto ao teu problema, se com o Groovy vc não esta tendo performance aceitável, talvez só em Java mesmo vc vai conseguir resultados mais satisfatórios, se vc puder e tiver tempo poderia me enviar por e-mail mais detalhes do teu problema? Para podermos investigar melhor e tentar futuramente melhorar o CajuScript neste aspecto também.

Para a versão 0.4 ou 0.5 temos como um dos desafios poder compilar scripts em bytecode, estamos pensando nisto e estudando a melhor abordagem, e queremos ter um protótipo já na versão 0.4, como o IronRuby e o IronPython fazem em .Net, gerando assemblies.

Muito obrigado pela chamada de atenção e pela sua partilha do problema. Não esqueça de se puder enviar mais detalhes, ok?

Valeu

romuloff

Schuenemann:
onolox:

Assim me parece uma linguagem feita por brasileiros tentando ser americana.

Não sabia que o único lugar do mundo onde se fala inglês é nos EUA. :roll:

Parabéns, eduveks. Ainda não tive oportunidade de testar, mas parece bem interessante.

Desculpe uma resposta não muito voltada ao assunto.
Simplesmente porque sou mais um que achou este comentário absurdo.
Caro onolox, é lóóóóóógico que o normal é seguir um padrão.

Trocar try/catch por tentar/capturar seria a mesma coisa que o GUJ ter que trocar alí na barra lateral HOME por CASA ; Login por Logar e Logout por Deslogar.

finally { Pelo amor de Deus, que cabeça. ah nem. } :twisted:

G

Olá eduveks,

É um prazer poder compartilhar meu problema. Trabalho com softwares que importa dados de processos petroquimicos industriais (refino, transporte e explorção de petroleo). Então já imaginou a quantidade de dados gerado em um só dia né? Então cada dia de dados tem em média 100 mil registros em arquivo TEXTO para serem importados para a base de dados do sistema. Acontece que dependendo do ambiente industrial esse arquivo muda muito de padrão e em alguns casos simplesmente não há padrão!

Para que o software podesse se customizar as necessidades, sem ser preciso de uma recompilação e gerar nova versão do sistema, colocamos a funcionalidade de poder inserir um script para a interpretação do dado. Basicamente o script será executado para cada liha do arquivo. Existe vários passos a serem executados antes do script executar e basicamente o script lhe fornece a possibilidade de “entender” a linha lida. Então para cada linha do arquivo de texto é gerado um array de colunas que é enviada ao script para que o usuário possa fazer alguma computação necessária.

Então usamos funcionalidades simples do script como, por exemlpo:

if coluna[0] = “VLR” {

coluna[0] = "VALOR"

}

e por aí vai…

Então no funddo não executamos um longo scrtipt e sim um mesmo script curto várias vezes! Então precisamos recarregar o script o numero de linhas do arquivo. O groovy demora bastante pra realizar esta tarefa. Eu testei o CajuScript apenas aumentando a quantidade de loops do teste realizados por você, isso por que não tive ainda tempo de fazer um teste mais voltado para as nossas necessidades e comparar desempenho.

Amanhã irei fazer algumas simulações e postarei os resultados. De qualquer forma muitissimo obrigado pela ajuda e rapidez na resposta e só o fato de ter alguem realmente interessado em ajudar já me deixa bastante satisfeito.

E se o CajuScript se tornar vantajoso, com certeza adotaremos. Afinal o Grovvy realmente é bastante lento neste caso.

eduveks

gugarn, se é o mesmo script varias vezes, e praticamente não tem loops, o CajuScript 0.3 com o sistema de cache deverá ser uma mão na roda pra ti.

Como expliquei anteriormente o CajuScript 0.3 com cache na pior das hipoteses chega a ser 30% mais rápido do que a versão 0.2.

Faz um teste assim:

for (int i = 0; i < 100; i++) { javax.script.ScriptEngine caju = new org.cajuscript.CajuScriptEngine(); caju.put("colunas", new String[] {"VLR"}); caju.eval("caju.cache test; array.get(colunas, 0) = 'VLR' ? array.set(colunas, 0, 'VALOR'); ?;"); System.out.println(((String[])caju.get("colunas"))[0]); }

E compara a mesma situação com o Groovy.

Deve ser um teste mais próximo do teu cenário.

Usando o sistema de cache, se o script é sempre o mesmo, vai ficar bala, para cada script tem q ter um ID do cache diferente, pois é este ID que identifica qual é o cache a ser usado.

caju.cache: ID_DO_CACHE;

Os ":" tanto faz, pode ser também:

caju.cache - ID_DO_CACHE;

Etc… o que interessa é o espaço antes de começar a ID do cache.

Tenta assim então e depois diz ai o resultado :wink:

eduveks

Fiz aqui este teste:

long time;
        time = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            javax.script.ScriptEngine caju = new org.cajuscript.CajuScriptEngine();
            caju.put("colunas", new String[] {"VLR"});
            caju.eval("caju.cache test; array.get(colunas, 0) = 'VLR' ? array.set(colunas, 0, 'VALOR'); ?;");
        }
        System.out.println("CajuScript: "+ (System.currentTimeMillis() - time) + "ms");
        time = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            groovy.lang.GroovyShell groovyShell = new groovy.lang.GroovyShell();
            groovyShell.setVariable("colunas", new String[] {"VLR"});
            groovyShell.evaluate("if (colunas[0].equals(new String(\"VLR\"))) {\n colunas[0] = \"VALOR\"\n }\n");
        }
        System.out.println("Groovy: "+ (System.currentTimeMillis() - time) + "ms");

Resultado:

E outro iniciando os engines fora do loop:

long time;
        time = System.currentTimeMillis();
        javax.script.ScriptEngine caju = new org.cajuscript.CajuScriptEngine();
        for (int i = 0; i < 1000; i++) {
            caju.put("colunas", new String[] {"VLR"});
            caju.eval("caju.cache test; array.get(colunas, 0) = 'VLR' ? array.set(colunas, 0, 'VALOR'); ?;");
        }
        System.out.println("CajuScript: "+ (System.currentTimeMillis() - time) + "ms");
        time = System.currentTimeMillis();
        groovy.lang.GroovyShell groovyShell = new groovy.lang.GroovyShell();
        for (int i = 0; i < 1000; i++) {
            groovyShell.setVariable("colunas", new String[] {"VLR"});
            groovyShell.evaluate("if (colunas[0].equals(new String(\"VLR\"))) {\n colunas[0] = \"VALOR\"\n }\n");
        }
        System.out.println("Groovy: "+ (System.currentTimeMillis() - time) + "ms");

Resultado:

Teste com o Groovy 1.5.7 e CajuScript 0.3.

Não sou um expert em Groovy, muito pelo contrário, levei mó tempão para descobrir como fazer o IF com strings, não sei se o script do Groovy esta da melhor maneira, mas não consegui fazer de outro jeito mais simples, mas acho que não deve influenciar nos tempos.

Estes tempos do Groovy me assustam, isto esta correto? Tem alguma coisa errada ai?

G

Olá pessoal,

Fiz mais alguns testes com os scripts e tenho alguns resultados a postar para discurssões.
Nos testei usei um Pentium 4 com HyperThread 3ghz com 2Gb de memória e durante este período apenas a aplicação do teste estava sendo executada. Apesar do HyperThread, a JVM só usou 50% do processamento, isso por que ela não aloca automaticamente o outro processador, mas enfim.

A situação do teste foi semelhante a uma situação sem loops porém com uso de testes condicionais. Isso por que para minha aplicação é o que deverei utilizar ao contrário de scripts muito longos com loops longos.

  • O eixo X contém o número de interações. Fiz o teste até 100mil interações.

  • O eixo Y contém o o tempo em milissegundos gasto.

    [img]http://www.dca.ufrn.br/~guga/testeScripts_files/image003.png[/img]
    

Gostaria de comentar o consumo de memória. Para este teste o LUA chegou a consumir 63MB, o Groovy 160MB e o Caju, Incríveis 13MB. O gerenciamento do Caju me pareceu bastante bom, o LuaJava tem problemas realmente no gerenciamento de sua memória, pois o consumo aumenta linearmente com o numero de interações ( para um milhão de interações ele chegou a consumir 1GB ). Em contato com os desenvolvedores do LUA eles assumiram a falha e deverá ser corrigida na próxima versão. Diferentemente, o CajuScript se manteve estável independente do número de interações processadas.

Para um script que roda 100% dentro da plataforma JAVA o CajuScript tem um desempenho MUITO BOM. O LUA é realmente bem mais rápido, mas precisa de uma DLL para funcionar.

O Groovy se demostrou muito pesado e o gerenciamento da memória não me pareceu satisfatório, vou postar o código fonte e se alguem souber uma forma de melhorar este desempenho que poste seus comentários aqui. O Groovy me pareceu bom quando o script tem bastante loops demorados, mas para aplicações que precisam processar muitas vezes com curtos scripts ele não se demonstrou adequado.

O LUA não trata ainda array nativos do JAVA então fui obrigado a por o Array dentro do ArrayList e passar o objeto inteiro, porém isso deixou o LUA em desvantagem pois contabilizei este tempo como processamento do script. Mesmo assim o LUA por ser executado diretamente por uma DLL tem o desempenho muito bom.

Código fonte Utilizado para teste:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testecajuscript;

import java.util.ArrayList;
import javax.script.ScriptException;
import org.keplerproject.luajava.LuaState;

/**
 *
 * @author user
 */
public class ScriptsTester {

    public static void main(String[] args) {
        try {
            System.out.println("======================");
            System.out.println("Scripts Tester");
            System.out.println("======================");
            //testeLua(1000000);
            //testeCaju(100000);
            testeGroovy(100000);

        } catch (Exception e) {
            throw new Error(e);
        }
    }

    public static void testeCaju(int interacoes) throws ScriptException {

        long time = 0;

        String colunas[] = {"ZZ", "XX", "CC", "VV", "TT", "YY", "UU", "QQ", "WW", "EE", "RR"};

        String scriptCaju = "caju.cache test;";
        scriptCaju += "array.get(colunas, 0) = 'ZZ' ? array.set(colunas, 0, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 1) = 'XX' ? array.set(colunas, 1, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 2) = 'CC' ? array.set(colunas, 2, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 3) = 'VV' ? array.set(colunas, 3, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 4) = 'TT' ? array.set(colunas, 4, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 5) = 'YY' ? array.set(colunas, 5, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 6) = 'UU' ? array.set(colunas, 6, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 7) = 'QQ' ? array.set(colunas, 7, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 8) = 'WW' ? array.set(colunas, 8, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 9) = 'EE' ? array.set(colunas, 9, 'VALOR'); ?;";
        scriptCaju += "array.get(colunas, 10) = 'RR' ? array.set(colunas, 10, 'VALOR'); ?;";

        /*  Teste CajuScript */

        System.out.println("\n---------------- CajuScript ------------------");

        time = System.currentTimeMillis();
        javax.script.ScriptEngine caju = new org.cajuscript.CajuScriptEngine();
        for (int i = 0; i < interacoes; i++) {
            
            caju.put("colunas", colunas);
            caju.eval(scriptCaju);

            if (i == 1 || i == 100 || i == 1000 || (i >= 10000 && (i % 10000) == 0)) {
                System.out.println("Interações: " + i + " Tempo: " + (System.currentTimeMillis() - time) + "ms");
            }            

        }

        System.out.println("Interações Totais: " + interacoes + " Tempo Total: " + (System.currentTimeMillis() - time) + "ms ");


    }

    public static void testeGroovy(int interacoes) {

        long time = 0;

        String colunas[] = {"ZZ", "XX", "CC", "VV", "TT", "YY", "UU", "QQ", "WW", "EE", "RR"};

        String scriptGroovy = "(colunas[0] == 'ZZ' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[1] == 'XX' ? 'VALOR' :  ''); ";
        scriptGroovy += "(colunas[2] == 'CC' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[3] == 'VV' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[4] == 'TT' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[5] == 'YY' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[6] == 'UU' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[7] == 'QQ' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[8] == 'WW' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[9] == 'EE' ? 'VALOR' : ''); ";
        scriptGroovy += "(colunas[10] == 'RR' ? 'VALOR' : ''); ";

        System.out.println("\n---------------- Groovy ------------------");

        time = System.currentTimeMillis();
        
        for (int i = 0; i < interacoes; i++) {
            groovy.lang.GroovyShell groovyShell = new groovy.lang.GroovyShell();    
            groovyShell.setVariable("colunas", colunas);
            groovyShell.evaluate(scriptGroovy);

            if (i == 1 || i == 100 || i == 1000 || (i >= 10000 && (i % 10000) == 0)) {
                System.out.println("Interações: " + i + " Tempo: " + (System.currentTimeMillis() - time) + "ms");
            }

        }
        System.out.println("Interações Totais: " + interacoes + " Tempo Total: " + (System.currentTimeMillis() - time) + "ms ");


    }

    public static void testeLua(int interacoes) {

        long time = 0;

        String colunas[] = {"ZZ", "XX", "CC", "VV", "TT", "YY", "UU", "QQ", "WW", "EE", "RR"};

        String scriptLua = "if array:get(0) == 'XX' then array:set(0,'VALOR') end";
        scriptLua += "if array:get(1) == 'XX' then array:set(1,'VALOR') end";
        scriptLua += "if array:get(2) == 'XX' then array:set(2,'VALOR') end";
        scriptLua += "if array:get(3) == 'XX' then array:set(3,'VALOR') end";
        scriptLua += "if array:get(4) == 'XX' then array:set(4,'VALOR') end";
        scriptLua += "if array:get(5) == 'XX' then array:set(5,'VALOR') end";
        scriptLua += "if array:get(6) == 'XX' then array:set(6,'VALOR') end";
        scriptLua += "if array:get(7) == 'XX' then array:set(7,'VALOR') end";
        scriptLua += "if array:get(8) == 'XX' then array:set(8,'VALOR') end";
        scriptLua += "if array:get(9) == 'XX' then array:set(9,'VALOR') end";
        scriptLua += "if array:get(10) == 'XX' then array:set(10,'VALOR') end";

        /*  Teste LuaScript */

        System.out.println("\n---------------- LuaJava ------------------");



        ArrayList array;
        LuaState L;

        time = System.currentTimeMillis();



        array = new ArrayList();

        for (int j = 0; j < colunas.length; j++) {
            array.add(colunas[j]);
        }


        L = org.keplerproject.luajava.LuaStateFactory.newLuaState();
        L.openLibs();

        for (int i = 0; i < interacoes; i++) {
            
            L.pushJavaObject(array);
            L.setGlobal("array");
            L.LdoString(scriptLua);

            if (i == 1 || i == 100 || i == 1000 || (i >= 10000 && (i % 10000) == 0)) {
                System.out.println("Interações: " + i + " Tempo: " + (System.currentTimeMillis() - time) + "ms");
            }

            L.pop(1);

        }


        System.out.println("Interações Totais: " + interacoes + " Tempo Total: " + (System.currentTimeMillis() - time) + "ms ");

    }
}
eduveks

Muito obrigado Gugarn, muito bom mesmo, excelente trabalho!

Estou estremamente contente com este resultado, realmente tive muito trabalho para afinar a versão 0.3 e mais uma vez confirmo que valeu a pena.

Quanto ao LuaJava, eu implementei as interfaces de scripting do java 6 para o Lua, falava diretamente com o Thiago Ponte, eu usava LuaJava, mas me deparei com varios problemas, o principal foi problemas em multithreads, o LuaJava deixa threads penduradas, usar em ambiente web se tornou impraticável, eu mesmo assim insisti durante muito tempo no LuaJava, e também tem um bug com concatenação de strings longas, por exemplo fazer longas querys em string no LuaJava, simplismente a string ficava estragada e tinha que fazer concatenação de strings mais curtas para contornar o problema. E eu falei com o Thiago sobre estes problemas todos ele disse que tinha uma nova versão pronta para lançar e talz, mas isto ja faz um ano, e até agora nada da tal versão, e passou alguns meses e ai resolvi começar com o CajuScript.

Pois é fiz o CajuScript mesmo para substituir o LuaJava naquilo que eu precisava, ser simples como o LuaJava, e ter boa performance.

O LuaJava é excelente, até inicialmente pensei em fazer um interpretador do Lua 100% Java, mas depois comecei a ter idéias de sintaxes, e surgio a idéia de fazer a sintaxe dinâmica, depois também teria o problema de manter a compatibilidade com o Lua.

Quando lancei a primeira versão do CajuScript enviei um email para a equipe do LuaJava falando do projeto, e dizendo que continuaria a ajudar o LuaJava no que fosse preciso.

Mas sinceramente sinto que o projeto do LuaJava esta meio parado, pasado 1 ano continua na mesma. O Thiago tem os seus motivos, mas pra mim passou a ser complicado apostar num motor com bugs cruciais e muito tempo sem resposta prática. Mas espero que haja o quanto antes uma nova versão do LuaJava.

Se vc escolher usar o LuaJava eu posso te dar um apoio também em como contornar alguns problemas, por exemplo para contornar o problema das threads e memória pendurada, passei a executar os scripts num novo processo Java, assim depois do script executado era só matar o processo, mas tinha um consumo de tempo alto para iniciar, mas podes iniciar o novo processo, executar os scripts necessarios e depois matar o processo. Fazia isto usando RMI tb, e foi baseado nisto que fiz a implementação do LuaJava para a API de Scripting do Java 6.

Mais uma vez, gostei muito dos testes que fizeste, obrigado mesmo, se gostas mesmo destas aventuras com motores de script, e se quiser entrar para o projeto do CajuScript fica aqui o convite.

Qualquer sugestão ou critica será muito bem vinda. E vamos continuar trabalhando para melhorar ainda mais o CajuScript.

Valeu :wink:

eduveks

gugarn, olhando rapidamente o teu codigo de teste reparei em alguns problemas.

O script do lua não esta bem, os ifs, só faz o primeiro IF, mas isto não influencia o resultado por que, os 3 engines só devem ter entrado dentro do IF uma única vez, na primeira vez, pois alteram o valor no Array e depois nas outras iterações fizeram apenas o if e o get, e não fizeram mais o set.

Entendeu? Por isso que no teste que eu postei, eu criei o array dentro do loop, para garantir que sempre entraria dentro do IF.

Por que vc dentro do script esta alterando a referencia do objeto do array, por isso o array fora também é alterado.

Mas isto não altera o resultado do teste, por que os 3 scripts não fizeram o set mais que 1 vez, e todos tiveram o mesmo comportamento.

Faz dentro dos loops um:

System.out.println(colunas[0]);

E vc vai ver que o array fora vai estar com a alteração feita no script.

Por exemplo este código:

String[] colunas = new String[] {"VLR"}; for (int i = 0; i < 10; i++) { javax.script.ScriptEngine caju = new org.cajuscript.CajuScriptEngine(); caju.put("colunas", colunas); System.out.println(colunas[0]); caju.eval("caju.cache test; array.get(colunas, 0) = 'VLR' ? array.set(colunas, 0, 'VALOR'); ?;"); System.out.println(colunas[0]); }

O output vai ser:

Ou seja só entrou dentro do IF na primeira vez.

Mas como já disse isto não altera o resultado, pois todos se comportaram da mesma forma :wink:

G

de qualquer forma vou refazer e atualizar os resultados. =)

Criado 28 de março de 2008
Ultima resposta 25 de out. de 2008
Respostas 31
Participantes 11