.net反射与dynamic效率的简单比较

通过反射或dynamic,我们可以拿到Object类对象属性的值,但他们的又有什么差别呢?我做了一下简单的比较:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace LinqTestConsole
{
    class Program
    {
        static void Main(string[] args)
        {

            List<Object> lo = new List<object>();
            for (int i = 0; i <1500000; i++) {
                Object o = new { name = "name" + i, age = i };
                lo.Add(o);
            }

            DateTime dt10= DateTime.Now;
            //通过dynamic取值
            foreach(dynamic o in lo){

                string s = o.name + "的年龄是:" + o.age + "岁";
            }
            DateTime dt11 = DateTime.Now;
            TimeSpan span = dt11.Subtract(dt10);
            Console.WriteLine("用时"+ span.Minutes + "分钟" + span.Seconds + "秒"+span.Milliseconds+"毫秒");

            //通过反射取值
            foreach (Object o in lo)
            {
               string s=GetPropertyValueByName("name", o).ToString() + "的年龄是:" + GetPropertyValueByName("age", o).ToString() + "岁";
            }
            DateTime dt22 = DateTime.Now;
            span = dt22.Subtract(dt11);
            Console.WriteLine("用时" + +span.Minutes + "分钟" + span.Seconds + "秒" + span.Milliseconds + "毫秒");

            Console.Read();
        }

        /// <summary>
        /// 反射,通过属性名称,取值
        /// </summary>
        /// <param name="PropertyName"></param>
        /// <param name="o"></param>
        /// <returns></returns>
        public static Object GetPropertyValueByName(string PropertyName, Object o)
        {
            if (o == null)
            {
                o = new { };
            }
            //创建一个返回对象
            Object returnObject = new Object();
            PropertyInfo[] p1 = o.GetType().GetProperties();
            foreach (PropertyInfo pi in p1)
            {
                if (pi.Name.ToLower() == PropertyName.ToLower())
                {
                    returnObject = pi.GetValue(o);
                }
            }
            return returnObject;
        }
    }
}

运行结果:

总结:

从上面可以看出,反射是有点慢的,以后还是尽量用dynamic吧,方便实用。

我比较的方式可能不是很正确,但是,这样的结果也在一定程度上反映了一些问题。

时间: 2024-10-26 04:58:55

.net反射与dynamic效率的简单比较的相关文章

加快效率 - 最简单的代码生成器实现

加快效率 - 最简单的代码生成器实现 为什么需要代码生成器? 当工作中需要频繁复制粘贴来写程序的时候,更好的选择可能是写一个代码生成器来生成基础的内容,然后在此基础上进行修改和完善. 复制粘贴虽然简单,但是有很多不方便和潜在的BUG.复制粘贴许多时候还是需要我们修改一些变量名,做许多修改,有时候如果粗心没有修改全,反而会引入很多bug. 像前端页面,如果我们需要自己写后台的管理页面,我们会发现大多数的CRUD操作都很相似,通常复制粘贴修改就能解决,但是如果有多个人在同时开发,可能会出现多个不同的

HDU4223:Dynamic Programming?(简单dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4223 求连续子序列和的最小绝对值,水题. #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define inf 0x3f3f3f3f using namespace std; int n,minx; int

编写高质量代码改善C#程序的157个建议——建议15: 使用dynamic来简化反射实现

建议15: 使用dynamic来简化反射实现 dynamic是Framework 4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译器默认dynamic对象支持开发者想要的任何特性.比如,即使你对GetDynamicObject方法返回的对象一无所知,也可以像如下这样进行代码的调用,编译器不会报错: dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(dynamicO

C#.dynamic和反射

using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace dynamicDemo { class Program { static void Main(string[] args) { int times = 1000000; DynamicSample

光照——06反射环境

学习笔记适合新手,如有错误请指正.?号处也请各位指点下,谢谢. 在3D开发中,需要模拟很多现实中的效果,例如一颗钢珠会将周围的画面反射,在Unity中,可以通过设置材质的属性来实现 反射天空盒 新建一个场景>创建一个Sphere球体>新建材质并赋予球体 设置材质的两个参数即可反射天空盒>将材质的Metallic设置为1(也就是金属属性为最大)>将Smoothness设置为1,最平滑 反射天空盒及场景 仅仅反射天空盒是不够的,像赛车游戏中赛车的玻璃和车身,如果能反映周围的环境就会大大

Hadoop源码分析----RPC反射机制

有了Client 和Server,很自然就能RPC 啦.下面轮到RPC.java 啦.一般来说,分布式对象一般都会要求根据接口生成存根和框架.如CORBA,可以通过IDL,生成存根和框架.但是,在org.apache.hadoop.rpc,我们就不需要这样的步骤了.上类图. 为了分析Invoker,我们需要介绍一些Java 反射实现Dynamic Proxy 的背景.Dynamic Proxy 是由两个class 实现的:java.lang.reflect.Proxy 和java.lang.re

如何利用缓存机制实现JAVA类反射性能提升30倍

一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> 分享者:宜信支付结算部支付研发团队高级工程师陶红 原文首发于宜信支付结算技术团队公号:野指针 在实际工作中的一些特定应用场景下,JAVA类反射是经常用到.必不可少的技术,在项目研发过程中,我们也遇到了不得不运用JAVA类反射技术的业务需求,并且不可避免地面临这个技术固有的性能瓶颈问题. 通过近两年的研究.尝

day7 反射

反射是python开发中常用的功能,伴随开发的整个过程,因此要熟练掌握反射的用法. 反射常用的函数有四个:hasattr().getattr().setattr()和delattr()四个反射的函数. 本文主要介绍python中的反射,以及该机制的简单应用,熟悉JAVA的程序员,一定经常和Class.forName打交道.在很多框架中(Spring,eclipse plugin机制)都依赖于JAVA的反射能力,而在python中,也同样有着强大的反射能力,本文将做简单的介绍. 一.前言 >>&

Linux多线程实践(9) --简单线程池的设计与实现

线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同