using System;
using System.Reflection;
using System.Diagnostics;
using System.Runtime.InteropServices; namespace Field
{
struct Test
{
public float X;
} class MainClass
{
const int loops = ; Stopwatch m_StopWatch = new Stopwatch();
Test m_Test;
object m_Target;
object m_Value;
FieldInfo m_Field;
public MainClass()
{
m_Target = m_Test;
Type t = typeof(Test);
m_Field = t.GetField("X");
m_Value = m_Field.GetValue(m_Test);
} public void Test1()
{
m_StopWatch.Reset();
m_StopWatch.Start();
for (int i = ; i < loops; ++i)
{
m_Test.X = (float)i;
}
m_StopWatch.Stop(); Console.WriteLine("Test1: " + m_StopWatch.ElapsedMilliseconds + " ms");
} public unsafe void Test2()
{
m_StopWatch.Reset();
m_StopWatch.Start();
for (int i = ; i < loops; ++i)
{
GCHandle gcHandle = GCHandle.Alloc(m_Value, GCHandleType.Pinned);
IntPtr rawPtr = gcHandle.AddrOfPinnedObject();
float* buffer = (float*)rawPtr.ToPointer();
*buffer = (float)i;
gcHandle.Free();
m_Field.SetValueDirect(__makeref(m_Test), m_Value);
}
m_StopWatch.Stop(); Console.WriteLine("Test2: " + m_StopWatch.ElapsedMilliseconds + " ms");
} public unsafe void Test3()
{
m_StopWatch.Reset();
m_StopWatch.Start();
for (int i = ; i < loops; ++i)
{
GCHandle gcHandle = GCHandle.Alloc(m_Value, GCHandleType.Pinned);
IntPtr rawPtr = gcHandle.AddrOfPinnedObject();
float* buffer = (float*)rawPtr.ToPointer();
*buffer = (float)i;
gcHandle.Free();
m_Field.SetValue(m_Target, m_Value);
m_Test = (Test)m_Target;
}
m_StopWatch.Stop(); Console.WriteLine("Test3: " + m_StopWatch.ElapsedMilliseconds + " ms");
} public static void Main(string[] args)
{
MainClass main = new MainClass();
main.Test1();
main.Test2();
main.Test3(); Console.ReadKey();
}
}
}

Xamarin - Release

Test1: 35 ms

Test2: 3237 ms

Test3: 5189 ms

C#直接赋值和反射赋值(无GC)的性能比较的更多相关文章

  1. C#中字段、属性、只读、构造函数赋值、反射赋值的相关

    C#中字段.属性和构造函数赋值的问题 提出问题 首先提出几个问题: 1.如何实现自己的注入框架? 2.字段和自动属性的区别是什么? 3.字段和自动属性声明时的直接赋值和构造函数赋值有什么区别? 4.为 ...

  2. [c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值

    上一篇已经搭建好整体框架,实现了入口的验证,   验证通过后就交给LookMsgType方法处理,LookMsgType方法主要是对微信发来的不同的消息进行分解,不同的类型交给业务逻辑层不同的方法处理 ...

  3. java jdbc ResultSet结果通过java反射赋值给java对象

    在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...

  4. Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

    protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的 ...

  5. PHP变量引用赋值与变量赋值变量的区别

    变量默认总是传值赋值.那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量.这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量 ...

  6. Ruby中的并行赋值和嵌套赋值

    一. Ruby 的赋值实际是以并行方式执行的,所以赋值语句右边的值不受赋值语句本身的影响.在左边的任意一个变量或属性赋值之前,右边的值按他们出现的顺序被计算出来. 1.当赋值语句有多于一个左值时,赋值 ...

  7. jquery根据选择器进行页面赋值,封装赋值方法

    可以进行文本框赋值,文本域赋值,下拉列表赋值,单选框赋值,多选框赋值, 传入对象,可以根据元素name进行比对赋值,不用每个进行单独赋值 <!DOCTYPE html> <html ...

  8. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

  9. CAS原子操作实现无锁及性能分析

    CAS原子操作实现无锁及性能分析 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 ...

随机推荐

  1. 你不一定懂的cpu显示信息

    在linux命令中用top查看系统的情况,在cpu这一行有一些分部表示什么 下面有一篇博文,对此写的非常清楚,特转载.猛击下面的链接 http://www.cnblogs.com/yjf512/p/3 ...

  2. mycat高可用方案

    1.建议采用标准的mysql主从复制高可用配置并交付给mycat来完成后端mysql节点的主从自动切换. 2.mycat自身的高可用性 由HAproxy+Mycat集群+Mysql主从所组成的高可用性 ...

  3. RabbitMQ服务安装配置

    RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.RabbitMQ据说具有良 ...

  4. .NET 类型(Types)的那些事

    引言 您是.Net工程师?那 .NetFramework中的类型您知道有三大类吗?(除了引用类型和值类型,还有?) 引用类型一定在“堆”上,值类型一定在“栈”上? 那引用类型在内存中的布局细节您又知道 ...

  5. 报表移动端app如何实现页面自适应?

    1. 描述 PC上制作好的报表,在手机端查看的时候,报表软件默认的自适应效果不尽人如意.例如,报表比较大,到手机上被缩的非常小,字都看不清等等.为此FineReport增加了选项可以手动控制报表在移动 ...

  6. 【2016-10-17】【坚持学习】【Day8】【简单工厂模式】

    今天学习简单工厂模式, 结构 一个抽象产品 多个具体产品 一个工厂类,通过传入参数,new出不同的产品 代码: abstract class Product { //所有产品类的公共业务方法 publ ...

  7. jquery工具方法swap

    swap : css交换(内部) 详细内容请点击 -> 当元素的样式为display:none时获取他的宽高

  8. BZOJ 1797: [Ahoi2009]Mincut 最小割

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2076  Solved: 885[Submit] ...

  9. IO(二)----字符流

    计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此,从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符层次的编码和解码. 常见的码表 ASC ...

  10. Error: Could not find the required version of the Java(TM) 2 Runtime Environment in'(null)'.

    今天拿到一台新机器,搭一下开发环境,安装个JDK是个很基本的事情,从Orale的网站上下了个安装,但是一直出下面的错: 我信了你的邪,Google了一圈,有人说是可能文件下载有问题,重新下载安装就可以 ...