Re: My Explode function(s) are too slow.
FFMG wrote:
Hi,
I need the php equivalent of explode in one of my app.
I read a very big file and "explode" each line to fill a structure.
You are aware that not everyone knows PHP? What does "explode each line"
mean?
The reading of the file, 19Mb, (I will also need to streamline the way
I read each line I guess), takes about 10 seconds. But when I 'explode'
each line the process takes about 140 seconds.
This is what I have tried so far...
//-----------------------function A--------------------------
std::vector<std::string> explode(
const std::string s,
const std::string separator
You should pass those strings by reference.
)
{
const int iPit = separator.length();
std::vector<std::string> ret;
int iPos = s.find(separator, 0);
int iStart = 0;
The return type of std::string::find and std::string::length is
std::string::size_type, not int.
while(iPos>-1)
find() returns std::string::npos if nothing is found.
{
if(iPos!=0){
ret.push_back(s.substr(iStart,iPos-iStart));
iStart = (iPos+iPit);
}
iPos = s.find(separator, iStart);
} // end while
// add the last item if need be.
if(iStart != s.length()){
ret.push_back(s.substr(iStart));
}
return ret;
}
//-----------------------function B--------------------------
std::vector<std::string> explode(
const char* s,
const char separator
)
{
std::vector<std::string> ret;
char seps[] = {separator};
char *token = strtok( (char*)s, seps );
while( token != NULL )
{
ret.push_back( token );
token = strtok( NULL, seps );
}
return ret;
}
//--------------------------------------------------------------------
Function B is slightly faster than function A.
The second one just uses a single char as separator, while the first one
uses a whole string. If a single char is enough, you could implement A as:
std::vector<std::string> explode(const std::string& s, const char separator)
{
std::vector<std::string> ret;
std::stringstream stream(s);
std::string element;
while (std::getline(stream, element, separator))
ret.push_back(element);
return ret;
}