2
respostas

O que seria mais eficiente ?

Estou com uma dúvida em relação à eficiência do programa. No caso, o professor deu a função:

bool letra_existe (char chute){
    for (int i = 0; i < palavra_secreta.size();i++){
        if (chute == palavra_secreta[i]){
            return true;
        }
    }
    return false;
}

E ndentro da funlão ele usa a variavel global. O que seria mais eficiente de fato, a forma que o professor fez ou criar um outro parâmetro de entrada para a função cujo input seria a "palavra secreta?" Por exemplo:



bool confereLetra(char chute, std::string letra_secreta)
{
    for(char letra : letra_secreta)
    {

        if(chute == letra)
        {
            return true;
        }

    }

    return false;
}

Existe algum ganho computacional entre as duas funções?

2 respostas

Olá, Hector! Tudo belezinha?

Ambas as funções são eficientes e fazem a mesma coisa. A diferença é que a primeira função usa uma variável global "palavra_secreta" e a segunda recebe essa variável como parâmetro.

Em termos de desempenho, a diferença é mínima. Mas é sempre uma boa prática evitar variáveis globais, pois podem causar problemas de legibilidade e manutenção do código. Além disso, a segunda função é mais flexível, pois pode ser usada com qualquer palavra secreta, enquanto a primeira só funciona com a variável global definida.

Portanto, recomendo que você use a segunda função, pois é mais organizada e fácil de entender. Mas, se você estiver trabalhando em um projeto pequeno e não tiver muitas variáveis globais, a primeira função também é uma opção viável.

Espero ter ajudado. Qualquer outra dúvida me coloco a disposição.

Abraços. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá. Discordo da resposta acima.

Num primeiro momento, não haveria ganhos de performance entre as funções, pois não há aumento de uso na memória, nem mais passos para executar o problema.

No entanto, ao colocar um parâmetro da forma como você fez, é feita uma cópia da informação. Ou seja: a string a ser passada para a função é copiada na memória, e a cópia é dada para a sua função usar. Chamamos isso de passar por valor.

O que poderia ser feito é passar por referência constante, dessa forma, não há uma nova alocação da RAM, e você garante que a std::string original não será modificada:

bool conferir_letra(char chute, const std::string& palavra_secreta)
{
    for(char letra : palavra_secreta)
    {
        if(chute == letra)
        {
            return true;
        }
    }
    return false;
}

Isso não criará nova alocação na RAM, e manterá o código menos acoplado, por que essa função poderá ser usada externamente, ou testada, já que não usa de globais.

Porém, lembre-se: otimização logo de início não é algo bom. Faça primeiro o que você entende melhor, depois você busca otimizar o código.

Passar tudo por referência pode, na verdade, deixar seu código mais lento, ou menos compreensível. Assim como qualquer outra coisa, deve-se usar com cuidado.