[Richard Suchenwirth] 2007-10-23 : In the [Tcl chatroom] we discussed that [Tcl] is much slower than [Perl] in doing simple things like reading a text file line-by-line. Here is an experiment with [tcltcc] to expose C's "raw" file I/O directly to Tcl. No [encoding] or line-end treatment takes place, so files written by these routines are always [UTF-8]-encoded (of which [ASCII] is a subset). Also, file handles are just hexdumped into handle strings, no precaution is taken against pilot errors. Caveat usor ... :^) With maybe some slight modifications, it should be usable with [Critcl] and [Odyce] as well. package require tcc namespace import tcc::* cproc fopen {char* name char* mode} char* { static char handle[16]; FILE* fp = fopen(name, mode); sprintf(handle,"%p",fp); return &handle; } cproc fgets {char* handle} char* { FILE* fp; static char buf[4096]; if(!strcmp(handle,"stdin")) fp = stdin; else sscanf(handle,"%p",&fp); fgets(&buf, sizeof(buf)-1, fp); buf[strlen(buf)-1] = '\0'; return &buf; } cproc fputs {char* handle char* str} ok { FILE* fp; if(!strcmp(handle,"stdout")) fp = (FILE*)stdout; else if(!strcmp(handle,"stderr")) fp = (FILE*)stderr; else sscanf(handle,"%p",&fp); fputs(str,fp); fputs("\n",fp); return TCL_OK; } cproc fclose {char* handle} ok { FILE* fp; sscanf(handle,"%p",&fp); fclose(fp); return TCL_OK; } cproc feof {char* handle} int { FILE* fp; sscanf(handle,"%p",&fp); return feof(fp); } #-- Testing: writing with quickio set f [fopen test.txt w] fputs $f hällo, fputs $f world! fclose $f #-- reading with Tcl, as utf-8 set f [open test.txt] fconfigure $f -encoding utf-8 puts >>[read $f][close $f] #-- reading with quickio, should be the same thing set f [fopen test.txt r] while 1 { set line [fgets $f] if [feof $f] break puts >>$line<< } #-- Test, switchable between Tcl and quickio routines: set prefix "f" set f [${prefix}open [lindex $argv 0] r] while 1 { set line [${prefix}gets $f] if {[${prefix}eof $f]} break ${prefix}puts stdout $line } ${prefix}close $f The last test gives, on Win XP, Tcl 8.5b1, tcltcc0.2, and a text file with 42741 lines: Tcl (prefix ""): real 0m3.092s user 0m0.076s sys 0m0.045s quickio (prefix "f"): real 0m3.015s user 0m0.060s sys 0m0.030s ---- | [Category Example] | [Category Performance] |