C#直接赋值和反射赋值(无GC)的性能比较
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)的性能比较的更多相关文章
- C#中字段、属性、只读、构造函数赋值、反射赋值的相关
C#中字段.属性和构造函数赋值的问题 提出问题 首先提出几个问题: 1.如何实现自己的注入框架? 2.字段和自动属性的区别是什么? 3.字段和自动属性声明时的直接赋值和构造函数赋值有什么区别? 4.为 ...
- [c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值
上一篇已经搭建好整体框架,实现了入口的验证, 验证通过后就交给LookMsgType方法处理,LookMsgType方法主要是对微信发来的不同的消息进行分解,不同的类型交给业务逻辑层不同的方法处理 ...
- java jdbc ResultSet结果通过java反射赋值给java对象
在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...
- Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践
protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的 ...
- PHP变量引用赋值与变量赋值变量的区别
变量默认总是传值赋值.那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量.这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量 ...
- Ruby中的并行赋值和嵌套赋值
一. Ruby 的赋值实际是以并行方式执行的,所以赋值语句右边的值不受赋值语句本身的影响.在左边的任意一个变量或属性赋值之前,右边的值按他们出现的顺序被计算出来. 1.当赋值语句有多于一个左值时,赋值 ...
- jquery根据选择器进行页面赋值,封装赋值方法
可以进行文本框赋值,文本域赋值,下拉列表赋值,单选框赋值,多选框赋值, 传入对象,可以根据元素name进行比对赋值,不用每个进行单独赋值 <!DOCTYPE html> <html ...
- java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互
java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...
- CAS原子操作实现无锁及性能分析
CAS原子操作实现无锁及性能分析 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 ...
随机推荐
- Spark官方文档 - 中文翻译
Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...
- class.c 添加中文注释(1)
注释仅代表个人理解,仅供参考. /* * class.c - basic device class management * * Copyright (c) 2002-3 Patrick Mochel ...
- Jackson将json字符串转换成泛型List
Jackson,我感觉是在Java与Json之间相互转换的最快速的框架,当然Google的Gson也很不错,但是参照网上有人的性能测试,看起来还是Jackson比较快一点 Jackson处理一般的Ja ...
- IIS+域组策略+hosts:禁止访问指定网站
一.简介 禁止访问网站可以通过多种方式实现,在网络设备上实现大概是性能最好的方式.本文在域服务器上实现该功能,优点是配置简单.可自定义跳转页面,缺点也很明显,遇到熟悉操作系统的用户,修改hosts文件 ...
- Chrome浏览器设置默认编码
设置-->高级设置-->网络内容-->自定义字体(滚动条拉到最底部)-->编码
- linux下遇见mysql启动报2002错误解决办法
前言:目前问题解决了,但是仍不知道是什么原因造成的,在出现问题前安装uWSGI后,mysql就出现这个问题的,哪位大侠说说这是怎么回事? 正文:Linux 下 Mysql error 2002 错误解 ...
- python利用unrar实现rar文件解压缩
python第三方包unrar可以实现rar文件的解压缩,它以动态库UnRAR为基础,封装而成 1. 下载UnRAR动态库 https://pypi.python.org/pypi/unrar/0.2 ...
- Python3实现TCP端口扫描
在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可以了解到目标主机都开放了哪些服务,甚至能根据服务猜测可能存在某些漏洞. TCP端 ...
- 上海闪酷成为京东商城第一批独立软件开发商(ISV)
闪酷信息技术(上海)有限公司一直致力于为品牌企业提供电子商务软件及其服务,为其拓展电商渠道保驾护航.上海闪酷依据多年的行业经验和技术积累,与中国 最大的B2C商城达成战略合作,为其2万多家品牌供应商提 ...
- gradle项目与maven项目相互转化
gradle这几年发展迅猛,github越来越多的项目都开始采用gradle来构建了,但是并不是所有人都对gradle很熟悉,下面的方法可以把gradle转成maven项目,前提gradle项目目录结 ...