Como usar o tic e toc para comparar a eficiência de diferentes resoluções No ficheiro com o exercício 4.14 a) são apresentadas 5 resoluções diferentes do exercício e usadas as funções tic e toc para analisar a eficiência de cada uma das resoluções. As funções tic e toc funcionam como um cronómetro que mede o tempo de CPU, em segundos, gasto pelo computador a resolver as instruções entre o tic (liga o cronómetro, colocando‐o em 0) e o toc (pára o cronómetro dando o tempo gasto). Como o computador é muito rápido para que o tempo seja detectável convém que o volume de operações seja grande. Podem fazer isso quer trabalhando com arrays de grande dimensão quer mandando repetir um número grande de vezes a mesma operação. Na resolução do exercício 4.14 a) dada usamos os 2 processos pois pedimos o número de repetições e a dimensão. Se usaram dimensões grandes podem usar números de repetições pequenas se usarem dimensões pequenas devem mandar repetir mais vezes. Para número de repetições devem fornecer um inteiro, para dimensão devem fornecer um vector [nl,nc] onde nl é o número de linhas e nl é o número de colunas do array. Por exemplo podem testar para: 5 repetições e sucessivamente para as 3 dimensões [1000,1000], [1000,5000], [5000,1000]. 500 repetições e sucessivamente para as 3 dimensões [100,100], [100,500], [500,100]. Deste modo testam o caso de matrizes maiores e menores e os casos em que o número de linhas é igual ao número de colunas e os casos em que um desses números é maior do que o outro. Deste modo vêm a influência da dimensão na eficiência de cada uma das resoluções. O que é que determina a eficiência? Quando o Matlab trabalha vectorialmente, usando arrays e subarrays, a linguagem tem capacidade de distribuir melhor as tarefas independentes pelos diferentes processadores (local onde as operações são executadas) que os computadores actuais disponham. Quando usamos ciclos, normalmente, o número de operações independentes é mais reduzido e por isso é mais frequente que alguns processadores não estejam a trabalhar em pleno. Como as 5 resoluções, do exercício 4.14 a), têm todas o ciclo de repetição comum, elas apenas diferem no que é repetido. Na primeira resolução não é usado ciclos mas para tornar possível o produto de arrays de A(mxn) pelos elementos do vector linha p=1:n foi necessário dar ao vector a mesma dimensão do array A repetindo a linha p m vezes. Os processadores são utilizados em pleno, mas se A tem dimensão grande o tempo gasto a gerar o arrays com a linha p repetida pode não ser compensador. Na segunda resolução só é usado um ciclo para percorrer as linhas e cada linha é multiplicada elemento a elemento com a linha p. Os processadores só podem deixar de ser utilizados em pleno quando se muda de linha. Se o número de linhas for menor do que o número de colunas o tempo deve melhorar. No entanto, como os arrays são armazenados por colunas quando se percorre o array por linhas o tempo piora. Na terceira resolução só é usado um ciclo para percorrer as colunas e cada coluna j é multiplicada pelo escalar j o que é mais rápido do que multiplicar pelo vector p. neste caso, os processadores só podem deixar de ser utilizados em pleno quando se muda de coluna. Se o número de linhas for maior do que o número de colunas o tempo deve melhorar. Além disso, como os arrays são armazenados por colunas quando se percorre o array por colunas o processo é mais rápido. Por isso esta deve ser a resolução mais eficiente principalmente quando a dimensão de A é grande. Na quarta resolução são usados dois ciclos para percorrer os elementos da matriz um a um ordenados por linhas. Cada elemento aij é multiplicado pelo escalar j. Deste modo, só um dos processadores é que está a trabalhar. Como os arrays são armazenados por colunas quando se percorre o array por linhas o tempo piora. Por isso esta deve ser a pior resolução Na quinta resolução são usados dois ciclos para percorrer os elementos da matriz um a um, ordenados por colunas. Cada elemento aij é multiplicado pelo escalar j. Deste modo, só um dos processadores é que está a trabalhar. Como os arrays são armazenados por colunas esta resolução é um pouco melhor do que a resolução anterior pois os elementos são percorridos pela ordem que são armazenados.