Тема: Не ужели VBA работает быстрее .NET? Помогите разобратся
Имеется чертёж, в нём ровно 1 миллион точек. Требуется обработать все эти точки поочерёдно особым образом, но чтобы добраться до сути дела упростим задачу: каждую точку необходимо сдвинуть на -2000000м по оси X.
Есть код на VBA:
Public Sub TestMovePointsVBA() Dim Tmr As Double Tmr = Timer Dim acEntity As AcadEntity Dim acPoint As AcadPoint Dim pnt3D As Variant For Each acEntity In ThisDrawing.ModelSpace If TypeOf acEntity Is AcadPoint Then Set acPoint = acEntity pnt3D = acPoint.Coordinates pnt3D(0) = pnt3D(0) - 2000000 acPoint.Coordinates = pnt3D End If Next acEntity ThisDrawing.Utility.Prompt "Время: " & Format(Timer - Tmr, "0.000") & vbCr '>_ _vbarun Время: 17.824 End Sub
Этот код редактирует точки за 18 сек.
Попытался повторить тоже самое с исполькованием DLL-ки написанной на .Net:
<CommandMethod("TestMovePointsWithTrans")> Public Sub TestMovePointsWithTrans() Dim Tmr As DateTime = DateTime.Now Dim pnt3D As Point3d Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Using acLckDoc As DocumentLock = acDoc.LockDocument() Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() Dim acBlkTbl As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) Dim acBlkTblRec As BlockTableRecord = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForRead) For Each acObjId As ObjectId In acBlkTblRec If (acObjId.ObjectClass().DxfName = "POINT") Then Using acPoint As DBPoint = acObjId.GetObject(OpenMode.ForWrite) pnt3D = acPoint.Position acPoint.Position = New Point3d(pnt3D.X - 2000000, pnt3D.Y, pnt3D.Z) End Using End If Next acDoc.Editor.WriteMessage("Обработка точек: " & (DateTime.Now - Tmr).TotalSeconds & " сек." & vbCrLf) '>_ Обработка точек: 3.103 сек. acTrans.Commit() acDoc.Editor.WriteMessage("Операция завершена: " & (DateTime.Now - Tmr).TotalSeconds & " сек." & vbCrLf) '>_ Операция завершена: 28.131 сек. End Using End Using End Sub
И получается, что операция длится более 28 сек (в полтора раза дольше!), хотя насколько я читал .Net должен работать быстрее. Причем, обработка точек длится всего 3 сек, остальные 25 сек трансакция вносит изменения в базу данных чертежа (на сколько я понимаю, если не так, поправьте, пожалуйста).
Может быть я не так использую трансакцию? Или есть более быстрые способы редактирования объектов?
Использовался "AutoCAD 2015 Map". И теперь вишенка на тортике: тот же самый код VBA в "AutoCAD Land Enabled Map 2009" на том же файле (с 1 миллионом точек) выполняет ту же операцию за 6.770 сек! Как так???