• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Life is Good.

            Enhance Tech and English
            隨筆 - 65, 文章 - 20, 評(píng)論 - 21, 引用 - 0
            數(shù)據(jù)加載中……

            Boosting Lisp performance - cons vs append and foreach vs while/nth

            From our PD- Nate Holt:

            All,

             More and more of you are finding that you have to deal with this goofy language called AutoLISP. Here are a couple items I pulled together related to some lisp “best practices”. Both apply to optimizing performance when processing large “lists” of data.

            Thanks,

            Nate.

                CONS versus APPEND

            The cons function adds an element to the beginning of a list. The append function can be used to give the equivalent of adding an element to the beginning or end of a list.

            Using the cons function can be MUCH faster than using append to build up a large list.

            We'll run two tests to create a dummy list of 10,000 integer numbers. The first test is using the "cons" function. Appload and type test1 [enter] at the command prompt.

            (defun c:test1 ( / )
              (setq i 1)
              (setq lst nil) ; start out with a blank list
              (repeat 10000
                (setq lst (cons i lst)) ; add next element to beginning of list
                (setq i (1+ i))
              )
              (setq lst (reverse lst)) ; put list back into correct order
              (princ)
            )

            The second test yields the same result but uses the "append" function:

            (defun c:test2 ( / )
              (setq i 1)
              (setq lst nil) ; start out with a blank list
              (repeat 10000
                (setq lst (append lst (list i))) ; append next element on to end of list
                (setq i (1+ i))
              )
              (princ)
            )

            The first test using "cons" builds the 10,000 element list in memory in less than 0.01 seconds (on my T61p).The second test using "append" builds the exact same 10,000 element list in memory but takes a full 3.55 seconds to execute ( ! ). Dealing with large lists, it appears that the "cons" function is many, many times faster.

            ·         FOREACH versus WHILE / NTH

            Let's say you need to cycle through a huge list, one list element at a time. There are two different functions that can cycle through a list, "foreach" and "nth" combined with a "while" loop. When dealing with a very large list, the "foreach" function can be much faster than using a while loop / nth function to index through the list.

            These tests use the 10,000 element list held in memory created be either of the above two tests. This next test uses "foreach" to cycle through the 10,000 element list.

            (defun c:test3 ( / )
              ; use 10,000 element "lst" created by test1 or test2
              (setq find_int (getint "\nFind integer="))
              (setq foundit nil)
              (foreach x lst
                (if (AND (not foundit) (= x find_int))
                  (progn
                    (setq foundit T)
                    (princ " found") 
                ) )   
              )
              (princ)
            )

            This next test does the same thing but uses a "while" loop and the "nth" function to index its way through the 10,000 element list:

            (defun c:test4 ( / )
              ; use 10,000 element "lst" created by test1 or test2
              (setq find_int (getint "\nFind integer="))
              (setq foundit nil)
              (setq ix 0)
              (setq slen (length lst))
              (while (AND (not foundit)(< ix slen))
                (if (= (nth ix lst) find_int) ; look for match
                  (progn ; Found the target element
                    (setq foundit T)
                    (princ " found") 
                ) )
                (setq ix (1+ ix))  
              )
              (princ)
            )

            For the test, looking for integer value 5000 (halfway into the list). The "foreach" function finds and exits in less than 0.01 second. The while loop using the "nth" function finds and exits in 0.07 seconds. Using foreach is significantly faster in processing this large list.

            posted on 2008-11-10 10:49 Mike Song 閱讀(350) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久人人爽人人澡人人高潮AV | 亚洲AV无一区二区三区久久 | 久久精品男人影院| 久久不射电影网| 久久久久国产日韩精品网站| 国产福利电影一区二区三区久久久久成人精品综合 | 久久久久久精品久久久久| 欧美熟妇另类久久久久久不卡 | 99久久人人爽亚洲精品美女| 亚洲欧美久久久久9999| 国产精品99久久精品| 久久久久久A亚洲欧洲AV冫| 无码超乳爆乳中文字幕久久| 品成人欧美大片久久国产欧美...| 久久亚洲熟女cc98cm| 天天综合久久久网| 久久久久久久久久久| 精品熟女少妇aⅴ免费久久| 亚洲国产精品成人久久| 久久香蕉国产线看观看猫咪?v| 久久ZYZ资源站无码中文动漫| 少妇久久久久久被弄到高潮| 久久亚洲精品中文字幕| 久久久久人妻一区二区三区| 青青青青久久精品国产h久久精品五福影院1421 | 久久男人中文字幕资源站| 亚洲精品乱码久久久久久蜜桃图片 | 久久久人妻精品无码一区| 国产一区二区三区久久| 亚洲午夜久久久久久噜噜噜| 一级a性色生活片久久无少妇一级婬片免费放 | 国产69精品久久久久777| 人妻无码精品久久亚瑟影视| 精品国产青草久久久久福利 | 国产91久久精品一区二区| 欧美午夜精品久久久久免费视 | 久久国产精品久久久| 久久精品人人做人人爽97| 欧美午夜精品久久久久免费视| 97精品依人久久久大香线蕉97| 色青青草原桃花久久综合|