Author Topic: Byte array to lisp performance problems.  (Read 1516 times)

0 Members and 1 Guest are viewing this topic.

It's Alive!

  • BricsCAD
  • Needs a day job
  • Posts: 6935
  • AKA Daniel
Byte array to lisp performance problems.
« on: June 24, 2007, 10:38:10 AM »
Hi all, I need help speeding this function up.
Iím using Sifu Cornbreadís method to read a file into memory, then sending the bytes to a lisp list.
The method seems to bog down on large files, I think itís because I am creating a new resbuf for every byte.
Is there a better way to do this?
Thanks

Code: [Select]
static int ads_binget(void)
    {
        struct resbuf *pArgs = acedGetArgs () ;
        struct resbuf *pRetList = acutNewRb(RTLB);
        struct resbuf *pSVal;
        try
        {
            byte *byt;
            byte *bytHold;
            byte *bytEnd;

            TCHAR *szFile;
            DWORD   cb;
            HANDLE  hf;
            HANDLE  hfm;
            double result = 0.0;
            long cnt = 0;
            pSVal = pRetList;
            short val;

            if ( pArgs != NULL || pArgs->restype == RTSTR )
            {
                szFile = pArgs->resval.rstring;
            }
            else
            {
                acedRetNil();
                return 0; 
            }
            hf = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
            if (hf != INVALID_HANDLE_VALUE) {
                cb = GetFileSize(hf, NULL);
                hfm = CreateFileMappingA(hf, NULL, PAGE_READONLY, 0, 0, NULL);
                if (hfm != NULL) {
                    byt = (byte*)MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, cb);
                    bytHold = byt;
                    if(byt)
                    {
                        bytEnd = byt + cb;
                        while(byt<bytEnd)
                        {
                            pSVal = pSVal->rbnext = acutNewRb(RTSHORT); //mud bog 1
                            pSVal->resval.rint = *byt;
                            byt++;
                        }
                        UnmapViewOfFile(bytHold);
                        bytHold = NULL; //added
                    }
                    CloseHandle(hfm);
                    hfm = NULL; //added
                }
                CloseHandle(hf);
                hf = NULL; //added
            }

            pSVal = pSVal->rbnext = acutNewRb(RTLE);

            if (pRetList != NULL)
            {
                acedRetList(pRetList);//mud bog 2
                acutRelRb(pRetList);
            }
            else
            {
                acedRetNil();
            }
        }
        catch(...)
        {
            acutRelRb(pRetList);
        }
        return (RSRSLT);
    }


Ps here is the full source
http://www.theswamp.org/index.php?topic=17206.msg207772#msg207772

edit

« Last Edit: June 25, 2007, 07:19:58 AM by Danielm103 »