测试一下AutoLisp、VisualLisp、ObjectARX画1000个圆的速度
本帖最后由 作者 于 2007-7-4 11:13:04 编辑今天和ahlzl一起学习测试一下以下程序的速度
AutoLisp 代码:
(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"秒"))
)VisualLisp 代码
(defun c:test(/ CPT ETIME I PACE STIME UTIME VCPT)
(setq cpt'(0.0 0.0 0.0)i 1 STIME (getvar "date")
pace(vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
vcpt(vlax-3d-point cpt))
(rtos STIME 2 2)
(repeat 1000
(vla-AddCircle pace vcpt i)
(setq i (1+ i)))
(setq ETIME (getvar "date")UTIME(rtos(* 86400.0 (-(- ETIME STIME)(fix(- ETIME STIME))))2 8))
(princ(strcat"\n我们用VLISP画1000个圆要用: "UTIME"秒"))
(princ)
)VBA代码
Sub TestTime()
Dim sTime As Double, eTime As Double, at As Double
Dim ut As Integer
sTime = ThisDrawing.GetVariable("DATE")
Dim cenPt(2) As Double
For i = 0 To 999
ThisDrawing.ModelSpace.AddCircle cenPt, 100
Next
eTime = ThisDrawing.GetVariable("DATE")
at = eTime - sTime
ut = at
at = 86400# * (at - ut)
MsgBox ("VBA画1000个圆所用时间:" & at)
End Sub
Object ARX 代码
struct resbuf StarTime,EndTime;
ads_real Stime,Etime,UserTime;
int i=0,ut;
AcGePoint3d cen;
cen.x=0.0;cen.y=0.0;cen.z=0.0;
acedGetVar("date",&StarTime);
Stime=StarTime.resval.rreal;
do {
i=i+1;
AcDbCircle *nc=new AcDbCircle();
nc->setCenter(cen);
nc->setRadius(i);
AcDbBlockTable *blocktable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(blocktable,AcDb::kForRead);
AcDbBlockTableRecord *blocktablerecord;
blocktable->getAt(ACDB_MODEL_SPACE,blocktablerecord,AcDb::kForWrite);
AcDbObjectId cirid;
blocktablerecord->appendAcDbEntity(cirid,nc);
blocktable->close();
blocktablerecord->close();
nc->close();
} while(i<=1000);
acedGetVar("date",&EndTime);
Etime=EndTime.resval.rreal;
UserTime=Etime-Stime;
ut=UserTime;
UserTime=86400.0*(UserTime-ut);
char ChTime;
acdbRToS(UserTime,2,8,ChTime);
acutPrintf("\n用ARX程序画1000个圆用的时间是: %s 秒",ChTime);
return;Command: test
我们用LISP画1000个圆要用: 0.38997978秒
Command:
Command: test
我们用VLISP画1000个圆要用: 0.62498152秒
Command: test
程序运行起始时间: 2454286.417852
用ARX程序画1000个圆用的时间是: 0.01597255 秒
<p>entmake居然比Active的来得快!</p><p>难以置信!.一直以为VLisp会比ALisp来得快</p><p>比command快是肯的吧!</p> <br/>我的用VLISP画1000个圆要用: 0.297001秒 <p>AL:我们用LISP画1000个圆要用: 0.17199665秒</p><p>VL:我们用VLISP画1000个圆要用: 0.1560241秒</p><p>VBA:6.3E-2(程序中没说明单位)</p><p></p> <p>用过了AL比VL快</p><p>我们用LISP画1000个圆要用: 0.15598387秒"\n我们用LISP画1000个圆要用: 0.15598387秒"</p><p>我们用VLISP画1000个圆要用: 0.37501305秒</p> 问题在于,这速度除了说明自己的机器配制之外,还有其他的用处吗? <p>很厉害的啊 ,很佩服的要紧!</p><p>以前好象听人说用那个 append 比 List 要慢一点,若改成list可能会提高一点速度的吧</p><p>ARX里面的 ModelSpace 被打开了 1000遍,关闭了 1000 遍的</p><p></p> <p>(defun c:test(/ CPT ETIME I STIME UTIME)<br/> (setq cpt'(0.0 0.0 0.0)i 1 STIME (getvar "date"))<br/> (repeat 1000<br/> (entmake(APPEND '((0 . "CIRCLE")(100 . "AcDbEntity")(100 . "AcDbCircle")(8 . "0")(62 . 1))<br/> (LIST(CONS 10 cpt)(cons 40 i))))<br/> (setq i (1+ i)))<br/> (setq ETIME (getvar "date")UTIME(rtos(* 86400.0 (-(- ETIME STIME)(fix(- ETIME STIME))))2 8))<br/> (princ(strcat"\n我们用LISP画1000个圆要用: "UTIME"秒"))(princ)<br/> )</p><p>(defun c:test1(/ CPT ETIME I STIME UTIME)<br/> (setq i 1 STIME (getvar "date"))<br/> (repeat 1000<br/> (entmake(list '(0 . "CIRCLE")'(100 . "AcDbEntity")'(100 . "AcDbCircle")'(8 . "0")'(62 . 1)<br/> '(10 0.0 0.0 0.0)(cons 40 i)))<br/> (setq i (1+ i)))<br/> (setq ETIME (getvar "date")UTIME(rtos(* 86400.0 (-(- ETIME STIME)(fix(- ETIME STIME))))2 8))<br/> (princ(strcat"\n我们用LISP画1000个圆要用: "UTIME"秒"))(princ)<br/> )</p><p>命令: test</p><p>我们用LISP画1000个圆要用: 0.50999522秒</p><p>命令:<br/>命令: test1</p><p>我们用LISP画1000个圆要用: 0.31100214秒<br/> 可以看出"append "的确比 "List" 要慢一点!</p> <p>其实你这个画圆的条件并不是完全相同的.</p><p>vba的代码就没有计算圆的半径.</p><p>ARX的速度快得多.画1000个圆只用了0.0几秒的时间.</p><p>用画一万个圆的数量时间值会大点.1000个太快了.一下就画完了.画一万个时ARX的速度优势就彻底体现出来 .了</p> 我以前也试过好多种类的,不过没有试arx
页:
[1]
2