Deutsch English Français Italiano |
<uu934s$3hf4l$1@i2pn2.org> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder6.news.weretis.net!i2pn.org!i2pn2.org!.POSTED!not-for-mail From: fir <fir@grunge.pl> Newsgroups: comp.lang.c Subject: Re: macro for fir list? Date: Sat, 30 Mar 2024 14:13:04 +0100 Organization: i2pn2 (i2pn.org) Message-ID: <uu934s$3hf4l$1@i2pn2.org> References: <uu3s0m$3av2s$1@i2pn2.org> <uu88uo$qv85$3@dont-email.me> <uu8k48$3gr5r$1@i2pn2.org> <uu8leu$3gsq5$1@i2pn2.org> <uu8lqk$3gtd0$1@i2pn2.org> <uu8nju$3gvnj$1@i2pn2.org> <uu8rl0$v2o8$1@dont-email.me> <uu92rd$3heoj$1@i2pn2.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sat, 30 Mar 2024 13:13:01 -0000 (UTC) Injection-Info: i2pn2.org; logging-data="3718293"; mail-complaints-to="usenet@i2pn2.org"; posting-account="+ydHcGjgSeBt3Wz3WTfKefUptpAWaXduqfw5xdfsuS0"; User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0 SeaMonkey/2.24 X-Spam-Checker-Version: SpamAssassin 4.0.0 In-Reply-To: <uu92rd$3heoj$1@i2pn2.org> Bytes: 3593 Lines: 73 fir wrote: > bart wrote: >> On 30/03/2024 09:56, fir wrote: >> >>>> >>> yet other example >>> >>> //bytes container >>> char* bytes = NULL; int bytes_size = 0; >>> void bytes_add(char val) { >>> (bytes=(char*)realloc(bytes,++bytes_size*sizeof(char)))[bytes_size-1]=val; >>> >>> } >>> void bytes_load(char* name) { FILE *f = fopen(name, "rb"); int >>> c; while((c=getc(f))!=EOF) bytes_add(c); fclose(f); } >> >> This is pretty inefficient. Loading an 8MB file this way takes 3 >> seconds, vs. 50ms to load it in one go. >> >> Loading the same 90KB file 10,000 times took 120 seconds, vs. 0.8 >> seconds even using a scripting language. >> >> 80% of the inefficiency is growing the buffer one byte at a time. The >> other 20% is reading the file one byte at a time. >> >> > i know its inneficient but that was not the point - the point was more > about composition and utility > > i may revrite but the example would be much longer > > char* bytes = NULL; int bytes_size = 0; > char* bytes_resize(char size) {return > bytes=(char*)realloc(bytes,(bytes_size=size)*sizeof(char)); } > void bytes_add(char val) { > (bytes=(char*)realloc(bytes,++bytes_size*sizeof(char)))[bytes_size-1]=val; > } > void bytes_save(char* name) { FILE* f =fopen(name, "wb"); int > saved = fwrite (bytes , 1, bytes_size, f); fclose (f); } > > > int GetFileSize2(char *filename) > { > struct stat st; > if (stat(filename, &st)==0) return (int) st.st_size; > // ERROR_EXIT("error obtaining file size for &s", filename); > return -1; > } > > void bytes_load(char* name) > { > int flen = GetFileSize2(name); > FILE *f = fopen(name, "rb"); > int loaded = fread(bytes_resize(flen), 1, flen, f); > fclose(f); > } > > generally if some uses this bytes microcintainer (i call it also list, > though it is also resizable array) one may use thie add method which > callst reallock or call resize(1000) and use it by bytes[i] so its not > inefficient > > //@include "bytes.c" > for(int i=0;i<1000;i++) bytes_add(rand()&0xff); > > bytes_resize(1000); > for(int i=0;i<1000;i++) bytes[i]=rand()&0xff; > yoy may check how much it last to say insert 1M of bytes by add compared to resize and put it normall way - thic could measure overhead of this reallock... i may add this variable say _cached_size or what to name it, its a line of code ot wo and that will speed up but there still be a cost of if