Mein Code ist zu langsam



  • so lese ich eine Datei, wo die Daten von mehreren Channels gespeichert sind. Danach schereibe die Headers in einer einzigen Datei 'Headers.txt' und die Werte separat in Files Channnel_1.txt,Channnel_2.txt...

    Das Problem ist, dass das Programm sehr sehr langsam ist...
    Ich habe 2MB große ASCII Dateien zu lesen.
    ich dachte STL ist hoch-optimiert.Ich habe das Gleiche im Matlab durchgeführt und alles läuft viel schneller. Also mein C++ Code ist nicht optimal geschrieben...

    Hier ist mein Code und ich brauche Hilfe, um das Lesen und Schreiben der Dateien zu beschleunigen

    #include <fstream> 
    #include <sstream>
    #include <iostream>
    
    using namespace std;
    
    inline double stof(const string& in)
    { return atof(in.c_str()); } 
    
    int main() 
    {
    	vector<double> x;
    	vector<string> s;
    	vector<int> idx_channel;
    	int idx_re;
    	fstream gen_datei("Headers.txt",ios::out);
    	ifstream infile( "signale_kurz.txt" );
    	copy(istream_iterator<string>(infile),istream_iterator<string>(),back_inserter(s));
    
    for(int i=0;i<(int)s.size();++i) if((s[i].find("CHANNEL")!=string::npos))idx_channel.push_back(i);	
    	//copy(idx_channel.begin(),idx_channel.end(),ostream_iterator<int>(cout, " \n"));	
    	for(int i=0;i<(int)idx_channel.size();++i)
    	{		
    		idx_re=idx_channel[i];		
    		if(i<(int)idx_channel.size()-1)	
    		{
    		while(idx_re<idx_channel[i+1])
    		{
    				if(s[idx_re].find("START")!=string::npos)idx_re=idx_re+3;
    				else if(s[idx_re].find("AU")!=string::npos)idx_re=idx_re+2;
    				else if(s[idx_re].find("V")!=string::npos)idx_re=idx_re+2;
    				else if(atof(s[idx_re].c_str())==0)idx_re++; 
    				else break;
    		}
    		}
    		else
    		{
    			while(idx_re<s.size())
    		{
    				if(s[idx_re].find("START")!=string::npos)idx_re=idx_re+3;
    				else if(s[idx_re].find("AU")!=string::npos)idx_re=idx_re+2;
    				else if(s[idx_re].find("V")!=string::npos)idx_re=idx_re+2;
    				else if(atof(s[idx_re].c_str())==0)idx_re++; 
    				else break;
    		}
    		}
    
    		if(i<(int)idx_channel.size()-1)			
    			transform(s.begin()+idx_re,s.begin()+idx_channel[i+1]-1,back_inserter(x),stof);
    		else		
    			transform(s.begin()+idx_re,s.end(),back_inserter(x),stof);
    
    		stringstream filename;
    		stringstream info_filename;
    		filename<<"Channel_"<<i+1<<".txt";		
    		fstream datei( filename.str().c_str(),ios::out);
    		copy(x.begin(),x.end(),ostream_iterator<double>(datei,"\n"));
    		if(i==0)
    		{
    		copy(s.begin(),s.begin()+idx_channel[0],ostream_iterator<string>(gen_datei,"\n"));
    		copy(s.begin()+idx_channel[0],s.begin()+idx_re,ostream_iterator<string>(gen_datei,"\n"));
    		}
    		else
    		copy(s.begin()+idx_channel[i],s.begin()+idx_re,ostream_iterator<string>(gen_datei,"\n"));
    		x.clear();
    		datei.close();
    	}
    	gen_datei.close();
    }
    


  • Datein ein und auslesen dauert im Debug Modus ewig ! 🙂
    Also auf release stellen ...

    Vieleicht liegts auch am Code ... habe ich mir jetzt nicht angeguckt ...



  • und wie stelle ich auf release ???
    Scuzi aber mir muss du ganz ins Detail erkären ich bin beim ABC...lernen...

    Ich arbeite mit VisualStudio.NET 2003 und ist ertelle immer eine Konsolenanwendung
    und ich lasse die laufen mit 'Start without debugging'(STRG+F5)
    Was soll ich anderes machen?



  • oben in dem Steuerelement wo "Debug" steht auf "Release" um stellen
    btw. sowas liest man eig. im handbuch nach...


Anmelden zum Antworten