In either case, Optimizing should only include functions that are ran the most. According to 'Optimizing C" by I forget who, 90% of the execution time of a program is spent in 10% of the code. Based on this, I'd recommend concentrate on getting the code working with the Security required, then optimize: Completly ignoring all initializing functions.
--- On Fri, 3/19/10, Paul Herring <[email protected]> wrote: From: Paul Herring <[email protected]> Subject: Re: [c-prog] Re: Initialize 2d array quickly? To: [email protected] Date: Friday, March 19, 2010, 11:34 AM On Fri, Mar 19, 2010 at 3:52 PM, Jimmy Johnson <boxer...@yahoo. com> wrote: [...] >> Yes. One (or two) allocation(s) instead of many smaller ones. Since >> you know exactly how many elements you need, a single allocation can be >> done. Even if you did NOT know how many elements to allocate, it is >> almost always faster to precalculate how many elements, allocate the >> amount of memory needed, and then perform the actual manipulation of the >> memory. > > Great! How do I do that? func1() - your method allocating row by row, then initialising cell by cell func2() - allocating it on one go , initialising cell by cell func3() - as func2() but only initialising row 0 cell by cell only, and copying that row to other rows Beneath that is some profiling showing a 20% saving in func2() (the 15 and 12 million numbers.) and 87% saving in func3() (2 million number) [...@pjhdesktop /tmp]# cat x.cpp #include <stdio.h> #include <string.h> double** func1(long width, long height){ double** buffer; long i, j; buffer = new double* [width]; for (i = 0; i < width; i++) { buffer [i] = new double [height]; }; for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { buffer[i][j] = -10000; }; }; return buffer; } double* func2(long width, long height){ double* buffer; long i, j; buffer = new double [width*height] ; for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { buffer[i*j] = -10000; }; }; return buffer; } double* func3(long width, long height){ double* buffer; long i, j; buffer = new double [width*height] ; for (i = 0; i < width; i++) { buffer[i] = -10000; } for (j = 1; j < height; j++) { memcpy(&buffer[ width*j], &buffer[0], (sizeof *buffer)*width) ; }; // printf("%g, %g, %g\n", buffer[0], buffer[9*5], buffer[(width- 1)*(height- 1)]); return buffer; } int main(void){ long x, y; x = y = 1000; func1(x, y); func2(x, y); func3(x, y); } [...@pjhdesktop /tmp]# make -B x g++ x.cpp -o x [...@pjhdesktop /tmp]# valgrind --tool=callgrind --quiet ./x [...@pjhdesktop /tmp]# callgrind_annotate `ls -rt | tail -n 1` ------------ --------- --------- --------- --------- --------- - Profile data file 'callgrind.out. 7116' (creator: callgrind-3. 5.0) ------------ --------- --------- --------- --------- --------- - I1 cache: D1 cache: L2 cache: Timerange: Basic block 0 - 4396874 Trigger: Program termination Profiled target: ./x (PID 7116, part 1) Events recorded: Ir Events shown: Ir Event sort order: Ir Thresholds: 99 Include dirs: User annotated: Auto-annotation: off ------------ --------- --------- --------- --------- --------- - Ir ------------ --------- --------- --------- --------- --------- - 31,377,182 PROGRAM TOTALS ------------ --------- --------- --------- --------- --------- - Ir file:function ------------ --------- --------- --------- --------- --------- - 15,028,028 ???:func1(long, long) [/tmp/x] 12,013,019 ???:func2(long, long) [/tmp/x] 2,024,148 ???:memcpy [/lib/i686/libc- 2.10.1.so] 567,995 /home/tex/BUILD/ glibc-2.10. 1/elf/../ sysdeps/generic/ dl-hash.h: do_lookup_ x 523,961 /home/tex/BUILD/ glibc-2.10. 1/elf/dl- lookup.c: _dl_lookup_ symbol_x [/lib/ld-2.10. 1.so] 341,585 /home/tex/BUILD/ glibc-2.10. 1/elf/do- lookup.h: do_lookup_ x [/lib/ld-2.10. 1.so] 181,298 /home/tex/BUILD/ glibc-2.10. 1/elf/../ sysdeps/i386/ dl-machine. h:_dl_relocate_ object 142,682 /home/tex/BUILD/ glibc-2.10. 1/string/ strcmp.c: strcmp [/lib/ld-2.10. 1.so] 128,046 ???:0x0006cba0 [/lib/i686/libc- 2.10.1.so] 111,900 /home/tex/BUILD/ glibc-2.10. 1/elf/do- lookup.h: check_match. 8313 [/lib/ld-2.10. 1.so] 73,443 ???:_dl_addr [/lib/i686/libc- 2.10.1.so] -- PJH http://shabbleland. myminicity. com/tra http://www.chavgang s.com/register. php?referer= 9375 [Non-text portions of this message have been removed]
