<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Datei laden und parsen (Optimierung)]]></title><description><![CDATA[<p>Hi,<br />
ich will eine Fukntion zum einlesen von Dateien überarbeiten.<br />
Bei den Dateien handelt es sich um Messwertschriebe, die ich nicht beeinflussen kann.<br />
Mir geht es in erster linie darum, das Lesen der Dateien zu beschleunigen, da es z.Z. länger dauert als die späteren Berechnungen.</p>
<p>Hier mal der Code für das lesen von FFT-Daten:</p>
<pre><code class="language-cpp">bool CFFT_Data::read_fft_file(const char *filename, S_datei_fft &amp;data)
{
	data.inhalt.clear();
	bool in_dataset=false;
	int saetze = 0, reihen = 1, counter=0;
	char zeile[255], *token1, *token2, *token3, sep[] = &quot; \t\n&quot;;
	FILE *stream = NULL;
	S_messwert_fft akt_data;
	S_messreihe_fft akt_set;
	list&lt;S_micro_kalibrierung&gt; akt_cal_set = micro_cfg;

	if( (stream = fopen(filename,&quot;rt&quot;)) == NULL )
		return false;	//fehler bein öffnen (datei nicht vorhanden)

	fgets( zeile, 255, stream );	//zeile lesen
	while( !feof(stream) )
	{
		//zerlegen der eingelesenen zeile
		token1 = strtok( zeile, sep );
		token2 = strtok( NULL, sep );
		token3 = strtok( NULL, sep );
		if(token2 == NULL)	//probe auf messwert oder datensatznummer
		{	//begin eines datensatzes
			if(!in_dataset)	//wenn noch kein datensatz gelesen
			{
				//erster datensatz wurde gefunden
				//alle alten daten löschen
				akt_set.datensaetze.clear();
				data.inhalt.empty();
				in_dataset = true;
			}
			else	//wenn neuer datensatz gefunden
			{
				//aktuelle messreihe speichern und einen neue beginnen
				akt_set.anzahl = saetze;	//anzahl der datensätze aus aktueller messreihe speichern
				counter += saetze;  //zählrt aller datensätze erhöhen
				akt_set.kalib_row = akt_cal_set.front();	//übergeben der Kalibriersätze für die Mikrofone
		//akt_cal_set.pop_front();	//lösche den Ersten
				if(akt_cal_set.size() &gt; 1)	//wenn mehr als ein Mikrosatz vorhanden
				{
					akt_cal_set.pop_front();	//lösche den Ersten
				}
				data.inhalt.push_back(akt_set);	//aktuellen datensatz speichern
				data.datei_info.push_back(akt_set.datensaetze.size());	//anzahl der datensätze aus aktueller messreihe speichern
				akt_set.datensaetze.clear();
				saetze = 0;
				reihen++;
			}
		}
		else  //wenn im datensatz
		{
			akt_data.freq = atof(token1);	//frequenz auslesen
			akt_data.real = atof(token2);	//realteil
			akt_data.imag = atof(token3);	//imaginärteil
			akt_set.datensaetze.push_back(akt_data);	//speichern des datensatzes
			saetze++;	//gelesene daten in aktueller messreihe speichern
		}
		fgets( zeile, 255, stream );	//zeile lesen
	}
	//speichern der letzten messreihe
	akt_set.anzahl = saetze;
	counter += saetze;
		akt_set.kalib_row = akt_cal_set.front();
	data.inhalt.push_back(akt_set);
	data.datei_info.push_back(akt_set.datensaetze.size());
	data.anzahl_datensaetze = counter;
	data.anzahl_messreihen = data.inhalt.size();

	fclose(stream);  //datei schliesen
	return true;
}
</code></pre>
<p>Wie ihr seht ist es nicht gerade optimaler Code. Die Umstellung des Codes auf C++ bekomme ich noch hin.<br />
Nur bei den <strong>if</strong>-Blöcken habe ich so meine Probleme. Ich suche eine Möglichkeit diese zu ersetzen um so den Code etwas schneller zu machen.</p>
<p>Hier noch ein Ausschnitt aus einer solchen Messwertdatei, evtl. sieht jemand von euch noch eine Möglichkeit zur Optimierung.</p>
<pre><code>1                                             //Messreihennummer
  0       0.003019087712                    0   //Offset
  2      -0.006272755701       -0.01370646872   //Frequenz Real- Imaginär-Teil
  4       0.001466225159       0.007759021394 
  6        0.00223540761     -0.0003204310803 
  8     -0.0004062494738    -3.375779664e-005 
  10    -3.019850332e-005      0.0001026067879 
.....
  6396      0.0001561847993     -0.0003179971798 
  6398     -0.0001969154958      0.0001545309007 
  6400      3.06143794e-005    -2.377467639e-005 
  2                                             //Messreihennummer (neue Messreihe)
  0       0.000115732219                    0 
  2     -0.0002904215692      0.0004103402787 
  4      0.0003056752659     7.323408277e-005 
  6     -9.83728639e-005      -0.000631246431
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/128721/datei-laden-und-parsen-optimierung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 22:55:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/128721.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Dec 2005 15:22:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Tue, 06 Dec 2005 15:22:15 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich will eine Fukntion zum einlesen von Dateien überarbeiten.<br />
Bei den Dateien handelt es sich um Messwertschriebe, die ich nicht beeinflussen kann.<br />
Mir geht es in erster linie darum, das Lesen der Dateien zu beschleunigen, da es z.Z. länger dauert als die späteren Berechnungen.</p>
<p>Hier mal der Code für das lesen von FFT-Daten:</p>
<pre><code class="language-cpp">bool CFFT_Data::read_fft_file(const char *filename, S_datei_fft &amp;data)
{
	data.inhalt.clear();
	bool in_dataset=false;
	int saetze = 0, reihen = 1, counter=0;
	char zeile[255], *token1, *token2, *token3, sep[] = &quot; \t\n&quot;;
	FILE *stream = NULL;
	S_messwert_fft akt_data;
	S_messreihe_fft akt_set;
	list&lt;S_micro_kalibrierung&gt; akt_cal_set = micro_cfg;

	if( (stream = fopen(filename,&quot;rt&quot;)) == NULL )
		return false;	//fehler bein öffnen (datei nicht vorhanden)

	fgets( zeile, 255, stream );	//zeile lesen
	while( !feof(stream) )
	{
		//zerlegen der eingelesenen zeile
		token1 = strtok( zeile, sep );
		token2 = strtok( NULL, sep );
		token3 = strtok( NULL, sep );
		if(token2 == NULL)	//probe auf messwert oder datensatznummer
		{	//begin eines datensatzes
			if(!in_dataset)	//wenn noch kein datensatz gelesen
			{
				//erster datensatz wurde gefunden
				//alle alten daten löschen
				akt_set.datensaetze.clear();
				data.inhalt.empty();
				in_dataset = true;
			}
			else	//wenn neuer datensatz gefunden
			{
				//aktuelle messreihe speichern und einen neue beginnen
				akt_set.anzahl = saetze;	//anzahl der datensätze aus aktueller messreihe speichern
				counter += saetze;  //zählrt aller datensätze erhöhen
				akt_set.kalib_row = akt_cal_set.front();	//übergeben der Kalibriersätze für die Mikrofone
		//akt_cal_set.pop_front();	//lösche den Ersten
				if(akt_cal_set.size() &gt; 1)	//wenn mehr als ein Mikrosatz vorhanden
				{
					akt_cal_set.pop_front();	//lösche den Ersten
				}
				data.inhalt.push_back(akt_set);	//aktuellen datensatz speichern
				data.datei_info.push_back(akt_set.datensaetze.size());	//anzahl der datensätze aus aktueller messreihe speichern
				akt_set.datensaetze.clear();
				saetze = 0;
				reihen++;
			}
		}
		else  //wenn im datensatz
		{
			akt_data.freq = atof(token1);	//frequenz auslesen
			akt_data.real = atof(token2);	//realteil
			akt_data.imag = atof(token3);	//imaginärteil
			akt_set.datensaetze.push_back(akt_data);	//speichern des datensatzes
			saetze++;	//gelesene daten in aktueller messreihe speichern
		}
		fgets( zeile, 255, stream );	//zeile lesen
	}
	//speichern der letzten messreihe
	akt_set.anzahl = saetze;
	counter += saetze;
		akt_set.kalib_row = akt_cal_set.front();
	data.inhalt.push_back(akt_set);
	data.datei_info.push_back(akt_set.datensaetze.size());
	data.anzahl_datensaetze = counter;
	data.anzahl_messreihen = data.inhalt.size();

	fclose(stream);  //datei schliesen
	return true;
}
</code></pre>
<p>Wie ihr seht ist es nicht gerade optimaler Code. Die Umstellung des Codes auf C++ bekomme ich noch hin.<br />
Nur bei den <strong>if</strong>-Blöcken habe ich so meine Probleme. Ich suche eine Möglichkeit diese zu ersetzen um so den Code etwas schneller zu machen.</p>
<p>Hier noch ein Ausschnitt aus einer solchen Messwertdatei, evtl. sieht jemand von euch noch eine Möglichkeit zur Optimierung.</p>
<pre><code>1                                             //Messreihennummer
  0       0.003019087712                    0   //Offset
  2      -0.006272755701       -0.01370646872   //Frequenz Real- Imaginär-Teil
  4       0.001466225159       0.007759021394 
  6        0.00223540761     -0.0003204310803 
  8     -0.0004062494738    -3.375779664e-005 
  10    -3.019850332e-005      0.0001026067879 
.....
  6396      0.0001561847993     -0.0003179971798 
  6398     -0.0001969154958      0.0001545309007 
  6400      3.06143794e-005    -2.377467639e-005 
  2                                             //Messreihennummer (neue Messreihe)
  0       0.000115732219                    0 
  2     -0.0002904215692      0.0004103402787 
  4      0.0003056752659     7.323408277e-005 
  6     -9.83728639e-005      -0.000631246431
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/935887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935887</guid><dc:creator><![CDATA[daishi]]></dc:creator><pubDate>Tue, 06 Dec 2005 15:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Tue, 06 Dec 2005 15:26:13 GMT]]></title><description><![CDATA[<p>Nur ein paar Tips:<br />
- Bau I/O-Streams ein<br />
- Statt char[] nimm std::string<br />
- Lies die Datei direkt in den Speicher und parse erst danach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/935896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935896</guid><dc:creator><![CDATA[PuppetMaster2k]]></dc:creator><pubDate>Tue, 06 Dec 2005 15:26:13 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Tue, 06 Dec 2005 16:24:39 GMT]]></title><description><![CDATA[<p>Ok, habe jetzt das lesen der Datei auf std::string umgestellt.<br />
Erstaunlich ist, dass das Lesen jetzt länger dauert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Hier mal der Code:</p>
<pre><code class="language-cpp">bool lies_datei(char *filename, int &amp;count, list&lt;messwert&gt; &amp;out)
{
    FILE *stream;
    char zeile[256];
    string to_save;
    if( (stream  = fopen( filename, &quot;r&quot; )) == NULL )
        return false;

    fgets( zeile, 256, stream );
    while( !feof(stream))
    {
        to_save = zeile;
        fgets( zeile, 256, stream );
    }
    return true;
}

bool lies_datei(char *filename, int &amp;count, list&lt;string&gt; &amp;out)
{
   fstream f;
   char tmp[256];
   string tmp_str;
   f.open(filename, ios::in);
   while (!f.eof())
   {
       f.getline(tmp, 256);
       tmp_str=tmp;
   }
   f.close();
   return true;
}
</code></pre>
<p>Ich habe nun beiden Funktionen die gleiche Datei gegeben und beide Funktionen 100mal aufgerufen. Dabei stellte ich fest, dass die Funktion mit fstream rund 5,5 mal mehr Zeit braucht. (RELEASE)</p>
<p>Wieso????</p>
]]></description><link>https://www.c-plusplus.net/forum/post/935964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935964</guid><dc:creator><![CDATA[daishi]]></dc:creator><pubDate>Tue, 06 Dec 2005 16:24:39 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Tue, 06 Dec 2005 18:02:43 GMT]]></title><description><![CDATA[<p>du kannst die struktur der datei gleich in kombination mit dem &gt;&gt; operator von ifstream verwenden, der liest bis leerzeichen oder newline. dann noch mit einem stringstream für die zahlenumwandlung koordinieren:</p>
<pre><code class="language-cpp">int messreihe;
int freq;
double realt, imagt;
string zeichen;
sstream wandler;
ifstream infile(&quot;datensatz.tab&quot;);
while (!infile.eof())
{
    infile &gt;&gt; zeichen; // messreihe
    wandler &lt;&lt; zeichen;
    wandler &gt;&gt; messreihe;
    infile &gt;&gt; zeichen; // frequenz
    wandler &lt;&lt; zeichen;
    wandler &gt;&gt; freq;
    infile &gt;&gt; zeichen; // realteil
    wandler &lt;&lt; zeichen;
    wandler &gt;&gt; realt;
    infile &gt;&gt; zeichen; // imteil
    wandler &lt;&lt; zeichen;
    wandler &gt;&gt; imagt;

    deinstack.push(Messreihe(messreihe, realt, imagt));
}
</code></pre>
<p>so oder so ähnlich. hilft das was?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> edit: man muss den stream nach jedem umwandeln irgendwie resetten, das krieg ich ich irgendwie nur nicht hin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/936025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/936025</guid><dc:creator><![CDATA[Korbinian]]></dc:creator><pubDate>Tue, 06 Dec 2005 18:02:43 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 08:40:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1047">@Korbinian</a><br />
Hilft mir leider nicht, da ich jede Zeile prüfen muss, ob da ein oder drei Werte drin sind.<br />
Ist es nur ein Wert beginnt eine neue Messreihe und bei drei werten befinde ich mich in einer Messreihe.</p>
<p>Trotzdem Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937059</guid><dc:creator><![CDATA[daishi]]></dc:creator><pubDate>Thu, 08 Dec 2005 08:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 08:48:37 GMT]]></title><description><![CDATA[<p>Erstmal solltest du statt der char*-Version von getline() lieber die string-Version verwenden:</p>
<pre><code class="language-cpp">getline(f,tmp_str);
</code></pre>
<p>Und zweitens kannst du mit find_first_of() überprüfen, ob du ein Zeichen im String hast:</p>
<pre><code class="language-cpp">getline(f,str);
stringstream wandler(str);
if(str.find_first_of(&quot; \t&quot;)
{
  //mehrere Werte
  wandler&gt;&gt;w1&gt;&gt;w2&gt;&gt;w3;
  if(!wandler)
  {
    cout&lt;&lt;&quot;Fehler&quot;;
    break;
  }
  //...
}
else
{
  //einzelner Wert
  wandler&gt;&gt;w0;
  //...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/937063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937063</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 08 Dec 2005 08:48:37 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 10:22:43 GMT]]></title><description><![CDATA[<p>Die frage ist, wie schnell du es wirklich brauchst ....</p>
<p>gib mal ne Groessenordnung der Datei ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>muss es plattformunabhaengig sein ?<br />
wenn nein, schau dir memorymapping an ... Datei-Block in speicher schieben, und dann mit zeigern draufrumrutschen ^^</p>
<p>Fuer das parsen selber solltest keine Stringobjecte neu anlegen, sondern nur mit zeigerarithmethik suchen<br />
Fuer das wegspeichern der Tokens und werte dann kannst scho strings erstellen (std::string) Das spart dir kopien beim reinen parsen ....</p>
<p>Ich wuerd mir aber erst mal an deiner stelle nen Interface fuer deinen Parser bauen, und die langsame aber sicher funktionierende variante mit lesen in die std::string Puffer nehmen ...<br />
Wenn dann alles ordentlich funktioniert, kannst das parsen nach oben benannter methode vielleicht immer noch beschleunigen. Vielleicht wenn sauber programmiert hasst, brauchst es ja gar nicht mehr ^^</p>
<p>Prinzipiell ...<br />
Deine dateien scheinen eklig gross werden zu koennen, also viele Daten, aber die Struktur selber ist recht klein und uebersichtlich ....<br />
Also bietet sich nen parser mit eventschnittstelle grade zu an ....<br />
Damit trennst du das parsen von der datenhaltung und wirst noch flexiebler.<br />
Du brauchst aigentlich nur wenige events, also</p>
<p>virtual void OnStart() = 0;<br />
virtual void OnStop() = 0;<br />
virtual void OnMessreihe(unsigned int iNr) = 0;<br />
virtual void OnOffset(unsigned int iNr, unsigned int iOffset) = 0;<br />
virtual void OnMeasurmentPoint(unsigned int iNr,double iValue1, double iValue 2) = 0;</p>
<p>Sollte als Interface fast langen ....<br />
Dem Parser uebergibts nen Object mit der Schnittstelle und der befeuert dir das dann ...<br />
Aehnlich arbeiter SAX zum beispiel, und sowas iss eigentlich schon performant ^^</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937117</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 08 Dec 2005 10:22:43 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 10:15:30 GMT]]></title><description><![CDATA[<p>Würde so etwas versuchen. So musst du den string nicht direkt überprüfen.</p>
<pre><code class="language-cpp">void read_file( istream &amp; str ) {
   int nr;
   double mreal = 0.0;
   double mimag = 0.0;
   double r;

   string line;
   while ( getline( str, line ) ) {
      stringstream sstr(line);
      int cou = 0;
      sstr &gt;&gt; nr;
      while ( sstr &gt;&gt; r ) {
         switch ( cou ) {
            case 0: mreal = r; break;
            case 1: mimag = r; break;
            default : 
                 cout &lt;&lt; &quot;error parsing '&quot; &lt;&lt; line &lt;&lt; &quot;'&quot; &lt;&lt; endl;
                 break;
         }
         cou++;
      }
      if ( cou ) {
         cout &lt;&lt; &quot;datensatz &quot; &lt;&lt; nr &lt;&lt; &quot;:&quot; &lt;&lt; mreal &lt;&lt; &quot;,&quot; &lt;&lt; mimag &lt;&lt; endl;
      }
      else {         
         cout &lt;&lt; &quot;neue Messreihe &quot; &lt;&lt; nr &lt;&lt; endl;
      }
   }
}
</code></pre>
<p>Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937126</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Thu, 08 Dec 2005 10:15:30 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 11:12:45 GMT]]></title><description><![CDATA[<p>Fuer den ersten entwurf und um sein programm erstmal zum laufen zu bringen, voellig ok.<br />
Aber steckt auch noch bisserl optimierungspotential drinne .</p>
<pre><code class="language-cpp">void read_file( istream &amp; str ) {
   int nr;
   double mreal = 0.0;
   double mimag = 0.0;
   double r;

   string line; 
   while ( getline( str, line ) ) { // Die komplette Zeile wird kopiert, nach paarmal ist der string hoffentlich gross genug ^^
      stringstream sstr(line); // Der string wird gleich in nen object umgebaut, und dazu noch total neu konstruiert, sehr sicher, aber auch sehr rechenintensiv ^^ 
      int cou = 0;
      sstr &gt;&gt; nr; // tolle idee, die std streamoperationen gleich zu nutzen.
      while ( sstr &gt;&gt; r ) {
         switch ( cou ) {
            case 0: mreal = r; break;
            case 1: mimag = r; break;
            default :
                 cout &lt;&lt; &quot;error parsing '&quot; &lt;&lt; line &lt;&lt; &quot;'&quot; &lt;&lt; endl;
                 break;
         }
         cou++;
      }
      if ( cou ) {
         cout &lt;&lt; &quot;datensatz &quot; &lt;&lt; nr &lt;&lt; &quot;:&quot; &lt;&lt; mreal &lt;&lt; &quot;,&quot; &lt;&lt; mimag &lt;&lt; endl;
      }
      else {        
         cout &lt;&lt; &quot;neue Messreihe &quot; &lt;&lt; nr &lt;&lt; endl;
      }
   }
}
</code></pre>
<p>Wie gesagt, fuer kleinere Sachen sicher akzeptabel, fuer zig millionen mal aufrufen sicher optimierungsbeduerftig ... und je nach implementation der STL wirst hier sehr unterschiedliche ergebnisse erzielen ....</p>
<p>Punkte wo man ansetzen kann ...</p>
<p>1. deine zeilen sind eigentlich definiert max lang, zumindest die Puffer (std::string) von haus aus gross genug Konstruieren ....</p>
<p>2. bei der sofortigen kopie das neuerstellen des stringstreams verhindern, sondern in den puffer des alten schreiben lassen ... damit hilfst der STL nen new(aufn eigenen allokator zwar) zu vermeiden. Bei guten impls wirds nich viel ausmachen, weil die allokatoren recht flott sind</p>
<p>Wenn das immer noch zu langsam ist, wirst dem mit reinen C++ mitteln kaum noch zu leibe ruecken koennen.<br />
Was die sache &quot;langsam&quot; macht, sind die X-maligen kopien ...</p>
<p>eine variante, waere c++ klassen zu verwenden, die cow (copy on write) koennen (nicht mehr STL, dafuer unsicherer, code bleibt aber lesbar. faellt mir auf anhieb die MFC und die QT ein)<br />
oder auf selber in die hand nehmen und der sache mit C-Funktionen und roher pointerarithmetic auf die pelle ruecken.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937164</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 08 Dec 2005 11:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 11:49:45 GMT]]></title><description><![CDATA[<p>Habs ein wenig optimiert. Jetzt wird nicht mehr so viel kopiert.</p>
<pre><code class="language-cpp">void read_file( istream &amp; str ) {
   int nr;
   double mreal = 0.0;
   double mimag = 0.0;
   double r;

   stringstream sstr;
   char buffer[100];
   while ( str.getline( buffer, 100 ) ) {
      sstr.str(buffer);
      int cou = 0;
      sstr &gt;&gt; nr;
      while ( sstr &gt;&gt; r ) {
         switch ( cou ) {
            case 0: mreal = r; break;
            case 1: mimag = r; break;
            default : 
                 cout &lt;&lt; &quot;error parsing '&quot; &lt;&lt; buffer &lt;&lt; &quot;'&quot; &lt;&lt; endl;
                 break;
         }
         cou++;
      }
      if ( cou ) {
         cout &lt;&lt; &quot;datensatz &quot; &lt;&lt; nr &lt;&lt; &quot;:&quot; &lt;&lt; mreal &lt;&lt; &quot;,&quot; &lt;&lt; mimag &lt;&lt; endl;
      }
      else {         
         cout &lt;&lt; &quot;neue Messreihe &quot; &lt;&lt; nr &lt;&lt; endl;
      }
      sstr.clear();
   }
}
</code></pre>
<p>Mein erstes Posting sollte eigentlich nur die Idee zeigen dass man die überprüfung der Eingabezeile auch den streamfunktionen überlassen kann.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937199</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Thu, 08 Dec 2005 11:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 11:57:40 GMT]]></title><description><![CDATA[<p>Jo er soll mal die standard ausgabe auskommentieren und laufen lassen ...<br />
wenns dann zufriedenstellend schnell durchlaeuft, hat er doch was er braucht ^^</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937207</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 08 Dec 2005 11:57:40 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 13:45:34 GMT]]></title><description><![CDATA[<p>DANKE DANKE DANKE DANKE.<br />
Da sind wirklich tolle Ideen dabei und ich habe jetzt auch eine Idee wie ich das Umsetzen kann.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3842">@RHBaum</a><br />
Wegen der Frage nach der Größenordnung: Im Moment ist das ganze noch off-line, also ist die Zeit noch relativ unkritisch. Es sollen aber später Messreihen mit 16k-Samples pro Sekunde gelesen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937346</guid><dc:creator><![CDATA[daishi]]></dc:creator><pubDate>Thu, 08 Dec 2005 13:45:34 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 14:26:52 GMT]]></title><description><![CDATA[<p>Du bekommst dann deine daten nich mehr per file sondern per Stream ?<br />
oder per Net I/O ?</p>
<p>nich das die geschichte mit dem File dann zum umweg wird ?</p>
<p>glaub nich dass nen Messystem in ne datei reinstreamt und sich drauf verlaesst dass du konkurrierend zugreifend den muell selber da rausraeumst ^^</p>
<p>also rein vom IO wenns sauber gemacht ist, iss 16kbyte / s eher unkritisch , da codier ich ja noch mp3's im hinnergrund bei ^^<br />
ich mach hier teilweisse mit 1000kbaud rum, ok, aber ich krieg meine daten auch per shared memory und mit events ... aber das parsen sollte da nich so das prob sein. In nen temp file schreiben schon eher, weil das zeitverhalten unter nichtechtzeit BS nicht definiert ist</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937388</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 08 Dec 2005 14:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 14:44:14 GMT]]></title><description><![CDATA[<p>Das wird dann später zweigleisig.<br />
Aktuelle Daten per Stream und da das Messsystem die Daten in Dateien ablegt benötige ich das Laden ja auch, um ältere Aufnahmen zu betrachten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937419</guid><dc:creator><![CDATA[daishi]]></dc:creator><pubDate>Thu, 08 Dec 2005 14:44:14 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 14:56:18 GMT]]></title><description><![CDATA[<p>daishi schrieb:</p>
<blockquote>
<p>Das wird dann später zweigleisig.<br />
Aktuelle Daten per Stream und da das Messsystem die Daten in Dateien ablegt benötige ich das Laden ja auch, um ältere Aufnahmen zu betrachten.</p>
</blockquote>
<p>In dem Fall solltest du auf jeden Fall die Stream-Version verwenden (andernfalls benötigst du zwei gesonderte Funktionen für's einlesen vom Netzwerk (vermutlich über ein istream-Derivat) und Datei (FILE*).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937431</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 08 Dec 2005 14:56:18 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 15:50:25 GMT]]></title><description><![CDATA[<p>Das system die daten in so Textformate als log wegspeichern is durchaus ueblich</p>
<p>Das messysteme die daten in streams in der selben form irgendwo rausstreamen, iss eher unueblich ^^</p>
<p>meist haben die systeme ne API (C-Header + dll) wo ma die daten pollen muss, oder noch besser per event benachrichtigt wird ...<br />
die daten liegen dann meist in schoenen C-Structs vor, andernfalls wuerd ich dem hersteller an die Gurgel springen ^^<br />
In dem Fall wuerd ich mir zur uebertragung nen format(protokoll) suchen(bauen) wo ich nimmer &quot;parsen&quot; muesst ^^</p>
<p>Naja, ich kenn aber nich alles was es aufm Markt gibt, waer aber ziemlich ungewoehlich ....</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937462</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 08 Dec 2005 15:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Datei laden und parsen (Optimierung) on Thu, 08 Dec 2005 21:11:30 GMT]]></title><description><![CDATA[<p>hier mal trick 17 mit selbst überlistung:</p>
<pre><code class="language-cpp">void read_file( istream &amp; str ) {
   //zwischenspeicher
   float array[4];
   int index=0;

   while(str){
      str&gt;&gt;array[index];
      ++index;
      if(index==4){
          //test
          //wenn eine neue messreihe anfängt, hat das array folgende form:
          //messreihenNummer|0|zahl|0
          //es gibt keine messwertkonstellation, bei denen die beiden                      
          //nullen an genau diesen stellen auftauchen könnten.
          //wenn der erste wert keine messreihenNummer ist, so geht der     
          //datensatz von element 0-2. element 3 gibt dann entweder die
          //nummer einer neuen messreihe, oder den ersten wert eines 
          //neuen datensatzes an. Da messreihen laut dateischnipsel mit 1 beginnen, und datensätze mit einer 2, bleibt nur der offsetwert übrig.

          if(array[3]==0){
               messreihenNummer=array[0];
               data1=array[1];
               data2=array[2];
               data3=array[3];

               //index zurücksetzen, array komplett ausgewertet
               index=0;
          }
          else
          {
               //kein offset wert.
               //die ersten 3 daten bilden einen messwert
               data1=array[0];
               data2=array[1];
               data3=array[2];

               //der 4. wert wurde &quot;zu früh&quot; gelesen, und wird an den anfang gesetzt
               array[0]=array[3];

               //da der erste wert gültig ist, index nicht auf 0 sondern 1 setzen
               index=1;
          }
      }
   }
}
</code></pre>
<p>//edit mom ich teste das eben schnell :p<br />
//edit2 der testschnipsel vom threadstarter funzt. Kriegts jemand noch schneller? jetzt wär ich mal so richtig gespannt^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937700</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 08 Dec 2005 21:11:30 GMT</pubDate></item></channel></rss>