Performance-Abschätzung für meine String-Operatio

Thema: Performance-Abschätzung für meine String-Operationen (Code: gut/schlecht ?)

Hallo,

ich bastle mir mit folgendem Code einen SQL Befehl zusammen, der dann als char* übergeben wird. Meine Konstruktion funktioniert prima.
Ich würde nun aber gerne wissen ob meine gewählte Form der Stringbearbeitung / Übergabe als char* aus Performancegesichtspunkten sinnvoll ist oder ob ich das besser erledigen könnten.
Es soll schließlich nicht nur funktionieren sondern auch schnell laufen :smile:

die relevanten Ausschnitte aus meinem Code:

int int_wert = 20;

string insert = „INSERT INTO test1 (nr, s3) VALUES(“;

ostringstream os;
os

Ich würde nun aber gerne wissen ob meine gewählte Form der
Stringbearbeitung / Übergabe als char* aus
Performancegesichtspunkten sinnvoll ist oder ob ich das besser
erledigen könnten.
Es soll schließlich nicht nur funktionieren sondern auch
schnell laufen :smile:

Die Preisfrage ist, wieviele Millionen Mal pro Sekunde das ausgeführt werden soll. Es geht hier nicht um den innersten Teil einer hochkomplexen Berechnung, sondern um das simple Zusammenschustern einer Query. Der Zeitbedarf zur Kommunikation mit der Datenbank dürfte die Zeit für die Stringoperationen je nach Anbindung um etliche Größenordnungen (Faktor 10^6 und höher) übersteigen, so dass sich die Frage nach der Performance nicht wirklich stellt.

die relevanten Ausschnitte aus meinem Code:

int int_wert = 20;
string insert = „INSERT INTO test1 (nr, s3) VALUES(“;

ostringstream os;
os

ostringstream os;
os
Das würde eventuell ein paar Zyklen zur Zuweisung und in Konstruktoren sparen, aber wie schon erwähnt wird das nie jemandem auffallen. Das spielt sich alles in einem Bereich ab, in dem du gut das machen kannst, was dir am liebsten ist, ohne dich jemals um die Performance kümmern zu müssen. Du könntest nebenbei noch einen MD5-Hash der Query errechnen und man würde es wahrscheinlich nicht bemerken, solange das System nicht optimal aufgebaut (CPU-Leistung, Datenbankanbindung, …) und voll ausgelastet ist.

Hi,

Ich gehe jetzt mal davon aus, dass du nicht wirklich int_wert
auf 20 festlegst und drei Zeilen später ohne jegliche
Modifikationsmöglichkeit benutzt… Wieso nicht

da hast du recht :wink: Mein Code liegt in einer Schleife, die den int hochzählt.

ostringstream os;
os

sicher ein Ansatz um Zeit zu sparen. Habe aber eine noch viel schönere Lösung gefunden, die für Datenbankprogrammierung um einiges besser geeignet ist als immer den String neu zusammenzusetzen. Ich rede von PreparedStatements. Da arbeitet man mit Platzhaltern. Die bringen wirklich was von der Performance her. Habe mal einen kleinen Test gemacht indem ich 100000 Inserts ausgeführt habe. Zeitersparnis lag bei ca. 30% verglichen mit dem immer wieder neu zusammensetzen per Stringoperationen.

Aber jetzt poste ich einfach mal etwas Code. Vielleicht stößt ja mal wer per Suche drauf und freut sich dann über Code. Denn nichts ist nerviger als irgendwo im Netz was zu finden was zu seinem Problem passt und dann nur zu lesen „Problem gelöst…nochmals Danke an alle“

so dann will ich mal. ich hoffe ich erwische alle relevanten Stellen aus meinem Code:
Das das Insert-Statement nciht wirklich sinnvoll ist weiss ich auch :wink: Soll eher das Prinzip verdeutlichen.

#include "mysql\mysql.h"

#define HOST "localhost"
#define USER "root"
#define PASSWD ""
#define DB\_NAME "test"

MYSQL \*mysql = NULL; // Connection handler

MYSQL\_STMT \*stmt;
MYSQL\_BIND bind[1];
int int\_data;

mysql = mysql\_init(NULL);

if(mysql == NULL)
{
printf( "Init failed...\n" );
return 1; // Init failed.
}

if(!mysql\_real\_connect(mysql, HOST, USER, PASSWD, DB\_NAME, MYSQL\_PORT, NULL, 0))
{
printf( "Connection failed...\n" );
return 1; // Connection failed.
}

if(mysql\_query(mysql, "START TRANSACTION") != 0)
{
printf( "START TRANSACTION failed...\n" );
return 1;
}

#define INSERT\_COMMAND "INSERT INTO test1 (Spot\_nr, s1, s2, s3) VALUES( ?, 'test1', 'test2', 'test3')"

stmt = mysql\_stmt\_init(mysql);
if (!stmt)
{
fprintf(stderr, " mysql\_stmt\_init(), out of memory\n");
return 1;
}

if (mysql\_stmt\_prepare(stmt, INSERT\_COMMAND, strlen(INSERT\_COMMAND)))
{
fprintf(stderr, " mysql\_stmt\_prepare(), INSERT failed\n");
fprintf(stderr, " %s\n", mysql\_stmt\_error(stmt));
return 1;
}

int param\_count= mysql\_stmt\_param\_count(stmt);
fprintf(stdout, " total parameters in INSERT: %d\n", param\_count);

/\* INTEGER PARAM \*/
/\* This is a number type, so there is no need to specify buffer\_length \*/
bind[0].buffer\_type= MYSQL\_TYPE\_LONG;
bind[0].buffer= (char \*)&int\_data;
bind[0].is\_null= 0;
bind[0].length= 0;

if (mysql\_stmt\_bind\_param(stmt, bind))
{
fprintf(stderr, " mysql\_stmt\_bind\_param() failed\n");
fprintf(stderr, " %s\n", mysql\_stmt\_error(stmt));
return 1;
}

for(int\_data = 0; int\_data 

so viel Spaß mit dem Code.
hier steht noch mehr wie man diese "?"-Syntax mit Leben in Form von Strings füllt. ich hab oben ja nur nen int Wert eingesetzt, da ich nur ihn brauche im Moment:
http://bugs.mysql.com/bug.php?id=8367


Gruß
Pfanni 

Ich rede von PreparedStatements. Da arbeitet
man mit Platzhaltern. Die bringen wirklich was von der
Performance her. Habe mal einen kleinen Test gemacht indem ich
100000 Inserts ausgeführt habe. Zeitersparnis lag bei ca. 30%
verglichen mit dem immer wieder neu zusammensetzen per
Stringoperationen.

Die Zeitersparnis rührt dann allerdings garantiert nicht von den direkt eingesparten Stringoperationen her, sondern resultiert daraus, dass die Datenbank-Operationen wesentlich effizienter durchgeführt werden.

die Zeitersparnis kommt wahrscheinlcih daher, dass das komplette Statement nur ein einziges mal geparst wird und dann per binäre Operationen nur die Änderungen eingefügt/übertragen werden. Diese Art der Statement führt auch zu weniger Traffic im LAN.

Gruß
Pfanni

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi
Mal ne Frage:
Macht es Sinn (weil offensichtlich gehts ja) mysql Datenbanken mit C++ abzufragen? Hab das bis jetzt immer nur im Zusammenhang mit Php oder Perl gehört. Also was sind die Vor-/Nachteile von C++/Perl beim Abfragen von mysql?

Danke für ne Antwort
Gruß
Merlin

Hi,

Macht es Sinn (weil offensichtlich gehts ja) mysql Datenbanken
mit C++ abzufragen?

sicher macht es Sinn :smile: sonst würds nicht gehen *gg*

Hab das bis jetzt immer nur im
Zusammenhang mit Php oder Perl gehört.

Eine Datenbankverbindung ist nicht abhängig von der Programmiersprache. Das geht mit (nahezu) jeder Sprache. Man muss halt nur den richtigen Verbindungstyp finden. Oftmals wird da dann ODBC genutzt.
MySQL ist eine „ganz normale“ Datenbank, ok mit Oracle darf man es nicht vergleichen, aber es gibt genug Anwendungsfälle wo man „normale“ Programme einsetzen muss. Das von dir erwähnte PHP/PERL ist ja mehr in der Internetwelt daheim. Die Hauptanwendungsbereiche von MySQL sind auch im Netz zu finden, daher hast du wahrscheinlich auch nur in diesem Zusammenhang davon gehört.
Aber versuche mit PHP oder Perl mal eine richtige Anwendung zu schreiben. Da strandest du mit diesen Skriptsprachen schnell und dann muss halt ne Sprache her wo der Code kompiliert und nicht einfach nur interpretiert werden muss.
Ich habe auch schon Zugriffe auf MySQL mit Java, C# und VB.NET gemacht. Funzt wunderbar.

Also was sind die
Vor-/Nachteile von C++/Perl beim Abfragen von mysql?

so richtieg Vor/Nachteiel kann man da wohl nicht nennen. Sind halt einfach wie oben schon erwähnt andere Anwendungsbereiche. Und je nach Anwendungsbereich wählt man halt ne Programmiersprache.

Ich bastle z.B. hier grad nen Programm was zur Hardwaresteuerung von einem Martin Lichtspot herhalten soll.
http://www.martin.com/product/product.asp?product=ma…
In der Datenbank stehen dann die abzuarbeitenden Befehle, die an den Spot geschickt werden sollen. Das Programm läuft also als Daemon, d.h. ist immer aktiv ohne beendet zu werden. (So ne Art Endlosschleife :wink:) Schaut in gewissen Abständen in die Datenbank, holt sich neue Aufträge, bereitet diese auf und sendet die Befehle an den Spot. Nach beendetem Auftrag geht das Spiel wieder von vorne los.

Sowas kannst du nicht mit PHP oder Perl realisieren.

Gruß
Pfanni

Macht es Sinn (weil offensichtlich gehts ja) mysql Datenbanken
mit C++ abzufragen? Hab das bis jetzt immer nur im
Zusammenhang mit Php oder Perl gehört. Also was sind die
Vor-/Nachteile von C++/Perl beim Abfragen von mysql?

Die eigentlich Frage ist, was man tun will. Wenn man nur aus irgendwelchen Datenbeständen mal schnell einen leicht aufbereiteten Auszug haben will, bei dem die Hauptarbeit in der Query besteht (und somit beim DB-Server landet), dann ist man sicher in vielerlei Hinsicht mit einer Skriptsprache wie Perl, PHP, Ruby oder Python sehr gut bedient.

Wenn man andererseits die Daten z.B. für komplexe Berechnungen benötigt oder man einfach nur eine bestehende Anwendung an eine Datenbank hängen will, wäre es in vielen Fällen komplexer, langsamer, unsicherer oder einfach nur zu unschön, die Anbindung über ein externes Skriptsystem abzuwickeln oder die ganze Anwendung umzuschreiben. Da fährt man dann mit den entsprechenden Bindings in der jeweiligen Sprache besser.