On 15/09/2014, at 1:34 PM, srean wrote:
> Two questions:
>
> i) Does Felix de-synchronize C++ I/O from cstdio ? That speed up things quite
> a bit
No .. but then Felix doesn't use C++ I/O streams. Its all C FILE*.
In any case this program doesn't do much I/O to the console.
>
> ii) Rather than using the function split, would it be better to use a
> generator that yields the lines. Felix has readln for that, correct ?
Dunno. I'm looking at the split function .. and I'm not surprised its
horrendously slow.
Not surprised at all. I could speed this up heaps and heaps!!
fun rev_split (x:string, d:char): List::list[string] = {
fun aux (x:string,y:List::list[string]) =>
match find (x, d) with
| None => Cons (x, y)
| Some ?n => aux$ x.[n+1 to], List::Cons (x.[to n],y)
endmatch
;
return aux$ x, List::Empty[string];
}
So, ok, this is tail recursive. But it works by chopping off the head substring
and pushing it onto a list, then calls itself on the tail substring.
Which means .. copying the tail substring. It would be much faster to use
RE2::StringPiece here. That's a pointer and length count into an *existing*
string. No copying. At the end you'd have to copy the list of string pieces
into a list of actual strings.
Alternatively, one could just use the unsafe_cstr function and scan
the underlying array, making the new strings as we go. Or just pass in
the starting location for the rest of the scan (assuming there's a find_from
function that starts looking at a particular location).
So thanks for bringing my attention to this.
Unfortunately this is unlikely to speed up Ryan's original test case much.
Felix readln calls:
gen readln: ifile -> string ="::flx::rtl::ioutil::readln($1)";
string readln (FILE *f) {
bool doecho = flx_isstdin(f) && !flx_isatty (f);
if (doecho)
return echo_readln(f);
else
return raw_readln (f);
}
// includes newline if present
// null string indicates end of file
string raw_readln (FILE *fi)
{
if(fi)
{
string x = "";
char buffer[MYBUFSIZ+1];
buffer[MYBUFSIZ]='\0';
next:
bool eof = fgets(buffer, MYBUFSIZ, fi) == 0;
if(eof) return x;
x = x + string(buffer);
if(x[x.size()-1]=='\n') return x;
goto next;
}
else return "";
}
--
john skaller
[email protected]
http://felix-lang.org
------------------------------------------------------------------------------
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language