Sujet : Re: macro for fir list?
De : fir (at) *nospam* grunge.pl (fir)
Groupes : comp.lang.cDate : 30. Mar 2024, 14:08:03
Autres entêtes
Organisation : i2pn2 (i2pn.org)
Message-ID : <uu92rd$3heoj$1@i2pn2.org>
References : 1 2 3 4 5 6 7
User-Agent : Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0 SeaMonkey/2.24
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;