• <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, 評論 - 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 閱讀(353) 評論(0)  編輯 收藏 引用

            久久国产精品99国产精| 97香蕉久久夜色精品国产| 日韩精品久久无码中文字幕| 亚洲国产精品一区二区久久hs | 久久99精品综合国产首页| 精品久久久久久久| 久久久精品久久久久久| 久久国内免费视频| 久久91精品国产91久久户| 狠狠人妻久久久久久综合蜜桃 | 精品视频久久久久| 77777亚洲午夜久久多喷| 日韩亚洲欧美久久久www综合网| 精品久久久久中文字| 久久无码人妻一区二区三区| 亚洲精品NV久久久久久久久久 | 国内精品久久久人妻中文字幕| 久久综合精品国产二区无码| 国产伊人久久| 精品国产乱码久久久久久郑州公司 | 久久精品国产福利国产琪琪| 亚洲av伊人久久综合密臀性色| 久久综合丁香激情久久| 亚洲欧美伊人久久综合一区二区| 99久久夜色精品国产网站| 麻豆AV一区二区三区久久 | 国产成人精品久久免费动漫| 亚洲国产成人久久综合碰| 伊人久久综在合线亚洲2019| 久久久婷婷五月亚洲97号色| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 99久久香蕉国产线看观香| 久久99亚洲综合精品首页| 日韩一区二区久久久久久| 国产婷婷成人久久Av免费高清| 久久综合亚洲色HEZYO社区| 久久一区二区三区免费| 久久无码AV中文出轨人妻| 九九久久精品国产| 久久本道综合久久伊人| 欧美久久亚洲精品|