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. linux快速删除海量文件

    首先创建一个临时目录: /rubbish rsync --delete-before -a -H -v --progress --stats /rubbish /111 /111为目的目录 选项说明: ...

  2. Linux下磁盘挂载

    公司硬盘不够用了,新买了一个存储,需要挂载到现在的系统上.前期的步骤就不说了,运维全部搞定,无非是硬件和网络那一套,这里只说分配到本人后在Linux下如何挂载. 具体步骤如下: 1.查看是否已经分配 ...

  3. EF6 如何判断DataContext有修改,以及如何放弃修改

      如何判断DataContext有修改: EF6的 using (var db = new Model1()) { if (db.ChangeTracker.HasChanges()) { Cons ...

  4. [Unity3D]深度相机 Depth Camera

    作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛.论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多界面合成画面可以用摄像机之间的交互来 ...

  5. 配置Jenkins使用Gitlab的代码库进行构建

    1. 首先确认Jenkins上安装了Git plugin, 以及Subversion plugin Manage Jenkins -> Plugin Manager -> Availabl ...

  6. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  7. maven中央仓库访问速度太慢的解决办法

    方法一:修改settings.xml eclipse中集成的maven的settings.xml文件,找了半年也没找到,我们放弃eclipse中的maven,下一个最新的maven,并在eclipse ...

  8. LUA类

    cpp_object_map = {}setmetatable(cpp_object_map, { __mode = "kv" }) local search_basesearch ...

  9. PHP中使用CURL请求页面,使用fiddler进行抓包

    在PHP中使用CURL访问页面: <?php $ch = curl_init('http://www.baidu.com'); curl_setopt($ch, CURLOPT_RETURNTR ...

  10. 树莓派Odroid等卡片式电脑上搭建NAS教程系列6-miniDLNA

    目录: 1. 树莓派Odroid等卡片式电脑上搭建NAS教程系列1-Ubuntu系统安装 2. 树莓派Odroid等卡片式电脑上搭建NAS教程系列2-SSH连接访问 3. 树莓派Odroid等卡片式电 ...