On Jan 12 15:06, Christian Franke wrote: > Lee wrote: > > Why is the cygwin gcc calloc so much slower than the > > i686-w64-mingw32-gcc calloc? > > 1:12 vs 0:11 > > > > $cat calloc-test.c > > #include > > #include > > #define ALLOCATION_SIZE (100 * 1024 * 1024) > > int main (int argc, char *argv[]) { > > for (int i = 0; i < 10000; i++) { > > void *temp = calloc(ALLOCATION_SIZE, 1); > > if ( temp == NULL ) { > > printf("drat! calloc returned NULL\n"); > > return 1; > > } > > free(temp); > > } > > return 0; > > } > > > > Could reproduce the difference on an older i7-2600K machine: > > Cygwin: ~20s > MinGW: ~4s > > Timing [cm]alloc() calls without actually using the allocated memory might > produce misleading results due to lazy page allocation and/or zero-filling. > > MinGW binaries use calloc() from msvcrt.dll. This calloc() does not call > malloc() and then memset(). It directly calls: > > mem = HeapAlloc(_crtheap, HEAP_ZERO_MEMORY, size); > > which possibly only reserves allocate-and-zero-fill-on-demand pages for > later. > > Cygwin's calloc() is different. But then again, Cygwin's malloc *is* slow, particulary in memory-demanding multi-threaded scenarios since that serializes all malloc/free calls. The memory handling within Cygwin is tricky. Attempts to replace good old dlmalloc with a fresher jemalloc or ptmalloc failed, but that only means the developer (i.e., me, in case of ptmalloc) was too lazy... busy! I mean busy... to pull this through. Having said that, if somebody would like to take a stab at replacing dlmalloc with something leaner, I would be very happy and assist as much as I can. Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat