daron 发表于 2003-10-31 02:21:08

呜呼,第二个话题。速度测试。

在Vlisp黑客论坛上,我们正在测试entmake是否比ActiveX快(好像你不知道)。无论如何,Stig建议我使用ActiveX函数并将其转换为vba,看看它是否更快。好吧,我已经做了所有我能做的,需要你们的帮助。我将发布模块。你们能帮我完成吗。有几件事我不太懂,比如如何让插入点工作以及一些定时器项目。谢谢。
Option Explicit
Function starttimer()
Dim time As Long
time = ThisDrawing.GetVariable("date")
End Function
Function endtimer(func)
Dim time As Long
Dim seconds As Long
time = ThisDrawing.GetVariable("date" - time)
seconds = (time - time * 86400#)
output seconds func
End Function
Function output()
msgbox ("Timed result: ",vbokonly)
End Function
Sub instest()
Dim inspt(0 To 2) As Variant
Dim count As Integer
Dim bname As String
Dim blkref As AcadBlockReference
Set inspt = ThisDrawing.Utility.GetPoint(0)
Set blkref = ThisDrawing.ModelSpace.InsertBlock _
            (inspt, "circ", 1#, 1#, 1#, 0)
starttimer
For count = 1 To 1000
    blkref
Next count
endtimer
End Sub
**** Hidden Message *****

hendie 发表于 2003-10-31 04:56:58

哦,今天是星期五,我回来了,但我们星期五只工作到下午1点。因此,在此期间,我将尽我所能…

Dim inspnt As Variant
Me.Hide
inspnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
将帮助您使用getpoint函数<我从来没有用过定时器,所以我需要研究一下,达伦

hendie 发表于 2003-10-31 06:19:11

这是否有助于您使用计时器位
Dim StartTime As Long
Dim EndTime As Long
Dim TotalTime As Long
_______________________________________
Private Sub StartTimeR()
StartTime = Timer
End Sub
_______________________________________
Private Sub EndTimeR()
EndTime = Timer
End Sub
_______________________________________
Private Sub CommandButton1_Click()
StartTimeR
'do your stuff in here
EndTimeR
TotalTime = EndTime - StartTime
TextBox1.Text = TotalTime
End Sub

SomeCallMeDave 发表于 2003-10-31 08:11:30

对于插入测试,您可以使用

Public Function InsertTest()
Dim i As Integer
Dim lngStart As Long
Dim lngEnd As Long
Dim InsPt(0 To 2) As Double
Dim mspace As AcadModelSpace
Set mspace = ThisDrawing.ModelSpace

lngStart = GetTickCount
For i = 1 To 1000
    mspace.InsertBlock InsPt, "Circ", 1, 1, 1, 0
Next i

lngEnd = GetTickCount
MsgBox "Total Time = " & CStr((lngEnd - lngStart) / 1000#)
End Function

InsPt将默认为0,0,0,并且您不需要设置块引用(这只会减慢您的速度)
对于计时器,我喜欢使用API GetTickCount。它以千分之一秒计。有一种更精确的计时器,但更难使用
在标准模块中,插入此定时器代码

Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long

SMadsen 发表于 2003-10-31 09:24:01

只是注意:计时器需要基于日期和Daron显示的公式。否则比不上AutoLISP。如果VBA在访问sysvars时也较慢,那就是运气不好了

daron 发表于 2003-10-31 10:25:32

好的,这是我到目前为止所得到的。
Dim StartTime As Long
Dim EndTime As Long
Dim TotalTime As Long
Private Sub starttimer()
StartTime = Timer
'time = ThisDrawing.GetVariable("date")
End Sub
Private Sub endtimer()
'Dim seconds As Long
'time = ThisDrawing.GetVariable("date" - time)
'seconds = (time - time * 86400#)
'output seconds func
EndTime = Timer
End Sub
'Function output()
'MsgBox "Total Time = & CStr((lngEnd - lngStart) / 1000#)"
'End Function
Sub instest()
Dim inspt(0 To 2) As Double
Dim count As Integer
'Dim lngStart As Long
'Dim lngEnd As Long
Dim MSpace As AcadModelSpace
Set MSpace = ThisDrawing.ModelSpace
'lngStart = GetTickCount
'Set blkref = ThisDrawing.ModelSpace.InsertBlock _
'            (inspt, "circ", 1#, 1#, 1#, 0)
starttimer
For count = 1 To 1000
    MSpace.InsertBlock inspt, "Circ", 1, 1, 1, 0
Next count
'lngEnd = GetTickCount
endtimer
End Sub
'Declare Function GetTickCount Lib "kernel32" () As Long
感谢戴夫和亨迪。我从你们俩那里拿走了我所能得到的东西,它现在在0,0,0上插入了1000个“circ”物体。我无法弄清楚的是Hendie的:
Private Sub commandButton1_Click()
StartTime
instest
EndTime
TotalTime = EndTime - StartTime
TextBox1.Text = TotalTime
End Sub

我把它放在哪里。我在模块中尝试了它,然后以一种形式进行了尝试。我在两个地方都想不通。

daron 发表于 2003-10-31 10:35:42

这就是戴夫所说的。我不知道该怎么处理定时器。它在模块中,函数也是如此,但它不起作用
Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long
Public Function InsTest()
Dim inspt(0 To 2) As Double
Dim i As Integer
Dim lngStart As Long
Dim lngEnd As Long
Dim MSpace As AcadModelSpace
Set MSpace = ThisDrawing.ModelSpace
lngStart = GetTickCount
For i = 1 To 1000
    MSpace.InsertBlock inspt, "Circ", 1, 1, 1, 0
Next i
lngEnd = GetTickCount
End Function
不过,它的工作速度非常快。他们两个。

SomeCallMeDave 发表于 2003-10-31 14:10:02

Daron,
The Declare 需要位于标准模块中,而不是 ThisDrawing 类模块中。
代码的其余部分可以放在任一位置。
希望这是有道理的。

SomeCallMeDave 发表于 2003-10-31 14:16:55

到目前为止,在您的测试中,使用sysvar“DATE”作为计时器

Public Function InsertTest()
Dim i As Integer
Dim StartTime As Variant
Dim EndTime As Variant

Dim lngStart As Long
Dim lngEnd As Long
Dim InsPt(0 To 2) As Double
Dim mspace As AcadModelSpace
Set mspace = ThisDrawing.ModelSpace

StartTime = ThisDrawing.GetVariable("DATE")

'lngStart = GetTickCount
For i = 1 To 1000
    mspace.InsertBlock InsPt, "Circ", 1, 1, 1, 0
Next i
EndTime = ThisDrawing.GetVariable("DATE")

'lngEnd = GetTickCount
MsgBox "Total Time = " & CStr((EndTime - StartTime) * 86400)
End Function

的函数是相同的。

daron 发表于 2003-10-31 14:45:42

尽管我感觉速度更快,但上述功能的时间是:
总时间=0.984987616539001
,这在我的机器上。让我们看看它在其他测试机器上是如何运行的。我将在lisp线程中发布代码,并让其他人测试它。我们将把它作为SCMDave的版本放进去。
页: [1] 2
查看完整版本: 呜呼,第二个话题。速度测试。