Tomasz Rola <rto...@ceti.pl> wrote: > On Sun, Jun 24, 2018 at 10:53:37PM -0400, Steve Litt wrote: > > On Thu, 21 Jun 2018 00:56:04 +0200 > > Tomasz Rola <rto...@ceti.pl> wrote: > > > [...] > > > Craps. I have consulted OpenBSD's manpage for dd and there is no > > > mention of iflag. So this will not work on OpenBSD. I will have to > > > rethink this, sorry. > > > > > > > Untested... > > > > int main(int argc, char* argv[]){ > > long l = atod(argv[1]); > > while(l--){ > > if (c = getc(STDIN) != EOF) > > putc(c, STDOUT); > > else > > break; > > } > > return 0; > > } > > > > I haven't tested it so it might not be exactly right, and of course > > error handling would need to be added, but you know what I mean. IIRC > > getc() and putc() are very well buffered so it will be fast. In my > > youth I wrote similar functions using low level read() and write() and > > doing my own buffering, and those things were *really* fast, but I > > think that's overkill in this century. > > > > As far as finding command line tools that do it, if that's becoming > > hard to do, why not just write a 10 line program? > > Actually, I have written few such programs to satiate my own curiosity > - I was dragged away from computer and in the meantime, others joined > thread and even wrote nice buffered version of solution in C. I pitted > this solution against my programs (in C, with fgetc/fputc and Common > Lisp, with read-sequence/write-sequence) and head-c.c was many times > faster (about hundred or more times) than my programs. > > I am not sure if there is performance difference between fgetc/fputc > and getc/putc. Man says getc are macros around fgetc. Might be worth > checking, but I guess no difference. > > My curiosity also "wanted" to know how much of performance hit was to > be expected when writing best to my knowledge optimised Common Lisp vs > simplistic C - they were similar in performance, with CL compiled by > SBCL and few times slower, and head-c.c had beaten them both by many > lengths. I am a bit surprised that in CL, performance was about the > same, whether reading one byte or many at once. Perhaps I will find a > way to speed it up some more. > > As of finding command line tools, I had working script in about an > hour (and buggy one in few minutes). Buggy, because "dd | dd" is bad > idea, and after finding better options for using dd in my script - > which worked, but under Linux - I had also found out they would not > work in OpenBSD. > > So, I consider it a worthy lesson for myself. Next time, I might just > fire up Emacs and write a script in CL (mostly, because this is what > is comfy for me nowadays, and I will not object against having compiled > script for free). Or something similar, or maybe even do it in C, why > not. > > BTW, the version of nread.sh (improved options) was on par with > head-c.c, so writing a script with right things inside is very good > choice, too. If the script actually works :-) . > > While the speed is not big problem for input of about 1 megabyte, it > becomes a problem when gigabytes are copied.
Wow.