C# unsafe 快速复制数组
(1)
/// <summary>
/// 复制内存
/// </summary>
/// <param name="dest">目标指针位置</param>
/// <param name="src">源指针位置</param>
/// <param name="count">字节长度</param>
/// <returns></returns>
[DllImport("msvcrt.dll")]
public static extern IntPtr memcpy(IntPtr dest, IntPtr src, int count);
unsafe static int[] MyCopy(int[] oriInts)
{
int[] result = new int[oriInts.Length];
int lenth= oriInts.Length;
fixed (int* pOri= oriInts) //fixed语句获取指向任意值类型、任意值类型数组或字符串的指针
{
fixed (int* pResult = result)
{
memcpy(new IntPtr(pResult), new IntPtr(pOri), sizeof(int) * lenth);//注意,第一个参数和第二个参数的顺序
}
}
return result;
}
static int[] MyCopyB(int[] oriInts)
{
int[] result = new int[oriInts.Length];
for(int i=0;i<oriInts.Length;i++)
{
result[i]= oriInts[i];
}
return result;
}
static void Main(string[] args)
{
var a = sizeof(int);
int[] ori = new int[100000000];
for(int i = 0; i < ori.Length; i++)
{
ori[i] = i;
}
Stopwatch sw = new Stopwatch();
sw.Start();
int[] copyA= MyCopy(ori);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
int[] copyB = MyCopyB(ori);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}

(2)
static unsafe void MyCopy(double[] source, float[]target,int targetOffset,int count)
{
fixed(double* sourcePtr = source)
{
fixed(float* targetPtr = target)
{
float* targetStPtr = targetPtr + targetOffset;
double* sourceEndPtr = sourcePtr + count;
for(double* iPtr = sourcePtr; iPtr != sourceEndPtr; iPtr+=1)
{
*targetStPtr = (float)*iPtr;
targetStPtr += 1;
}
}
}
}
static void MyCopyB(double[] source, float[] target,int targetOffset,int count)
{
for(int i = 0; i < count; i++)
{
target[targetOffset + i] = (float)source[i];
}
}
static void Main(string[] args)
{
double[] ori = new double[10000000];
for(int i = 0; i < ori.Length; i++)
{
ori[i] = i + 2;
}
Stopwatch sw = new Stopwatch();
float[] copyA = new float[ori.Length];
float[] copyB = new float[ori.Length];
sw.Start();
MyCopy(ori,copyA,0,ori.Length);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
MyCopyB(ori,copyB,0,ori.Length);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}

可见第一个基于指针的复制,非常的快。
C# unsafe 快速复制数组的更多相关文章
- System.Properties和System.getenv区别
网上很多使用的是getProperties.说获得系统变量,但是其实不正确.getProperties中所谓的"system properties"其实是指"java s ...
- Java集合---Array类源码解析
Java集合---Array类源码解析 ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...
- 【JAVA常用类演示】
一.java.lang.System类. public final class Systemextends Object 该类包含一些有用的类字段和方法.它不能被实例化. 在 System 类提供的 ...
- System & Runtime &Math
package com.shushine.framework.第七章Java标准类库;/** * * <p> * 描述该类情况 {@link 代表跟谁有关系} * </p> * ...
- JAVA基础学习day18--常用工具类
一.System 1.1.概述 System 类包含一些有用的类字段和方法.它不能被实例化. 在 System 类提供的设施中,有标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问:加载 ...
- Java集合---Arrays类源码解析
一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型: ...
- 关于JAVA System常见类的一些总结
一.JAVA System类概述 1.概述: System 类是一个抽象类,所有的字段和方法都是静态的,即不能被实例化.其中包含一些有用的类字段和方法,它不能被实例化.在 System 类提供的设施中 ...
- Arrays.sort源代码解析
Java Arrays.sort源代码解析 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类 ...
- System.in.read()
用读取键盘输入必须构建 1.输入流 System.in; 2.字符输入流 InputStreamReader 3.缓存输入流 BufferedRead ...
- 黑马程序员_Java其他对象(System,Runtime,Date,Calendar,Marh-Random)
System System类包含一些有用的类字段和方法(都是静态的).它不能被实例化. 在System类提供的设施中,有标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问:加载文件和库的 ...
随机推荐
- pnpm 安装和使用
1. 简介 Fast, disk space efficient package manager: Fast. Up to 2x faster than the alternatives (see b ...
- 离线环境安装nodejs及npm库i5ting_toc(超详细,手把手教学一通百通)
一.离线环境先安装nodejs 1.在可联网的电脑上下载特定版本的 Node.js: 访问 Node.js 官方下载页面(https://nodejs.org/download/release/) ...
- Linux Vim 最全面教程:从入门到精通
一.引言 Vim 是一款功能强大且在 Linux 系统中广泛使用的文本编辑器.它有着高效的编辑模式.丰富的快捷键以及众多强大的功能,对于想要深入学习 Linux 系统操作以及进行文本处理相关工作的新手 ...
- JavaGUI - [02] 案例Demo
题记部分 一.WindowDemo 窗口 package com.harley; import java.awt.*; /** * @author harley * @date 2024/05/06 ...
- php获取类名
<?php class ParentClass { public static function getClassName() { return __CLASS__; } } class Chi ...
- GIT 基础操作-初始化
命令行说明 全局设置 git config --global user.name "" git config --global user.email "" 创建 ...
- MySQL查询建表规范
因为之前一直再查找一些比较好的数据库规范,以方便在开发时连接 MySQL 进行查询/建表的时候,能根据规范来执行,达到提高 查询速度 / 执行 SQL 的性能 和提升 MySQL 的整体性能, 这里主 ...
- Redis 高可用方案
本文分享自天翼云开发者社区<Redis 高可用方案>,作者:芋泥麻薯 一.常见使用方式 Redis的几种常见使用方式包括: Redis单副本: • Redis多副本(主从): • Redi ...
- MySQL-InnoDB行锁
InnoDB的锁类型 InnoDB存储引擎支持行锁,锁类型有两种: 共享锁(S锁) 排他锁(X锁) S和S不互斥,其他均互斥. 除了这两种锁以外,innodb还支持一种锁,叫做意向锁. 那么什么是意向 ...
- Linux性能分析-CPU上下文切换
前言 在Linux性能分析-平均负载中,提到过一种导致平均负载升高的情况,就是有大量进程或线程等待cpu调度. 为什么大量进程或者线程等待CPU调度会导致负载升高呢? 当大量进程或者线程等待调度时,c ...