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()
Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.