找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2201|回复: 11

[原创] C# VLA ENTMAK COMMAND VL-CMDF创建实体测试

[复制链接]
发表于 2013-7-4 08:38:58 | 显示全部楼层 |阅读模式

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

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

×
实现同一个功能创建一个LINE

  1. (setq ms (vla-get-ModelSpace (vla-get-ActiveDocument(vlax-get-Acad-Object)))
  2.        pt1(vlax-3d-point '(0.0 0.0 0.0))
  3.        pt2(vlax-3d-point '(10.0 20.0 0.0))
  4.        )
  5. (defun c#-ln ()
  6. (vl-cmdf "apple_line")
  7. )
  8. (defun vla-ln()
  9.   (vla-addline ms pt1 pt2)
  10. )
  11. (defun comd-ln ()
  12.   (vl-cmdf ".line" '(0.0 0.0 0.0) '(10.0 20.0 0.0) "")
  13. )
  14. (defun entmk-ln()
  15.   (entmake '((0 . "line")(10 0.0 0.0 0.0)(11 10.0 20.0 0.0)))
  16.       )

  17. ;;;用以前论坛上朋友发的测试函数
  18. (defun c:tt ()
  19.   (setvar "cmdecho" 0)
  20.   (setq re_times 10000)
  21.   (setq funlist (list c#-ln vla-ln comd-ln entmk-ln))
  22.    (foreach fun funlist
  23.     (progn
  24.       (setq t1 (getvar "date")) ;_记录开始时间t1
  25.       (repeat re_times
  26.         (fun)
  27.       ) ;_repeat
  28.       (setq t2 (getvar "date")) ;_记录结束时间t2
  29.       (princ "函数:")(princ fun)(princ "测试结果")
  30.       (princ (menucmd (strcat "M=$(edtime," (rtos (- t2 t1) 2 16) ",HH:MM:SS:MSEC)")))
  31.       (princ "\n")
  32.     ) ;_progn

  33.   ) ;_foreach
  34.   (setvar "cmdecho" 1)
  35.   (princ)
  36. )

c#测试DLL已经上传,见附件,用NETLOAD加载后直接用(vl-cmdf "apple_line")
上面函数测试结果
:#<USUBR @0cad1294 C#-LN>测试结果00:00:07:019
函数:#<USUBR @0cad12bc VLA-LN>测试结果00:00:01:045
函数:#<USUBR @0cad12e4 COMD-LN>测试结果00:00:07:332
函数:#<USUBR @0cad130c ENTMK-LN>测试结果00:00:00:342
可见ENTMAK方法速度最快
VLA次之
C# 和 CAD命令差别不大

现在把VL-CMDF换成COMMAND得到下面结果
函数:#<USUBR @0af09a14 C#-LN>测试结果00:00:07:315
函数:#<USUBR @0c767230 VLA-LN>测试结果00:00:01:045
函数:#<USUBR @0c76617c COMD-LN>测试结果00:00:18:751
函数:#<USUBR @0c766bb8 ENTMK-LN>测试结果00:00:00:357
对C#影响不大,但是对CAD命令效率影响很大,上面测试有助于LISP编程中提高效率
另外我们再做另外一个测试,上面的C#运用了浮点运算,现在我们将C#中的浮点改成整数,同样也分别将VLA/COMMAND等改成整数
  1. (setq ms (vla-get-ModelSpace (vla-get-ActiveDocument(vlax-get-Acad-Object)))
  2.        pt1(vlax-3d-point '(0 0 0))
  3.        pt2(vlax-3d-point '(10 20 0))
  4.        )
  5. (defun c#-ln ()
  6. (command "apple_line")
  7. )
  8. (defun vla-ln()
  9.   (vla-addline ms pt1 pt2)
  10. )
  11. (defun comd-ln ()
  12.   (command ".line" '(0 0 0) '(10 20 0) "")
  13. )
  14. (defun entmk-ln()
  15.   (entmake '((0 . "line")(10 0 0 0)(11 10 20 0)))
  16.       )

测试结果
函数:#<USUBR @0cb61258 C#-LN>测试结果00:00:05:677
函数:#<USUBR @0cb61280 VLA-LN>测试结果00:00:01:013
函数:#<USUBR @0cb612a8 COMD-LN>测试结果00:00:16:739
函数:#<USUBR @0cb612d0 ENTMK-LN>测试结果00:00:00:359




line.rar

2.75 KB, 下载次数: 4, 下载积分: D豆 -1 , 活跃度 1

评分

参与人数 2D豆 +15 贡献 +1 收起 理由
XDSoft + 10 + 1 好主题奖!
xshrimp + 5 出题引导交流奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2013-7-4 08:41:34 | 显示全部楼层
当然上面测试仅仅对创建实体而言,后面慢慢测试C#其它的功能,更大家提供更多的测试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-7-4 11:53:30 | 显示全部楼层
xdapi 中有个 xdrx_line1 这个效率也不能和 entmake 比,你把 C# 做成COM,注册后在 VBA 中调用试试,或者试试VBA方式和 VLA 的比较
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-4 13:53:37 | 显示全部楼层
1、根据测试可以看到浮点运算和整数运算速度有多大的差距,为提高效率尽量减少浮点运算
2、在LISP中VL-CMDF效率要比COMMAND效率高三倍以上
3、创建实体ENTMAKE速度要快很多,VLA方法次之,然后是C#,最慢的是COMMAND
当然这个只针对创建实体,其他的,如实体操作,有待测试。。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-4 14:43:37 | 显示全部楼层
本帖最后由 snsj 于 2013-7-4 14:50 编辑

把VBA加进去发现VBA还要慢。。。。。
  1. Public Sub appleline()

  2.     Dim lineObj As AcadLine

  3.     Dim startPoint(0 To 2) As Double

  4.     Dim endPoint(0 To 2) As Double

  5.     startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0

  6.     endPoint(0) = 10: endPoint(1) = 20: endPoint(2) = 0

  7.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)

  8. End Sub


  9. (defun vba-ln()
  10.    (vl-vbarun "appleline")
  11.   )


测试结果:
函数:#<USUBR @0b9d135c C#-LN>测试结果00:00:02:510
函数:#<USUBR @0b9d1758 VLA-LN>测试结果00:00:00:685
函数:#<USUBR @0b9d1a50 COMD-LN>测试结果00:00:03:557
函数:#<USUBR @0b9d16f4 ENTMK-LN>测试结果00:00:00:328
函数:#<USUBR @0b9d158c VBA-LN>测试结果00:00:04:665
结果分析:ENTMAK比VLA方法快一倍,VLA比C#快四倍 ,比COMMAND快五倍多,比VBA快七倍


点评

前几天写过一个这样的测试Entmake 是 3s 多点,VLA 是 6s 左右,xdrx_line1 去掉点判断最快 7s 多点, 看来 ActiveX 方法和 ARX 把时间浪费在通讯上了  详情 回复 发表于 2013-7-4 16:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-7-4 16:13:13 | 显示全部楼层
snsj 发表于 2013-7-4 14:43
把VBA加进去发现VBA还要慢。。。。。
测试结果:
函数:#测试结果00:00:02:510

前几天写过一个这样的测试

  1. (defun mkln (p1 p2)
  2.   (entmake (list '(0 . "LINE")
  3.    '(100 . "AcDbEntity")
  4.    '(100 . "AcDbLine")
  5.    (cons 10 p1)
  6.    (cons 11 p2)
  7.     )
  8.   )
  9. )
  10. (defun addln (ms p1 p2)
  11.   (vla-addline ms (vlax-3d-point p1) (vlax-3d-point p2))
  12. )
  13. (defun getutime ()
  14.   (* 86400 (getvar "tdusrtimer"))
  15. )
  16. (defun getpts (n / an d pts)
  17.   (setq an 0.
  18. d  10.
  19.   )
  20.   (repeat n
  21.     (setq pts (cons (list '(0. 0. 0.) (polar '(0. 0. 0.) an d))
  22.       pts
  23.        )
  24.    an  (+ an 0.0001)
  25.    d   (+ d 10)
  26.     )
  27.   )
  28.   pts
  29. )
  30. (defun c:t1 (/ pts t0)
  31.   (setq pts (getpts 100000)
  32. t0  (getutime)
  33.   )
  34.   (mapcar '(lambda (x) (mkln (car x) (cadr x))) pts)
  35.   (princ (- (getutime) t0))
  36.   (princ)
  37. )
  38. (defun c:t2 (/ pts t0 ms)
  39.   (setq pts (getpts 100000)
  40. t0  (getutime)
  41. ms  (vla-get-modelspace
  42.        (vla-get-activedocument (vlax-get-acad-object))
  43.      )
  44.   )
  45.   (mapcar '(lambda (x) (addln ms (car x) (cadr x))) pts)
  46.   (princ (- (getutime) t0))
  47.   (princ)
  48. )
  49. (defun c:t3 (/ pts t0)
  50.   (setq pts (getpts 100000)
  51. t0  (getutime)
  52.   )
  53.   (mapcar '(lambda (x) (xdrx_line1 (car x) (cadr x))) pts)
  54.   (princ (- (getutime) t0))
  55.   (princ)
  56. )
Entmake 是 3s 多点,VLA 是 6s 左右,xdrx_line1 去掉点判断最快 7s 多点, 看来 ActiveX 方法和 ARX 把时间浪费在通讯上了

点评

不是XDAPI的不快,如果循环在API内部完成,绝对速度应该比ENTMAKE还要快,通用函数在多重重复操作时效率都花到通讯上了  详情 回复 发表于 2013-7-4 18:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-4 17:36:46 | 显示全部楼层
如果这样测试其实对VBA和C# ARX是不公平的
VBA程序改成这样,就可以不用每次都调用接口通讯,浪费不必要的时间
  1. Public Sub appleline()

  2.     Dim lineObj As AcadLine

  3.     Dim startPoint(0 To 2) As Double

  4.     Dim endPoint(0 To 2) As Double
  5.     Dim i As Integer
  6.    
  7.    For i = 1 To 5000
  8.     startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0

  9.     endPoint(0) = 10: endPoint(1) = 20: endPoint(2) = 0

  10.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
  11.    Next i

  12. End Sub

这样测试下来时间是:#<USUBR @0b9d1424 VBA-LN>测试结果00:00:00:351跟ENTMAKE速度相当

点评

VBA要用VBA方法,C#用C#方法,混着用就要找到最佳和最方便的用法,把通讯浪费的时间减到最小,这要在实践中平衡  详情 回复 发表于 2013-7-4 18:04
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-4 18:04:21 | 显示全部楼层
snsj 发表于 2013-7-4 17:36
如果这样测试其实对VBA和C# ARX是不公平的
VBA程序改成这样,就可以不用每次都调用接口通讯,浪费不必要的 ...

VBA要用VBA方法,C#用C#方法,混着用就要找到最佳和最方便的用法,把通讯浪费的时间减到最小,这要在实践中平衡
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-4 18:05:51 | 显示全部楼层
本帖最后由 snsj 于 2013-7-4 18:08 编辑

这次测试的结果:
重复次数:10000 结果:测试了5次取最好成绩
#<USUBR @0c5e18fc C#-LN>测试结果00:00:00:623  ;C#方法
#<USUBR @0c5b1294 VLA-LN>测试结果00:00:01:342 ;VLA方法
#<USUBR @0c5e1a8c ENTMK-LN>测试结果00:00:00:567 ;entmake
#<USUBR @0ad12988 VBA-LN>测试结果00:00:00:681   ;vba方法

重复过程在程序内部完成了,ENTMAKE最快,C#要比VBA稍快,VLA慢,命令最慢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-4 18:14:10 | 显示全部楼层
eachy 发表于 2013-7-4 16:13
前几天写过一个这样的测试Entmake 是 3s 多点,VLA 是 6s 左右,xdrx_line1 去掉点判断最快 7s 多点, 看 ...

不是XDAPI的不快,如果循环在API内部完成,绝对速度应该比ENTMAKE还要快,通用函数在多重重复操作时效率都花到通讯上了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-6 13:28:38 来自手机 | 显示全部楼层
c#写成函数要可以接受点表,这样函数内部去处理,而不起循环调用这个函数,10000次的通讯时间浪费多少!来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 11:31 , Processed in 0.284166 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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