• AutoCAD .net 开发 SelectionFilter Foreach Linq 性能比较


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics;
    
    using Autodesk.AutoCAD.Runtime;
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.EditorInput;
    
    /// <summary>
    /// 选择集比较
    /// </summary>
    /// 
    [assembly: CommandClass(typeof(TipsAndTricks.Class1))]
    namespace TipsAndTricks
    {
    
    
        public class Class1
        {
            [CommandMethod("Test")]
            public void test()
            {
                DoFilter(FilterByEdSelectionFilter);
                DoFilter(FilterByLinq);
                DoFilter(FilterByForeach);
            }
    
            private static void DoFilter(Action action)
            {
                var ed = Application.DocumentManager.MdiActiveDocument.Editor;
                var sw = Stopwatch.StartNew();
                action();
                sw.Stop();
                ed.WriteMessage($"{sw.Elapsed.TotalMilliseconds}
    ");
            } 
           
            public void FilterByEdSelectionFilter()
            {
                var ed = Application.DocumentManager.MdiActiveDocument.Editor;
                TypedValue[] circType = new TypedValue[1];
                circType.SetValue(new TypedValue((int)DxfCode.Start, "CIRCLE"), 0); 
                SelectionFilter filtCirc = new SelectionFilter(circType);
                PromptSelectionResult resPrompt;
                resPrompt = ed.SelectAll(filtCirc);
                if (resPrompt.Status == PromptStatus.OK)
                {
                    SelectionSet circSelSet = resPrompt.Value;
                    ed.WriteMessage($"ed count: {circSelSet.Count.ToString()}
    ");//vs2015 新语法 可以正常编译.net 4.0的项目
                }
            }
    
         
            public void FilterByLinq()
            {
                var db = HostApplicationServices.WorkingDatabase;
                var ed = Application.DocumentManager.MdiActiveDocument.Editor;
    
                using (var tr = db.TransactionManager.StartTransaction())
                {
                    var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    var mspace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead, false) as BlockTableRecord;               
                    var circles = mspace.Cast<ObjectId>()
                        .Where(id => id.ObjectClass.DxfName.Equals("CIRCLE")); //过滤条件很关键,对性能影响很大
                    ed.WriteMessage($"linq count: {circles.Count().ToString()}
    ");
    
                }
            }
    
            
            public void FilterByForeach()
            {
                var db = HostApplicationServices.WorkingDatabase;
                Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    
                using (var tr = db.TransactionManager.StartTransaction())
                {
                    var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    var mspace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead, false) as BlockTableRecord;
                    var circles = new List<ObjectId>();
                    foreach (ObjectId id in mspace)
                    {
                        var dbObj = tr.GetObject(id, OpenMode.ForRead) as Circle;
                        if (dbObj != null)
                        {
                            circles.Add(dbObj.Id);
                        }
                    }
                    ed.WriteMessage($"Foreach count: {circles.Count.ToString()}
    ");
    } } } }

    目前看来 linq 效率挺高的,以后开发可以放心用linq做二次开发了.

    ------------------------

    4m的dwg 图纸 测试结果:  

    ed count: 877
    96.0967
    linq count: 877
    67.8107
    Foreach count: 877
    156.6604

  • 相关阅读:
    CefSharp-基于C#的客户端开发框架技术栈开发全记录
    C#中HttpWebRequest、WebClient、HttpClient的使用详解
    蜘蛛侠网站-关注C#爬虫技术
    网络剪刀-NetCut
    JSON.stringify 格式化输出字符串
    Vue 3.0 provide 传值到子组件
    全局添加可执行的node脚本
    npm link
    低代码平台思路
    java jwt使用,springboot 整合java-jwt,java jwt工具类
  • 原文地址:https://www.cnblogs.com/DaLiao/p/6041225.html
Copyright © 2020-2023  润新知