Subject:
|
Re: how does a line ends?
|
Newsgroups:
|
lugnet.cad
|
Date:
|
Sat, 7 Apr 2007 18:32:40 GMT
|
Viewed:
|
1742 times
|
| |
| |
In lugnet.cad, Travis Cobbs wrote:
|
Ill tell you what. Ill drop your algorithm into LDView and do some
empirical tests on the timing, and get back to you. Ill post the final
version of my fgets replacement along with the timing results.
|
OK, as promised, here it my fgets replacement:
char *myFgets(char *buf, int bufSize, FILE *file)
{
int i;
for (i = 0; i < bufSize - 1; i++)
{
int char1 = fgetc(file);
if (feof(file))
{
buf[i] = 0;
if (i > 0)
{
return buf;
}
else
{
return NULL;
}
}
if (char1 == '\r' || char1 == '\n')
{
int char2 = fgetc(file);
buf[i] = '\n';
buf[i + 1] = 0;
if (!feof(file))
{
if (!(char1 == '\r' && char2 == '\n' ||
char1 == '\n' && char2 == '\r'))
{
ungetc(char2, file);
}
}
return buf;
}
buf[i] = (char)char1;
}
buf[bufSize - 1] = 0;
return buf;
}
It seems to work, but Im not 100% confident in its lack of bugs. Timing with
8464.mpd results in about 550ms for loading using fgets and 750ms using myFgets
from above. On the one hand, thats a 50% slowdown based purely on that one
change. On the other hand, 750ms isnt very long, and while 8464.mpd isnt
exactly a huge file, its big enough to prove your point that the performance is
fine.
At this point, Im much more concerned about any possible bugs in the code,
though. I have a fairly high confidence level that fgets does what its
supposed to do in all possible cases. I dont have the same confidence level
for the myFgets function above.
--Travis
|
|
Message has 3 Replies: | | Re: how does a line ends?
|
| (...) That was quick! Thanks for taking the time to indulge me... (...) It is interesting that it was that much time difference. Are these the total load times, or just profiling of the time spent inside the fgets() routines? I see one or two things (...) (18 years ago, 7-Apr-07, to lugnet.cad, FTX)
| | | Re: how does a line ends?
|
| (...) Just as a proof of the value of disk caching, loading the same model using the system fgets after a fresh reboot, the same loading portion took 3300ms. Also, I switched the feof calls out for a check of the value against EOF just to see if it (...) (18 years ago, 7-Apr-07, to lugnet.cad, FTX)
| | | Re: how does a line ends?
|
| (...) As long as you only have one character to 'unget' you could probably speed it up by introducing a static char which holds the 'ungetted' char (or null), instead of going through ungetc() -- fgetc(). OTOH, the if-statement to check if there is (...) (18 years ago, 8-Apr-07, to lugnet.cad)
|
Message is in Reply To:
| | Re: how does a line ends?
|
| (...) You'll note that I didn't really say that there was anything wrong with your parsing routine (other than some personaly negative feelings about fgetc and ungetc). After fixing the bugs, it will do exactly what you say it will do. It's just (...) (18 years ago, 7-Apr-07, to lugnet.cad, FTX)
|
24 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
This Message and its Replies on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|