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}\n");
} 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()}\n");//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()}\n"); }
} 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()}\n");
}
}
}
}

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

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

4m的dwg 图纸 测试结果:  

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

AutoCAD .net 开发 SelectionFilter Foreach Linq 性能比较的更多相关文章

  1. 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧

    Database Performance Tips for Developers对于开发人员的数据库性能技巧 As a developer you may or may not need to go ...

  2. mybatis 中 foreach 的性能问题及调优

    1.mybatis中最初的sql语句 SELECT 参数1, 参数2, 参数3 FROM 表 WHERE 条件参数1 in <foreach item="item" inde ...

  3. 测试开发jmeter forEach控制器

    测试开发jmeter forEach控制器 forEach控制器的使用场景:主要是对大量数据轮询就行接口请求 forEach控制器的使用前提:将数据进行参数化 测试开发jmeter forEach控制 ...

  4. linq性能剖析

    Orcas(VS2008&Framework3.5)给我们带来了很多令人兴奋的新特性,尤其是LINQ的引进,可以说方便了一大批开发 人员和框架设计人员.过去,当我们使用O/RMapping的一 ...

  5. 开发Android应用 提升性能的小技巧

    前 言 2015年,Android OS 目前在手机操作系统的市场占有率已达59%,权威机构预计,Android市场占有率在2016年将达到63%,由于Android的开放性,未来占有率还将不断增加, ...

  6. 基于VUE的SPA单页应用开发-加载性能篇

    1.基于异步数据的vue页面刷新 先看看基于异步数据的vue页面刷新后,都发生了啥- 如图所示: 图1 基于异步数据的vue页面刷新 网络请求图 步骤如下: step1:请求页面: step2:请求页 ...

  7. 并行开发 8.用VS性能向导解剖你的程序

    原文:8天玩转并行开发——第八天 用VS性能向导解剖你的程序 最后一篇,我们来说说vs的“性能向导",通常我们调试程序的性能一般会使用Stopwatch,如果希望更加系统的了解程序,我们就需 ...

  8. for/foreach/linq效率测试

    ; Random r = new Random(); List<byte> list = new List<byte>(); Console.WriteLine("开 ...

  9. Android开发学习之路--性能优化之常用工具

      android性能优化相关的开发工具有很多很多种,这里对如下六个工具做个简单的使用介绍,主要有Android开发者选项,分析具体耗时的Trace view,布局复杂度工具Hierarchy Vie ...

随机推荐

  1. Java Netty 4.x 用户指南

    问题 今天,我们使用通用的应用程序或者类库来实现互相通讯,比如,我们经常使用一个 HTTP 客户端库来从 web 服务器上获取信息,或者通过 web 服务来执行一个远程的调用. 然而,有时候一个通用的 ...

  2. discuz首页设置默认地址不带forum.php后缀的方法

    最近在研究discuz,上传安装几部搞定,打开首页跳到含有"/forum.php"的网址,到管理中心改了好一会儿也没好.那么如何实现discuz首页设置不带forum.php后缀呢 ...

  3. IP变化,SVN和数据库的修改

    最近公司换了运营商,将启用新的IP地址,将以前项目的端口映射处理好之外,还需要切换SVN的地址. 项目开发中有可能要修改SVN的IP地址,entries文件里面包含svn服务器的地址信息.每个文件夹都 ...

  4. BZOJ 3288: Mato矩阵

    Description 一个 \(n*n\) 行列式,\((i,j)=gcd(i,j)\) Sol 线性筛. 这道题神奇的筛出来 \(phi\) ... 打表可以发现,一个数会被他所有的因子减掉因子的 ...

  5. ajax简单应用

    var xmlhttp;if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码 xmlhttp=new ...

  6. linux查看安装文件

    rpm -qa jdk 查看名字包含"jdk"的已安装的文件 which java 查看java命令的所在目录 rpm -qf `which java` 查看java命令所对应的安 ...

  7. tmux常用快捷键

    首先输入命令开始. $ tmux 然后,基本组合 Ctrl+b(同时按下ctrl和b),按完松开 松开后,按%(即同时按下shift和5),是水平分割 按“(即同时按shift和'),是纵向分割 按上 ...

  8. Linux 命令备忘录(CentOS 7)

    创建目录testdir: mkdir  testdir 进入目录testdir:cd testdir 在testdir中创建空文件 1:   touch 1 在testdir中创建空文件 2:   t ...

  9. JDBC连接数据库

    JDBC连接数据库 1.加载JDBC驱动程序. Class.forName("com.mysql.jdbc.Driver"); 建立连接,. Connection conn = D ...

  10. python之platform模块

    python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...