明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3994|回复: 12

测试一下AutoLisp、VisualLisp、ObjectARX画1000个圆的速度

  [复制链接]
发表于 2007-7-4 10:38:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-7-4 11:13:04 编辑


今天和ahlzl一起学习测试一下以下程序的速度
AutoLisp 代码:
  1. (defun c:test(/ CPT ETIME I STIME UTIME)
  2.   (setq cpt'(0.0 0.0 0.0)i 1 STIME (getvar "date"))
  3.   (repeat 1000
  4.     (entmake(APPEND '((0 . "CIRCLE")(100 . "AcDbEntity")(100 . "AcDbCircle")(8 . "0")(62 . 1))
  5.    (LIST(CONS 10 cpt)(cons 40 i))))
  6.     (setq i (1+ i)))
  7.   (setq ETIME (getvar "date")UTIME(rtos(* 86400.0 (-(- ETIME STIME)(fix(- ETIME STIME))))2 8))
  8.   (princ(strcat"\n我们用LISP画1000个圆要用: "UTIME"秒"))
  9.   )
VisualLisp 代码  
  1. (defun c:test(/ CPT ETIME I PACE STIME UTIME VCPT)
  2.   (setq cpt'(0.0 0.0 0.0)i 1 STIME (getvar "date")
  3. pace(vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
  4. vcpt(vlax-3d-point cpt))
  5.     (rtos STIME 2 2)
  6.   (repeat 1000
  7.     (vla-AddCircle pace vcpt i)
  8.     (setq i (1+ i)))
  9.   (setq ETIME (getvar "date")UTIME(rtos(* 86400.0 (-(- ETIME STIME)(fix(- ETIME STIME))))2 8))
  10.   (princ(strcat"\n我们用VLISP画1000个圆要用: "UTIME"秒"))
  11.    (princ)
  12.   )
VBA代码
  1. Sub TestTime()
  2.     Dim sTime As Double, eTime As Double, at As Double
  3.     Dim ut As Integer
  4.     sTime = ThisDrawing.GetVariable("DATE")
  5.     Dim cenPt(2) As Double
  6.     For i = 0 To 999
  7.         ThisDrawing.ModelSpace.AddCircle cenPt, 100
  8.     Next
  9.     eTime = ThisDrawing.GetVariable("DATE")
  10.     at = eTime - sTime
  11.     ut = at
  12.     at = 86400# * (at - ut)
  13.     MsgBox ("VBA画1000个圆所用时间:" & at)
  14. End Sub

Object ARX 代码
  1. struct resbuf StarTime,EndTime;
  2.   ads_real Stime,Etime,UserTime;
  3.   int i=0,ut;
  4.   AcGePoint3d cen;
  5.   cen.x=0.0;cen.y=0.0;cen.z=0.0;
  6.   acedGetVar("date",&StarTime);
  7.   Stime=StarTime.resval.rreal;
  8.   do {
  9.    i=i+1;
  10.    AcDbCircle *nc=new AcDbCircle();
  11.    nc->setCenter(cen);
  12.    nc->setRadius(i);
  13.    AcDbBlockTable *blocktable;
  14.    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(blocktable,AcDb::kForRead);
  15.    AcDbBlockTableRecord *blocktablerecord;
  16.    blocktable->getAt(ACDB_MODEL_SPACE,blocktablerecord,AcDb::kForWrite);
  17.    AcDbObjectId cirid;
  18.    blocktablerecord->appendAcDbEntity(cirid,nc);
  19.    blocktable->close();
  20.    blocktablerecord->close();
  21.    nc->close();
  22.    
  23.   } while(i<=1000);
  24.   acedGetVar("date",&EndTime);
  25.   Etime=EndTime.resval.rreal;
  26.   UserTime=Etime-Stime;
  27.   ut=UserTime;
  28.   UserTime=86400.0*(UserTime-ut);
  29.   char ChTime[50];
  30.   acdbRToS(UserTime,2,8,ChTime);
  31.   acutPrintf("\n用ARX程序画1000个圆用的时间是: %s 秒",ChTime);
  32.   return;
复制代码
Command: test
我们用LISP画1000个圆要用: 0.38997978秒
Command:
Command: test
我们用VLISP画1000个圆要用: 0.62498152秒
Command: test
程序运行起始时间: 2454286.417852
用ARX程序画1000个圆用的时间是: 0.01597255 秒
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2007-7-4 12:49:00 | 显示全部楼层

entmake居然比Active的来得快!

难以置信!.一直以为VLisp会比ALisp来得快

比command快是肯的吧!

发表于 2007-7-4 19:27:00 | 显示全部楼层
<br/>我的用VLISP画1000个圆要用: 0.297001秒
发表于 2007-7-4 22:54:00 | 显示全部楼层

AL:我们用LISP画1000个圆要用: 0.17199665秒

VL:我们用VLISP画1000个圆要用: 0.1560241秒

VBA:6.3E-2(程序中没说明单位)

发表于 2007-7-5 13:57:00 | 显示全部楼层

用过了AL比VL快

我们用LISP画1000个圆要用: 0.15598387秒"\n我们用LISP画1000个圆要用: 0.15598387秒"

我们用VLISP画1000个圆要用: 0.37501305秒

发表于 2007-7-6 17:23:00 | 显示全部楼层
问题在于,这速度除了说明自己的机器配制之外,还有其他的用处吗?
发表于 2007-7-6 19:27:00 | 显示全部楼层

很厉害的啊 ,很佩服的要紧!

以前好象听人说用那个 append 比 List 要慢一点,若改成list可能会提高一点速度的吧

ARX里面的 ModelSpace 被打开了 1000遍,关闭了 1000 遍的

发表于 2007-7-6 23:38:00 | 显示全部楼层

(defun c:test(/ CPT ETIME I STIME UTIME)
   (setq cpt'(0.0 0.0 0.0)i 1 STIME (getvar "date"))
   (repeat 1000
     (entmake(APPEND '((0 . "CIRCLE")(100 . "AcDbEntity")(100 . "AcDbCircle")(8 . "0")(62 . 1))
    (LIST(CONS 10 cpt)(cons 40 i))))
     (setq i (1+ i)))
   (setq ETIME (getvar "date")UTIME(rtos(* 86400.0 (-(- ETIME STIME)(fix(- ETIME STIME))))2 8))
   (princ(strcat"\n我们用LISP画1000个圆要用: "UTIME"秒"))(princ)
   )

(defun c:test1(/ CPT ETIME I STIME UTIME)
   (setq i 1 STIME (getvar "date"))
   (repeat 1000
     (entmake(list '(0 . "CIRCLE")'(100 . "AcDbEntity")'(100 . "AcDbCircle")'(8 . "0")'(62 . 1)
                    '(10 0.0 0.0 0.0)(cons 40 i)))
     (setq i (1+ i)))
   (setq ETIME (getvar "date")UTIME(rtos(* 86400.0 (-(- ETIME STIME)(fix(- ETIME STIME))))2 8))
   (princ(strcat"\n我们用LISP画1000个圆要用: "UTIME"秒"))(princ)
   )

命令: test

我们用LISP画1000个圆要用: 0.50999522秒

命令:
命令: test1

我们用LISP画1000个圆要用: 0.31100214秒
 可以看出"append "的确比 "List" 要慢一点!

发表于 2007-7-7 15:20:00 | 显示全部楼层

其实你这个画圆的条件并不是完全相同的.

vba的代码就没有计算圆的半径.

ARX的速度快得多.画1000个圆只用了0.0几秒的时间.

用画一万个圆的数量时间值会大点.1000个太快了.一下就画完了.画一万个时ARX的速度优势就彻底体现出来 .了

发表于 2011-7-26 12:24:34 | 显示全部楼层
我以前也试过好多种类的,不过没有试arx
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-7-25 10:01 , Processed in 0.191266 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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