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}\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 性能比较的更多相关文章
- 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧
Database Performance Tips for Developers对于开发人员的数据库性能技巧 As a developer you may or may not need to go ...
- mybatis 中 foreach 的性能问题及调优
1.mybatis中最初的sql语句 SELECT 参数1, 参数2, 参数3 FROM 表 WHERE 条件参数1 in <foreach item="item" inde ...
- 测试开发jmeter forEach控制器
测试开发jmeter forEach控制器 forEach控制器的使用场景:主要是对大量数据轮询就行接口请求 forEach控制器的使用前提:将数据进行参数化 测试开发jmeter forEach控制 ...
- linq性能剖析
Orcas(VS2008&Framework3.5)给我们带来了很多令人兴奋的新特性,尤其是LINQ的引进,可以说方便了一大批开发 人员和框架设计人员.过去,当我们使用O/RMapping的一 ...
- 开发Android应用 提升性能的小技巧
前 言 2015年,Android OS 目前在手机操作系统的市场占有率已达59%,权威机构预计,Android市场占有率在2016年将达到63%,由于Android的开放性,未来占有率还将不断增加, ...
- 基于VUE的SPA单页应用开发-加载性能篇
1.基于异步数据的vue页面刷新 先看看基于异步数据的vue页面刷新后,都发生了啥- 如图所示: 图1 基于异步数据的vue页面刷新 网络请求图 步骤如下: step1:请求页面: step2:请求页 ...
- 并行开发 8.用VS性能向导解剖你的程序
原文:8天玩转并行开发——第八天 用VS性能向导解剖你的程序 最后一篇,我们来说说vs的“性能向导",通常我们调试程序的性能一般会使用Stopwatch,如果希望更加系统的了解程序,我们就需 ...
- for/foreach/linq效率测试
; Random r = new Random(); List<byte> list = new List<byte>(); Console.WriteLine("开 ...
- Android开发学习之路--性能优化之常用工具
android性能优化相关的开发工具有很多很多种,这里对如下六个工具做个简单的使用介绍,主要有Android开发者选项,分析具体耗时的Trace view,布局复杂度工具Hierarchy Vie ...
随机推荐
- 码云以及git使用
码云的使用方法以及git的连用 创建公钥的方法 打开码云,点击个人资料---->SSH公钥---->点击怎样生成公钥 SSH Keys ssh keys可以让你在你的电脑和Git@OSC知 ...
- json 使用 (下)
使用JSON JSON也就是JavaScript Object Notation,是一个描述数据的轻量级语法.JSON的优雅是因为它是JavaScript语言的一个子集.接下来你将看到它为什么如此重要 ...
- MyBatis框架在控制台打印Sql语句-遁地龙卷风
第二版 (-1)写在前面 我用的是MyBatis 3.2.4,Maven Project (0)mybatis-config.xml <settings> <setting name ...
- css3 perspective perspective-origin属性的理解
perspective字面意思是:透视. 在w3school中它的解释为:设置元素被查看位置的视图:通俗讲,就是我们看看一个物体的所处的视角,近大远小.就比如我们正对着电脑:当我无限贴近电脑屏幕的时候 ...
- 使select文本框可编辑可选择(jQuery插件)
最近做项目中用到了这个插件,正好分享下. 1. 需要用的js包点击下载,在项目中引入该js. <script src="${pageContext.request.contextPa ...
- 用遗传算法GA改进CloudSim自带的资源调度策略
首先理解云计算里,资源调度的含义: 看了很多云计算资源调度和任务调度方面的论文,发现很多情况下这两者的意义是相同的,不知道这两者是同一件事的不同表述还是我没分清吧,任务调度或者资源调度大概就是讲这样一 ...
- 用border-image实现波浪边框
border-image的介绍 http://www.w3school.com.cn/cssref/pr_border-image.asp 先看一个效果: http://www.w3school.co ...
- Asp.Net 数据库连接字符串
<configuration> <connectionStrings> <add name="DefaultConnection" providerN ...
- 【JavaScript】--ajax
1 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传 ...
- 手把手教你玩转nginx负载均衡(一)----使用vitualBox创建虚拟机
引言 作为一个web程序员,有时候需要想尽办法来利用有限的资源来产生最大程度的负载,除了提高硬件配置,增加带宽之外,CDN加速,DNS加速,缓存,还可以利用反向代理.但是要说反向代理,就不的不说ngi ...