¿Usar la función system() dentro del código C++ es una forma más rápida que usar códigos fuente?

¿Usar la función system() dentro del código C++ es una forma más rápida que usar códigos fuente?

Como sé, puedo usar system()la función para usar los comandos del terminal Linux dentro de mi código C++. Por ejemplo system("aplay sound.wav");. No sé si puedo escribir todos los comandos de Linux así o no, pero aplayfunciona.

Quiero usarlo espeaken mi programa C++. Me gusta espeak, lee cada cadena que paso (algo parecido a lo que aplayhace en el código anterior pero con respecto a las "cadenas"). ¿Es mejor llamarlo por system()función o es mejor escribir un código como este dentro de mi código C++ y cambiarlo char* textcada vez que quiera leer una nueva cadena?:

#include <string.h>
#include <malloc.h>
#include <espeak-ng/speak_lib.h>


espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;
char *path=NULL;
int Buflength = 500, Options=0;
void* user_data;
t_espeak_callback *SynthCallback;
espeak_PARAMETER Parm;



char Voice[] = {"English"};


char *text = {"this is a english test"};
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;




int main(int argc, char* argv[] ) 
{
    output = AUDIO_OUTPUT_PLAYBACK;
    int I, Run = 1, L;    
    espeak_Initialize(output, Buflength, path, Options ); 
    espeak_SetVoiceByName(Voice);
    const char *langNativeString = "en"; //Default to US English
    espeak_VOICE voice;
        memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first
        voice.languages = langNativeString;
        voice.name = "US";
        voice.variant = 2;
        voice.gender = 1;
        espeak_SetVoiceByProperties(&voice);
    Size = strlen(text)+1;    
    espeak_Synth( text, Size, position, position_type, end_position, flags,
    unique_identifier, user_data );
    espeak_Synchronize( );
    return 0;
}

¿Cuál es más rápido?

Respuesta1

Mi respuesta corta es sí.

Por favor confirma si entendí lo que preguntaste.

Considere lo que sucede cuando llama al sistema:

  1. Su programa iniciará la ejecución de un shell;
  2. Este shell leerá la línea de comando que le pasaste;
  3. El shell iniciará el programa que pasaste a system(); en tu caso lo es espeak;
  4. El programa recibirá las opciones que le pasaste;
  5. Finalmente, el programa se ejecutará.

Por lo tanto, los elementos del 1 al 3 (y tal vez el 4) son todos generales cuando usa system(), en comparación con cuando inicia la misma funcionalidad en su código fuente.

Si encuentra una manera de llamar a la misma funcionalidad espeakmediante una llamada de función en su programa, tendrá tiempos de respuesta más rápidos.

No sé sobre espeak, así que intentaré responder en términos genéricos.

  • Primero, no siempre es fácil tener la misma funcionalidad de un programa en ejecución en su código fuente. Algunos programas tienen su funcionalidad distribuida en una gran cantidad de opciones, y puede ser difícil entender eso y crear una función en su código para hacer lo que puede expresar fácilmente a través de la línea de comando;
  • 2º, tendrás que evaluar el coste beneficio de la transformación. Con los procesadores actuales de alto rendimiento y la gran cantidad de memoria, iniciar un shell y luego su programa posiblemente no lleve demasiado tiempo. Esa sobrecarga es particularmente insignificante si solo comienza espeakunas pocas veces, con un texto relativamente largo para pronunciar.

información relacionada