找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2133|回复: 12

[研讨] 验证LISP与.NET的运算速度比较

[复制链接]
发表于 2013-6-21 10:10:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
为了验证LISP与.NET的运算速度比较
以删除重复点为例,点数据量9840 个(同样算法的基础上)
结果如下:

c#的处理速度如下:采集点集耗时...耗时: 0.48秒
查找X值相近的点...耗时: 2.64秒
查找Y值相近的点...耗时: 0.14秒

LISP的处理速度如下:
采集点集耗时...耗时:    0.188秒
查找X值相近的点...耗时: 3.031秒
查找Y值相近的点...耗时: 0.328秒

C#的代码:

  1. #region RRPT-删除整个图形中XY平面投影的重合点(XY值相近的点)

  2. [CommandMethod("RRPT")]
  3. public void m_RemoveRepeatPoints()
  4. {
  5.     m_ed.WriteMessage("\n功能:删除本图中重合的点(XY值相近的点)!");
  6.     double dJD = 0.001;
  7.     PromptDoubleOptions pdo = new PromptDoubleOptions("\n近似精度");
  8.     pdo.AllowNegative = false;
  9.     pdo.AllowNone = true;
  10.     pdo.AllowZero = true;
  11.     pdo.DefaultValue = dJD;
  12.     PromptDoubleResult pdr = m_ed.GetDouble(pdo);
  13.     if (pdr.Status != PromptStatus.OK)
  14.     {
  15.         return;
  16.     }
  17.     dJD = pdr.Value;
  18.     PromptSelectionResult m_Psr = m_ed.SelectAll(new SelectionFilter(new TypedValue[] { new TypedValue(0, "POINT") }));
  19.     int nNumPts = m_Psr.Value.GetObjectIds().Length;
  20.     m_ed.WriteMessage("\n共找到【{0}】个点!\n", nNumPts);
  21.     m_ed.WriteMessage("\n正在准备点集...");
  22.     mFun.m_TimeStart(); //开始记录时间
  23.     List<RRPTStruct> Pts = new List<RRPTStruct>();
  24.     RRPTStruct rs = new RRPTStruct();
  25.     foreach (ObjectId id in m_Psr.Value.GetObjectIds())
  26.     {
  27.         rs.pt = ((DBPoint)mFun.m_OpenEntity(id)).Position;
  28.         rs.id = id;
  29.         Pts.Add(rs);
  30.     }
  31.     m_ed.WriteMessage("耗时:{0}秒", mFun.m_TimeEnd().ToString("0.00"));
  32.     m_ed.WriteMessage("\n查找X值相近的点...");
  33.     var rp = from rps in Pts orderby rps.pt.X select rps;//点集排序(按X从小到大)
  34.     Pts = rp.ToList<RRPTStruct>();
  35.     Utils.SetApplicationStatusBarProgressMeter("正在查找X值相近的点...", 0, nNumPts - 1);
  36.     mFun.m_TimeStart();
  37.     RRPTStruct rs1 = new RRPTStruct();
  38.     rs = Pts[0];
  39.     int n = 0;
  40.     List<RRPTStruct> PtsX = new List<RRPTStruct>();
  41.     for (int i = 1; i < nNumPts; i++)
  42.     {
  43.         rs1 = Pts[i];
  44.         if (Math.Abs(rs.pt.X - rs1.pt.X) <= dJD)
  45.         {
  46.             if (!PtsX.Contains(rs))
  47.             {
  48.                 PtsX.Add(rs);
  49.             }
  50.             PtsX.Add(rs1);
  51.             n++;
  52.         }
  53.         else
  54.         {
  55.             rs = rs1;
  56.         }
  57.         Utils.SetApplicationStatusBarProgressMeter(i);
  58.     }
  59.     Utils.RestoreApplicationStatusBar();
  60.     m_ed.WriteMessage("耗时:{0}秒,共有【{1}】个X值相近的点", mFun.m_TimeEnd().ToString("0.00"), n + 1);
  61.     m_ed.WriteMessage("\n查找Y值相近的点...");
  62.     rp = from rps in PtsX orderby rps.pt.Y select rps;//点集排序(按Y从小到大)
  63.     PtsX = rp.ToList<RRPTStruct>();
  64.     if (PtsX.Count > 2)
  65.     {
  66.         Utils.SetApplicationStatusBarProgressMeter("正在查找Y值相近的点...", 0, nNumPts - 1);
  67.         mFun.m_TimeStart();
  68.         rs = PtsX[0];
  69.         n = 0;
  70.         for (int i = 1; i < PtsX.Count; i++)
  71.         {
  72.             rs1 = PtsX[i];[/i]
  73.             if (Math.Abs(rs.pt.Y - rs1.pt.Y) <= dJD)
  74.             {
  75.                 mDraw.m_EraseEntity(rs1.id);
  76.                 n++;
  77.             }
  78.             else
  79.             {
  80.                 rs = rs1;
  81.             }
  82.             Utils.SetApplicationStatusBarProgressMeter(i);
  83.         }
  84.     }
  85.     Utils.RestoreApplicationStatusBar();
  86.     m_ed.WriteMessage("耗时:{0}秒,共有【{1}】个Y值相近的点\n已删除【{2}】个重合点", mFun.m_TimeEnd().ToString("0.00"), n, n);
  87. }
  88. private struct RRPTStruct
  89. {
  90.     public Point3d pt;
  91.     public ObjectId id;
  92. }
  93. #endregion


LISP的代码:
[pcode=lisp,true]
(defun c:cc ( / a b e e1 e2 elst i L lst mod nmax num ptx ptxy ss strmsg t0 t1 t2 x1 x2)
  (vl-load-com)
  (setq mod (getvar "modemacro"))
  (if (setq ss (ssget "X" '((0 . "POINT"))))
    (progn
      ;开始记录时间
      (setq t0 (car (_VL-TIMES)))
      (vla-startundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
      (setq L  (sslength ss)
            i    0
      )
      (repeat L
        (setq e    (ssname ss i)
              elst (entget e)
              PtXY (cdr (assoc 10 elst))
              lst  (cons (list e PtXY) lst)
        )
        (setq i (1+ i))
      )
      ;结束记录时间
      (princ (strcat "\n采集点集耗时" (rtos (* 0.001 (- (car (_VL-TIMES)) t0)) 2 4) "秒"))
      (princ)
      ;点集排序(按X从小到大)
      (setq lst (vl-sort lst (function (lambda (e1 e2) (< (car (cadr e1)) (car (cadr e2)))))))
      (setq i 0 num 0 L (length lst) nMax L)
      (setq strMsg "◎查找X值相近的点,请稍等...")
      (ayProcess1 nMax 0 strMsg) ;初始化状态栏
      ;开始记录时间
      (setq t1 (car (_VL-TIMES)))
      (repeat L
        (setq a (nth i lst))
        (setq x1 (car (cadr a)))
        (setq b (nth (1+ i) lst))
        (setq x2 (car (cadr b)))
        (if (and x2 (equal x1 x2 0.001))
          (progn
            (setq num (1+ num))
            (entdel (car a))
            (setq ptX (cons b ptX))
          )
        )
        (setq i (1+ i))
        (ayProcess1 nMax i strMsg)
      )
      ;结束记录时间
      (princ (strcat "\n查找X值相近的点耗时" (rtos (* 0.001 (- (car (_VL-TIMES)) t1)) 2 4) "秒"))
      ;点集排序(按Y从小到大)
      (setq ptX (vl-sort ptX (function (lambda (e1 e2) (< (cadr (cadr e1)) (cadr (cadr e2)))))))
      (setq i 0  L (length ptX) nMax L)
      (setq strMsg "◎查找Y值相近的点,请稍等...")
      (ayProcess1 nMax 0 strMsg) ;初始化状态栏
      ;开始记录时间
      (setq t2 (car (_VL-TIMES)))
      (repeat L
        (setq a (nth i ptX))
        (setq x1 (cadr (cadr a)))
        (setq b (nth (1+ i) ptX))
        (setq x2 (cadr (cadr b)))
        (if (and x2 (equal x1 x2 0.001))
          (progn
            (setq num (1+ num))
            (entdel (car a))
          )
        )
        (setq i (1+ i))
        (ayProcess1 nMax i strMsg)
      )
      ;结束记录时间
      (princ (strcat "\n查找Y值相近的点耗时" (rtos (* 0.001 (- (car (_VL-TIMES)) t2)) 2 4) "秒"))
      (princ (strcat "\n共删除" (itoa num) "个重复实体"))
      (vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
    )
    (alert "图面上无高程点!")
  )
  (setvar "modemacro" mod)
  (princ)
)
(defun ayProcess1 (MaxValue Value xMessage / xMax xVal xMsg i)
  (vl-load-com)
  (setq xMax (fix (abs MaxValue)))
  (setq xVal (fix Value))
  (setq xMsg xMessage)
  (if (<= xMax 0) (setq xMax 100))
  (if (> xVal xMax) (setq xVal xMax))
  (if (= xMsg nil) (setq xMsg "进度信息"))
  ;;;捕捉由于ACET-UI_PROGRESS引起的错误而不至于终止程序的运行.
  (vl-catch-all-apply
    '(lambda (iMax iVal iMsg / xtmp)
       (progn
         (if (= iMsg nil) (setq iMsg "进度信息"))
         (cond
           ((= iVal 0) (acet-ui-progress iMsg iMax))
           ((and (> iVal 0) (<= iMax)) (acet-ui-progress -1))
           ((or (< iVal 0) (> iVal iMax)) (acet-ui-progress))
         );end_cond
         (setq xtmp "GOOD")
      );end_progn
    );end_defun Lambda function.
    (list xMax xVal xMsg)
  );end_vl-catch-all-apply
  (setq xxx "A.Yunger Studio Welcome to you have tea together for happy time!")
);end_defun

[/pcode]

总结:程序的算法相当的重要!!!不对之处请指导

评分

参与人数 3D豆 +20 贡献 +2 收起 理由
xshrimp + 5 很给力!经验;技术要点;资料分享奖!
XDSoft + 10 + 1 好主题奖!
炫翔 + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-21 10:55:53 来自手机 | 显示全部楼层
你把进度条去掉试试来自: Android客户端

点评

但是C#也有进度条啊  详情 回复 发表于 2013-6-21 11:05
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-21 11:05:52 | 显示全部楼层
Free-Lancer 发表于 2013-6-21 10:55
你把进度条去掉试试

但是C#也有进度条啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-21 11:18:39 来自手机 | 显示全部楼层
应该是完成同样的功能比较时间,lisp用lisp最佳方法,c#用c#方法,在lisp方法中应该一次排到位,不是先 x 再 y来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1261个

财富等级: 财源广进

发表于 2013-6-21 12:40:08 | 显示全部楼层
Lisp用进度条会慢好多好多好多的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-22 10:01:05 | 显示全部楼层
骨灰级了  研究这个~~~~~~~~~~~~~~~~~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3256个

财富等级: 富可敌国

发表于 2013-6-22 10:24:47 | 显示全部楼层
这个是有多高深啊.net  单纯从函数运行速度,不考虑算法,应该比lisp快
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-6-22 13:13:55 | 显示全部楼层
很给力!经验
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-6-22 13:31:24 | 显示全部楼层
10W line ,Entmake 和 XDAPI 中的 xdrx_line1 比,Entmake 3.x s ,xdrx_line1 6.7s
可能时间都浪费在通讯上了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-6-22 15:02:25 | 显示全部楼层
请把 (setq b (nth (1+ i) ptX)) 换成  (setq b (car ptX)) (setq ptx (cdr ptx)) 试试!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-6-22 15:02:35 | 显示全部楼层
请把 (setq b (nth (1+ i) ptX)) 换成  (setq b (car ptX)) (setq ptx (cdr ptx)) 试试!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-6-22 15:03:03 | 显示全部楼层
请把 (setq b (nth (1+ i) ptX)) 换成  (setq b (car ptX)) (setq ptx (cdr ptx)) 试试!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3337个

财富等级: 富可敌国

发表于 2013-6-22 16:21:00 | 显示全部楼层
楼主把电脑升级试试:lol
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 20:03 , Processed in 0.454557 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表