Menu

#412 Small code optimisation....

open
2
2005-04-08
2005-04-08
Anonymous
No

In a number of cases in the core there are places where
multiple temporary buffers are separately ckalloc'd,
used, then separately ckfree'd. These could be rolled
into a single larger buffers which are then subdivided.
Not a great win, but it is faster.

eg. tclCmdAH.c

1705d1704
< char *allocbuf = NULL;
1740,1747c1739,1743
< const size_t sz1 = numLists * sizeof(int);
< const size_t sz2 = numLists * sizeof(Tcl_Obj **);
< allocbuf = (char *)ckalloc(3*sz1 + 2*sz2);
< index = (int *) allocbuf;
< varcList = (int *) ((char *)allocbuf + sz1);
< varvList = (Tcl_Obj **) ((char *)varcList + sz1);
< argcList = (int *) ((char *)varvList + sz2);
< argvList = (Tcl_Obj **) ((char *)argcList + sz1);
---
> index = (int *) ckalloc(numLists * sizeof(int));
> varcList = (int *) ckalloc(numLists * sizeof(int));
> varvList = (Tcl_Obj ***) ckalloc(numLists * sizeof
(Tcl_Obj **));
> argcList = (int *) ckalloc(numLists * sizeof(int));
> argvList = (Tcl_Obj ***) ckalloc(numLists * sizeof
(Tcl_Obj **));
1869c1865,1869
< ckfree((char *) allocbuf);
---
> ckfree((char *) index);
> ckfree((char *) varcList);
> ckfree((char *) argcList);
> ckfree((char *) varvList);
> ckfree((char *) argvList);

Admittedly this is not a common code path.

A similar change can be used in:

a) tclCmdMZ.c at lines ~1922 (string map) to reduce 2
or 3 ckalloc's down to 1.

b) tclCompCmds.c:
line ~687 for var[cv]list

c) tclCompCmds.c
line ~2933 for fixupArray and fixupTargetArray

Would save a few cycles.

Discussion

  • miguel sofer

    miguel sofer - 2005-04-08

    Logged In: YES
    user_id=148712

    Just remarking that (in 8.5) memory allocations that have
    the lifetime of a command can (and should?) use
    TclStackAlloc / TclStackFree. These allocate memory from
    Tcl's execution stack.

     
  • Donal K. Fellows

    • priority: 5 --> 2
    • assigned_to: dkf --> msofer
     
  • Donal K. Fellows

    Logged In: YES
    user_id=79902

    Feels like a low priority fix to me; assigning to someone
    who cares more about doing minor opts than I do.

     
  • Nobody/Anonymous

    Logged In: NO

    "/software/packages"=pkg_repl("perl-DBD-Pg","1.31-6","i386");

     
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.