Ist die Verwendung der system()-Funktion in C++-Code schneller als die Verwendung von Quellcode?

Ist die Verwendung der system()-Funktion in C++-Code schneller als die Verwendung von Quellcode?

Soweit ich weiß, kann ich system()Funktionen verwenden, um Befehle des Linux-Terminals in meinem C++-Code zu verwenden. Beispiel system("aplay sound.wav");: Ich weiß nicht, ob ich alle Linux-Befehle so schreiben kann oder nicht, aber aplayes funktioniert.

Ich möchte es in meinem C++-Programm verwenden. Ich espeakmöchte, dass espeak jeden String liest, den ich durchlaufe (so ähnlich wie aplayim obigen Code, aber mit Bezug auf „Strings“). Ist es besser, es per Funktion aufzurufen system(), oder ist es besser, einen Code wie diesen in meinen C++-Code zu schreiben und ihn jedes char* textMal zu ändern, wenn ich einen neuen String lesen möchte?:

#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;
}

Welches ist schneller?

Antwort1

Meine kurze Antwort lautet: Ja.

Bitte bestätigen Sie, ob ich Ihre Frage verstanden habe.

Bitte bedenken Sie, was passiert, wenn Sie das System aufrufen:

  1. Ihr Programm startet die Ausführung einer Shell.
  2. Diese Shell liest die Befehlszeile, die Sie ihr übergeben haben.
  3. Die Shell startet das Programm, das Sie an system() übergeben haben – in Ihrem Fall ist es espeak;
  4. Das Programm erhält die Optionen, die Sie ihm übergeben haben.
  5. Schließlich wird das Programm ausgeführt.

Daher sind die Elemente 1 bis 3 (und möglicherweise 4) alle Overhead, wenn Sie verwenden system(), im Vergleich dazu, wenn Sie dieselbe Funktionalität in Ihrem Quellcode starten.

Wenn Sie eine Möglichkeit finden, die gleiche Funktionalität über einen Funktionsaufruf in Ihrem Programm aufzurufen espeak, erzielen Sie schnellere Reaktionszeiten.

Da ich keine Ahnung von Espeak habe, werde ich versuchen, allgemein zu antworten.

  • 1. Es ist nicht immer einfach, die gleiche Funktionalität wie bei einem laufenden Programm in Ihrem Quellcode zu haben. Bei manchen Programmen ist die Funktionalität auf eine Unzahl von Optionen verteilt, und es kann schwierig sein, das zu verstehen und eine Funktion in Ihrem Code zu erstellen, die das tut, was Sie ihnen einfach über die Befehlszeile mitteilen können.
  • Zweitens müssen Sie den Kosten-Nutzen-Faktor der Umwandlung abwägen. Bei den aktuellen Hochleistungsprozessoren und der Fülle an Speicher wird das Starten einer Shell und dann Ihres Programms wahrscheinlich nicht allzu viel Zeit in Anspruch nehmen. Dieser Aufwand ist insbesondere dann vernachlässigbar, wenn Sie nur espeakwenige Male starten und relativ lange Texte vorgelesen werden müssen.

verwandte Informationen