dotnet 对指针转换为结构体多个不同方法的性能分析
在 dotnet 里面,拿到一个指针,可以有多个不同的方法转换为结构体,本文将来告诉大家这几个方法的性能的差别
特别感谢性能优化狂魔 Stephen Toub 大佬的指导
在 WPF 框架开发中,有小伙伴 ThomasGoulet73 问 Stephen Toub 大佬关于从指针转换为结构体的性能差别,请看 https://github.com/dotnet/wpf/pull/4917#discussion_r690587610
此时 Stephen Toub 大佬给出的性能测试如下

通过 Cast 转换的性能是最佳的,但是需要用上不安全代码,使用的时候也有很多注意的事项。而采用 Marshal 的 PtrToStructure 有两个重载的方法,一个是泛型的,一个是非泛型的,测试代码如下
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System;
using System.Runtime.InteropServices;
[MemoryDiagnoser]
public class Program
{
public static void Main(string[] args) => BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
private IntPtr _ptr;
[GlobalSetup]
public unsafe void Setup() => _ptr = Marshal.AllocHGlobal(sizeof(MyPoint));
[GlobalCleanup]
public void Cleanup() => Marshal.FreeHGlobal(_ptr);
[Benchmark]
public unsafe MyPoint Cast() => *(MyPoint*)_ptr; // 0.0477ns
[Benchmark]
public MyPoint PtrToStructureGeneric() => Marshal.PtrToStructure<mypoint>(_ptr); // 26.2864ns
[Benchmark]
public MyPoint PtrToStructureNonGeneric() => (MyPoint)Marshal.PtrToStructure(_ptr, typeof(MyPoint)); // 28.2225ns
}
[StructLayout(LayoutKind.Sequential)]
public struct MyPoint
{
public int X;
public int Y;
}
在 Stephen Toub 大佬的建议是,虽然 Cast 方法,通过不安全代码指针转换的方法的性能足够好,如上面测试 只需 0.0477 纳秒,但是只有在类型是 blittable(可直接复制到本机结构中的类型)的时候才适合用强转的方式。否则还是需要使用 Marshal 的方法处理封送
dotnet 对指针转换为结构体多个不同方法的性能分析的更多相关文章
- 【阅读笔记】《C程序员 从校园到职场》第七章 指针和结构体
原文地址:让你提前认识软件开发(13):指针及结构体的使用 CSDN博客 https://blog.csdn.net/zhouzhaoxiong1227/article/details/2387299 ...
- c语言指针与结构体
#include <stdio.h> #include <stdlib.h> struct mydata { int num; ]; }; void main1() { /*i ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
- 36深入理解C指针之---结构体的内存处理
一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...
- 35深入理解C指针之---结构体基础
一.结构体基础 1.定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合 2.特征: 1).结构体可以使得不同类型的数据进行结合 2).结构体可以使用内置的数据类型,包括指针 3). ...
- C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值
C++ 利用指针和数组实现一个函数返回多个值demo1 #include <iostream> using namespace std; int* test(int,int,int); i ...
- C语言--- 高级指针2(结构体指针,数组作为函数参数)
一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针 结构体: typedef struct stu{ char name[ ...
- (60) 结构体指针、结构体变量嵌套、结构体指针嵌套、函数指针、数组指针、指针数组、typedef 综合运用
#include<stdio.h> #include<iostream> #include<malloc.h> /* author : 吴永聪 program: 结 ...
- C++指针和结构体基础知识
学习C++首先要回忆起C语言当中的指针和结构体知识,本文作者将通过一段代码来总结指针和结构体基础知识:指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使 ...
随机推荐
- linux查看域名对应的解析ip
方法1-直接使用ping 方法2-nslookup 方法3-dig
- 记录--通过手写,分析axios核心原理
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.axios简介 axios是什么? Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. ...
- Tableau 绘制圆环图
一.对应数据如下所示 二.打开tableau连接对应Excel数据源,将记录数字段连续拖动两次到行,显示设置按整个视图显示,标记里面设置按饼图显示 三.设置两个值按度量值平均值显示,并调整第一个图稍微 ...
- 开发必会系列:《spring实战(第4版)》读书笔记
一 spring的核心 1.主要概念 DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件. spring有两类容器实现方式,bean ...
- Java中一个逐渐被遗忘的强大功能,强到你难以置信!!
大家好,我是冰河~~ 说起Java,简单好用,但是Java中很多牛逼的技术却逐渐被遗忘了~~ 在Java语言出现之前,很多系统都是使用C和C++开发的.Java出现之后,由于其面向对象的思想更加符合人 ...
- PriorityQueue和PriorityBlockingQueue
目录 简介 PriorityQueue PriorityBlockingQueue PriorityQueue和PriorityBlockingQueue 简介 Queue一般来说都是FIFO的,当然 ...
- CSP-S初赛知识点(持久更新)
先更新这么多,以后再说吧 AK IOI 排序算法 算法名称 平均复杂度 最好情况 最坏情况 空间复杂度 排序方式 稳定性 冒泡排序 \(O(N^2)\) \(O(N)\) \(O(N^2)\) \(O ...
- Java 抽象类与方法:实现安全性与代码重用
Java 内部类 简介 在 Java 中,可以嵌套类(即类内部的类),称为内部类.嵌套类的目的是将属于一起的类分组,从而使您的代码更可读和可维护. 访问内部类 要访问内部类,请创建外部类的对象,然后创 ...
- C 语言:类型转换与常量的细致理解
C 语言中的类型转换 有时,您必须将一种数据类型的值转换为另一种类型.这称为类型转换 隐式转换 当您将一种类型的值分配给另一种类型的变量时,编译器会自动进行隐式转换. 例如,如果您将一个 int 值分 ...
- Win7 局域网服务器 - FTP 服务器搭建指南
1. 打开 "开始" 菜单,找到控制面板 2. 选择 "程序" 3. 选择 "打开或关闭 Windows 功能" 4. 选择 "I ...