Considere utilizar Rust!

Rust é uma linguagem de programação de sistemas de código aberto que se concentra em Performance, Concorrência e Segurança de Memória.

Os desenvolvedores estão usando o Rust para criar uma ampla gama de novos aplicativos de software, como engines de jogos, sistemas operacionais, sistemas de arquivos, componentes atuais do Firefox e futuros, …

Em pesquisa de opinião da Stack Overflow, ela está entre as mais amadas por 4 anos seguidos e os desenvolvedores desejavam desenvolver com a linguagem Rust. Top!

Entre algumas características positivas do Rust temos:

* Código Nativo, você pode distribuir direto o seu binário. Aplicações como o npm foram desenvolvidas para rust.

* A linguagem e o compilador tentam Prever Problemas que acontecem em
tempo de execução. Como eles tentam evitar um conjunto de erros e problemas comuns, a
linguagem traz um conjunto de práticas que melhoram o seu estilo de
programação
.

* Rust tem o conceito de Ownership, isto é, um valor pode ser propriedade de apenas uma variável, quandoessa variável sair de contexto, o valor sai da memória, então NÃO tem Garbage Collection. Durante um Garbage Collection, a rotina verifica se tem alguém usando esse valor, o que tem um custo.

* Exceptions não coisas legais, em Rust você deve tratar as exceções.

* Ferramentas Modernas. O Rust, através do Cargo, já tem práticas modernas como Gerenciamento de Bibliotecas, Testes, Documentação, ….

* Rust está entre as melhores linguagem de programação para WebAssembly. O WebAssembly (abreviado Wasm) é um formato de instrução binário para execução nos Navegadores e Servidor de Aplicações.

Mas nem tudo são flores:

Algumas características negativas do Rust temos:

* Rust não é fácil de aprender.

* A linguagem ainda é nova, algumas features estão disponíveis apenas na versão nightly.

* Faltam items corporativos, isto é, senti falta de drivers para Banco de Dados.

Mas o que me chamou minha atenção sobre Rust é a possibilidade de economia que a sua performance e uso reduzido de memória pode trazer. Os provedores de nuvem definem suas unidades de processamento por flavors (sabores) de equipamentos levando em conta Cpu vs Memória. Uma aplicação que performa melhor terá influência direta no flavor utilizado e no valor da fatura no fim do mês. No artigo Parsing logs 230x faster with Rust – André.Arko.net, o autor descreve com como ele passou de US$ 1000,00 por mês para US$ 0 por mês, reescrevendo um script com Rust.

Se estiver disposto a arriscar, aprenda Rust. Comece desenvolvendo microsserviços, funções Lambda (Serverless), Scripts ou otimizando aplicações, através de uso de bibliotecas (.dll/.so), criadas em rust.

Não estou falando que Rust é a linguagem certa, mas acho que vale o investimento, você não estará sozinho.

Quer saber mais:

Leia também:

Performance com Strings e StringBuilder em Java

Semana passada, estava trabalhando em uma ferramenta em java, que coletava algumas informações e gerava uma saída para um arquivo txt.

Ao testar a ferramenta com um grande volume de dados, me surpreendi que ela gastava mais tempo de execução na concatenação de String do que na escrita do arquivo.

Não podia deixar a ferramenta assim e como um bom programador resolvi melhorar o meu código. E olha como ficou o resultado.

Na primeira versão concatenava usando apenas Uma String (output), código abaixo:

long prev_time = System.currentTimeMillis();
long time;
String output = "";

for (Device device : this.devices) {
 output += "\"deviceid\": \"" + device.deviceid + "\", ";
....
}
time = System.currentTimeMillis() - prev_time;
System.out.println("Time after for loop " + time);

O resultado foi “Time after for loop 233117 ms“, a ferramenta gastava aproximadamente 4 minutos para executar.

Na segunda versão, usei Duas Strings (output e output2) para fazer a concatenação, código abaixo:

long prev_time = System.currentTimeMillis();
long time;
String output = "";

for (Device device : this.devices) {
 String output2 = "";
 output2 += "\"deviceid\": \"" + device.deviceid + "\", ";
....
 output += output2;
}
time = System.currentTimeMillis() - prev_time;
System.out.println("Time after for loop " + time);

O resultado foi “Time after for loop 22929 ms“, a ferramenta agora gastava apenas 22 segundos para processar. Muito bom!!!

Achei que não deveria parar nesse valor e procurei qual outro tipo de classe Java, que poderia utilizar, e num pesquisa rápida encontrei o StringBuilder.

Na terceira versão usei o StringBuilder, veja código abaixo:

long prev_time = System.currentTimeMillis();
long time;
StringBuilder sb = new StringBuilder();

for (Device device : this.devices) {
 String output2 = "";
 output2 += "\"deviceid\": \"" + device.deviceid + "\", ";
....
 sb.append(output2);
}
time = System.currentTimeMillis() - prev_time;
System.out.println("Time after for loop " + time);
String output3 = sb.toString();

O resultado foi  “Time after for loop 137 ms“, impressionantes 137 milissegundos.

Performance é sempre um desafio, mas melhor ainda é compartilhar. #FicaADica

Leia também:

Migre o seu Domino do AIX/Windows para o Linux

Trabalhei com o IBM Domino em diversas plataformas (AIX/Windows/Linux/zLinux). Em todas o Domino tinham ótima performance e um uptime muito alto.

Mas quais seriam os motivos pra recomendar isso?

Vendo a apresentação “Notes Domino 2016 Roadmap.pptx”, a mesma apresentava como plataformas estratégicas para o Domino o Microsoft Windows Server e RedHat Enterprise Linux (RHEL).

Além dessa questão de estratégia, vejo outros motivos para migrar de AIX/Windows para Linux:

  • Ferramentas DevOps, como shell e puppet, padronizam o ambiente Domino, melhorando a performance, uptime e reduzindo o TCO.
  • SmartCloud usa esta plataforma.
  • Verse On-Premises para Linux, já está disponível para essa plataforma desde Janeiro/2017
  • Traveler na mesma plataforma
  • IBM mail support for Microsoft Outlook (IMSMO) na mesma plataforma
  • Flexibilidade entre a quantidade de Domino Partitions (DPAR) por VM, isto é, melhor uso de recursos ou maior isolamento. Uma DPAR é semelhante a uma instância Oracle,Melhorar o isolamento.

Apesar de atualmente não ser suportado, vejo como futuro o uso de containers Docker para execução do Domino ao invés de Virtual Machines (VM). Sobre Domino em Docker, sugiro dar uma olhada nessa apresentação feita  Matteo Bisi and Daniele Vistalii, e ver o artigo How to Run IBM Domino Server in Docker Container.

Leia também:

Como aumentar o número máximo de conexões simultâneas em Apache?

Fazer mais com menos é um desafio comum em TI e na vida real.

Mas como ouvi uma vez: “Tuning é configurar o ambiente para que ele suporte a quantidade de pessoas que ele aguenta, e não fazer o recurso abrir o bico”.

Como trabalho com Aplicações Web, já  vi na prática, em diversas situações, sobre o alto desempenho provido pelo servidor Apache 2.x.

Normalmente utilizo o IBM HTTP Server, que é a versão do Apache HTTP Server, suportado pelo laboratório da IBM. Sempre como front-end para servidores WebSphere Application Server (WAS).

Como estou estudando bastante esse assunto,  criei o artigo:

IHS: Otimizar o Apache Web Server para suportar mais conexões e clientes simultâneas

onde compartilho algumas configurações que permitem otimizar a capacidade de atendimento deste popular servidor http.

Aproveitem!!!

Leia também:

OpenMic: Overview of SAN Performance for ICS Solutions

O OpenMic é um webcast onde no final se abre para as perguntas.

No dia 24 de Abril, o assunto será a configuração do Storage Area Network (SAN) Performance para soluções de Colaboração.

Mais detalhes sobre o OpenMic, você pode encontrar na página do Suporte:

Título: Overview of SAN Performance

Data: 24 de Abril de 2013 – 12:00 às 13:00 Horário de Brasília.

URLhttp://www-01.ibm.com/support/docview.wss?uid=swg27038065

Custo: Gratuito

Web Conference URL:

Conference 9526-3802 -> https://apps.na.collabserv.com/meetings/join?id=9526-3802

 

Senha da conferência: 8985692

Telefones:

  • 55-11-3958-0769
  • 0800-8911977

Leia também: