Profiling a C/C++ code with Valgrind + KCachegrind

First let’s explain what is profiling. In general terms, profiling is a technique that can be used when you experience performance problems in your application. Basically, it consists in measure the spent time of each code function, to identify where is the bottleneck, i.e., the lines of the code that concentrate more the execution time.

There is a lot of tools for this proposal. In Java we have JPerformance and that are very nice. For C/C++, one that is very used is the GNU gprof, which is very simple to use (just recall to compile your code with -pg flag). Recently I knew KCachegrind, which is a cache profiler based on Valgrind, that surprised me by the simplicity of its QT interface. Valgrind, for those who does not know, is not a profiling tool, it is a memory management tool that helps you to find bugs due to memory leaks, memory conflicts. It is very recommended to use Valgrind since the beginning of coding. Let’s explain a little bit more of KCachegrind.

You can install it by apt-get repostitory:

user@host:~$ sudo apt-get install valgrind kcachegrind

For demonstration, I use a database simulator written in C (by me and others) as a target application. The simulator repeat the database operation thousand of times and compute the average of some measured metrics. The normal execution takes hours, so I run a simple experiment with valgrind (which makes the execution much slower). Before call kcachegrind is necessary to call valgrind to profile the cache data.

user@host:~$ valgrind --tool=callgrind ./simulator --param param.txt --queries 10 --seed 65270
user@host:~$ kcachegrind callgrind.out.12208

I took some screenshots to highlights some KCachegrind features:

A first feature provided by Kcachegrind, showed in the first picture, is a table with the cumulative cost of each function. It consider that main() has 100% of cost and we can follow how this cost is distributed along the functions called by main(). The same feature, explained above, can be viewed in a graphic view, as depicted in the second figure. And another way to analyse the code is through the graph view, which starts in main(), showing the cumulative cost and walk through the code graph. On this graph we can views that the higher cost of the code is concentrated on vprintf function, which is used to log the simulator execution for debug purposes.

See ya!

Copiando coleções em Java

Em java, para fazer com que uma coleção tenha o mesmo conteúdo que outra, podemos fazer o seguinte:

  List<String> a = new LinkedList<String>();
  a.add("1");
  a.add("2");
  List<String> b = new LinkedList<String>(a); //aqui b copiará a

No entanto, os elementos de b, que copiou tudo de a, continuarão referenciando os mesmos elementos de a na memória. Em alguns casos isso pode não ser o comportamento desejado.

Para forçar o Java a duplicar as instâncias da coleção copiada na coleção de destino, adicione após o construtor de b  o seguinte comando:

  Collections.copy(b,a);

Observe que se vc chamar apenas o comando copy sem ter feito a construção corretamente, provavelmente encontrará uma exceção informando que B não suporta A, ou que B não é grande o suficiente para A.

Remove if(debug) intructions from Java bytecode with a static flag

One of the several techniques (a MacGyver style) for debug in Java is insert if(DEBUG) messages for monitoring errors and events. However, according to the size of your code, the number of conditional tests performed to check if the DEBUG flag was enabled can affect the performance of your application.

In C one of the alternatives is to use #define DEBUG directive jointly with #ifdef DEBUG tests, hence, according to this flag, compiler will inserts or not the debug code in the executable.

In Java you can do that using a static flag, for instance, considers the example as follows:

class Teste{

        public static final boolean DEBUG = true;

        public static void main( String[] args ){

                if( DEBUG ){
                        int a = 10;
                        System.out.println( "a = " + a );
                }
        }
}

Compiling the code:

$ javac Teste.java

Verifying the generated bytecode to check the if(debug) instructions:

$ javap -c Teste.java

Compiled from "Teste.java"
class Teste extends java.lang.Object{
public static final boolean DEBUG;

Teste();
  Code:
   0:    aload_0
   1:    invokespecial    #1; //Method java/lang/Object."":()V
   4:    return

public static void main(java.lang.String[]);
  Code:
   0:    bipush    10
   2:    istore_1
   3:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   6:    new    #3; //class java/lang/StringBuilder
   9:    dup
   10:    invokespecial    #4; //Method java/lang/StringBuilder."":()V
   13:    ldc    #5; //String a =
   15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   18:    iload_1
   19:    invokevirtual    #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   22:    invokevirtual    #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   25:    invokevirtual    #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   28:    return

}

Changing the debug flag to false:

class Teste{

        public static final boolean DEBUG = false;

        public static void main( String[] args ){

                if( DEBUG ){
                        int a = 10;
                        System.out.println( "a = " + a );
                }
        }
}

Recompiling the code:

$ javac Teste.java

Verifying again the generated bytecode we can see that compiler take in account that since the debug flag is constant (final) its value cannot be changed during the execution so the conditional test will always returns false and can be removed.

$ javap -c Teste.java

Compiled from "Teste.java"
class Teste extends java.lang.Object{
public static final boolean DEBUG;

Teste();
  Code:
   0:    aload_0
   1:    invokespecial    #1; //Method java/lang/Object."":()V
   4:    return

public static void main(java.lang.String[]);
  Code:
   0:    return

}

See ya

Ant Compile With rJava library

This is pretty simple but for the sake of “I-will-not-forget-it-anymore” I will write it here. I copied some files of a Java project to a new machine. When I tried to execute it in the new place, “Exception in thread “main” java.lang.UnsupportedClassVersionError: Bad version number in .classa file”. Recompiling everything should make it work. Since my code requires rJava it is necessary to inform this to the ant (I’m using ant by the way).  The command which made my day is:

ant clean compile -lib ~/R/i486-pc-linux-gnu-library/2.9/rJava/jri/JRI.jar

2.9: be aware about the version you’ve installed, if you’ve compiled the packages in a version < 2.10, you will need to reinstall ’em. In my case I did reinstall nlme, mgcv, spatstat, and igraph.

Multi-dimensional array in Java

Since Java does not have pointers I was thinking if it can hold multi-dimensional arrays. Multi-dimensional array is an array where each row is another array, which can have different sizes. In C you can create an array of pointers and allocates each one to an array of different sizes. The following are two examples to allocates a multi-dimensional array in Java:

// declaration statement
int tri[][] = { {1,2,3}, {4,5}, {1} };

// dinamically statement
int[][] tri;
tri = new int[10][];
for (int r=0; r<tri.length; r++) {
	tri[r] = new int[r+1];
}
 
// print the triangle matrice
for (int r=0; r<tri.length; r++) {
	for (int c=0; c<tri[r].length; c++) {
		System.out.print(" " + tri[r][c]);
	}
	System.out.println("");
}

Read more:
http://www.go4expert.com/forums/showthread.php?t=1162

See ya

LaTeX : Drawing figures with PSTricks

Here is an interesting made on Java named PSTricks, that provide a GUI so you can draw and it convert it to LaTeX commands. Nice to be used with beamer!

example_latexdraw

See more:

http://ac.jiruan.net/2008/04/easily-draw-figs-with-latex/

Criando um robô de navegação na Web em Java – Parte 1/2

Em diversas situações, é conveniente o uso de aplicações automatizadas que naveguem pela internet executando algum comportamento pre-determinado. Para isso, alguma soluções práticas existem, como é caso do iMacros, plugin para o navegador Firefox que te permite gravar um roteiro de navegação na web e futuramente re-executar esse roteiro com 1 clique apenas (Ex: logar automaticamente no site de uma biblioteca e renovar um empréstimo). No entanto, as vezes necessitamos de uma maior flexibilidade na criação desses roteiros, principalmente quando se trata de coletar dados da Web condicionando essa coleta a existência ou não de alguma informação no caminho percorrido. Imagine por exemplo que você deseje deseje criar um robô para percorrer um site de uma loja virtual, visitar a seção de Notebooks, ordenar as ocorrências por Menor Preço, e gerar ao fim uma lista com as ocorrências da primeira página. Uma boa alternativa para isso é a criação de um robô de navegação em Java utilizando a bliblioteca HTTPUnit.

Escrito em Java, HTTPUnit emula porções relevantes do comportamento dos navegadores Web, incluindo o envio de formulários, JavaScript, autenticação básica HTTP, cookies e redirecionamento automático de páginas, permitindo a criação de códigos Java para examinar a presença de elementos contidos no texto, no XML DOM,  além de dar acesso direto a forms, tabelas e links das páginas. Seu propósito inicial é permitir a execução de testes de unidade automatizados em aplicações Web, no entanto, seu uso como “navegador-via-código” permite uma grande variedade de aplicações.

Para fazer uma aplicação de demonstração, faça o download do HTTPUnit acessando o site http://httpunit.sourceforge.net/. Você irá baixar um arquivo provavelmente chamado httpunit-<versão>.zip (Ex: httpunit-1.7.zip). Descompacte o arquivo em alguma pasta. Para facilitar a configuração dos Build-Path e ter acesso fácil ao código e documentação do HTTPUnit, vamos utilizar o Eclipse para agilizar a criação do robô em Java.

Primeiramente vamos adicionar o HTTPUnit ao nosso workspace. Abra o seu Eclipse, vá em File > New > Java Project, em seguida, dê o nome para o projeto de httpunit, selecione a opção Create project from Existing Source, clique no botão Browse que será habilitado e procure a pasta extraída do HTTPUnit no seu computador. Clique em Finish. Agora o HTTPUnit é projeto do seu workspace e está disponível para ser referenciado por outros projetos.

O próximo passo é criar o seu projeto do Robô de Navegação Java. Vá novamente em File > New > Java Project, dê um nome para o seu projeto (Ex: webtest) e clique em Finish. Para que seu projeto tenha acesso ao HTTPUnit, é preciso adicionar esse ultimo ao Build Path. Para isso, clique com o botão direito do mouse sobre o seu projeto no Package Explorer, acesse Build Path > Configure Build Path, acesse a aba Projects, clique em Add, selecione o projeto httpunit criado anteriormente, clique em OK, e em OK novamente, retornando ao ambiente de desenvolvimento. À partir de agora, você poderá referenciar os pacotes do HTTPUnit no seu projeto e acessar seus recursos pelo auto-complete no contexto do seu código.

Agora vamos criar nossa classe robô. No Package Explorer, expanda o seu novo projeto, clique com o botão direito do mouse no ítem SRC > (default package), clique em New > Class. Dê um nome para sua classe (Ex: Webtest) e clique em Finish.

No código da classe Webtest, iremos fazer apenas um método main(), onde ocorrerá toda a navegação.  Primeiramente, vamos fazer um código que irá acessar um URL qualquer e imprimir o título da página resultante:

    public static void main(String[] args) throws Exception {

          WebConversation wc = new WebConversation();

          WebRequest request = new GetMethodWebRequest( "http://www.google.com/" );
          WebResponse response = wc.getResponse( request );

          System.out.println(response.getTitle());
    }

Cole o método acima no seu código, e aperte o atalho CTRL+SHIFT+O para que os pacotes necessários sejam automaticamente inseridos na seção import na sua classe.

Execute sua classe (Run). Caso o Eclipse pergunte o tipo de execução, informe para executar um Java Application. Caso o Eclipse informe que existem erros no projeto httpunit, ingore clicando em Proceed. Isso ocorre pois alguns arquivos de exemplo .java incluídos dentro do HTTPUnit estão com problemas.

Possívelmente, se sua conexão com a internet estiver tudo OK, e o site do Google estiver no ar, você verá na saída do seu console o texto Google, que é o título da página.

Na parte 2 desse tutorial, irei comentar alguns métodos de exploração do HTML do HTTPUnit como vasculhar por links, figuras e formulários, procurar por elementos específicos, além de dar um exemplo básico de navegação automatizada.

Até+

============= AVISO ============

Pessoal, peço desculpas por não ter continuado o tutorial. O fato é que esse artigo foi feito em 2009 e logo depois descobrí que o HTTPUnit fora descontinuado, não ocorrendo nenhum novo release depois de 2008 (http://httpunit.sourceforge.net/). Sugiro que estudem o HTMLUnit (http://htmlunit.sourceforge.net/) que inclusive possui uma documentação muito clara, bastando começar no link “Get Started” da sua página oficial (http://htmlunit.sourceforge.net/gettingStarted.html). Boa sorte! 😉

===============================