A ordem das instruções if altera a velocidade do código?
Imagine que você precisa determinar, de um conjunto de dados, quantos valores são pares, ímpares e neutros. Existem diversas formas de elaborar os desvio condicionais, mas basicamente, é melhor primeiro testar se o valor é par ou ímpar. Existe alguma diferença em relação ao tempo de processamento na ordem que os testes forem realizados.
No vídeo abaixo eu discuto essa questão é mostro situações onde os testes realizados, e sua ordem de execução, alteram a velocidade do código.
No vídeo eu recomendo ver também um outro vídeo que gravei e que explica o uso da função clock(), segue o vídeo: O que é mais rápido: um laço while ou um laço for?
O código que elaborei para determinar o tempo de execução é disponibilizado a seguir:
#include <stdio.h>
#include <time.h>
#define TAM 100000000
int main(void) {
int i, vezes, contP=0, contI=0, contN=0;
int vet[16] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,0};
//int vet[16] = {0,1,1,1,2,3,3,3,4,5,5,5,6,7,7,7};
//int vet[16] = {0,1,2,2,2,3,4,4,4,5,6,6,6,7,8,8};
//int vet[16] = {0,0,0,0,0,0,0,0,4,5,0,0,0,0,0,0};
clock_t start, end;
float tempo,total1=0,total2=0,total3=0;
for(int x=0;x<5;x++) {
contP = contI = contN = 0;
for(vezes=0; vezes < TAM; vezes++) {
start = clock();
i = 0;
while (i < 16) {
if (vet[i] % 2 == 0) {
if (vet[i] == 0) {
contN++;
} else {
contP++;
}
} else {
contI++;
}
i++;
}
end = clock();
tempo = (double)(end - start)/CLOCKS_PER_SEC;
total1+=tempo;
/////////////////////////////////////////////
start = clock();
i = 0;
while (i < 16) {
if (vet[i] % 2 == 1) {
contI++;
} else if (vet[i] % 2 == 0) {
if (vet[i] == 0) {
contN++;
} else {
contP++;
}
}
i++;
}
end = clock();
tempo = (double)(end - start)/CLOCKS_PER_SEC;
total2+=tempo;
/////////////////////////////////////////////
start = clock();
i = 0;
while (i < 16) {
if (vet[i] == 0) {
contN++;
} else if (vet[i] % 2 == 0) {
contP++;
} else {
contI++;
}
i++;
}
end = clock();
tempo = (double)(end - start)/CLOCKS_PER_SEC;
total3+=tempo;
}
printf("\n%.3f\n%.3f\n%.3f\n", total1, total2, total3);
total1 = total2 = total3 = 0;
}
return 0;
}
Versão do código para avaliação na linguagem Python.
import timeit
TAM = 1_000_000
vet = [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,0]
#vet = [0,1,1,1,2,3,3,3,4,5,5,5,6,7,7,7]
#vet = [0,1,2,2,2,3,4,4,4,5,6,6,6,7,8,8]
#vet = [0,0,0,0,0,0,0,0,4,5,0,0,0,0,0,0]
def trecho1():
contP = contI = contN = 0
for x in range(TAM):
for i in range(16):
if vet[i] % 2 == 0:
if vet[i] == 0:
contN+=1
else:
contP+=1
else:
contI+=1
def trecho2():
contP = contI = contN = 0
for x in range(TAM):
for i in range(16):
if vet[i] % 2 == 1:
contI+=1
else:
if vet[i] == 0:
contN+=1
else:
contP+=1
def trecho3():
contP = contI = contN = 0
for x in range(TAM):
for i in range(16):
if vet[i] == 0:
contN+=1
elif vet[i] % 2 == 0:
contP+=1
else:
contI+=1
for testes in range(5):
print('Trecho 1\t\t', timeit.timeit(trecho1, number=1))
print('Trecho 2\t\t', timeit.timeit(trecho2, number=1))
print('Trecho 3\t\t', timeit.timeit(trecho3, number=1))
print()