直接缓冲区和非缓冲区

深入理解委托——为什么C#要引入委托 一、C#委托是什么的? 在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果如果我们需要打官司,在法庭上是由律师为我们辩护的,然而律师真真执行的是当事人的陈词,这时候律师就是一个委托对象,当事人委托律师这个对象去帮自己辩护。这就是我们生活中委托的例子的。然而C#中委托的概念也就好比律师对象(从中可以得出委托是一个类,,因为只有类才有对象的概念,从而也体现了C#是面向对象的语言)。 介绍完生活中委托是个什么后,现在就看看C#中的委托怎样和生活中的对象联系起来的,C#中的委托相当于C++中的函数指 阅读详情

直接缓冲区和非缓冲区

直接缓冲区与非直接缓冲区别

非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中

 

上图读的过程: 读物理磁盘文件时候,先到物理内存读到,然后拷贝到jvm内存中。 程序去jvm读取。  从物理空间拷贝到jvm内存空间,效率慢。

         写的过程:   先写到jvm内存,jvm拷贝到物理内存,然后再到物理磁盘。

 

非直接缓冲区 直接存放在 jvm缓冲区  需要来回copy

非直接缓冲区 存放在物理内存   不需要copy

存放在物理内存比jvm缓冲区效率高   

 

直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率

非直接缓冲区:

应用程序 不走jvm内存和物理内存。 走的是物理内存映射文件。内存条

写: 直接写到物理内存映射文件,到物理磁盘

读: 物理磁盘文件读到物理内存映射文件,然后读取之

直接缓冲区 占内存 不安全   但是效率高

 

字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。

直接字节缓冲区可以通过调用此类的 allocateDirect() 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。

直接字节缓冲区还可以通过 FileChannel 的 map() 方法 将文件区域直接映射到内存中来创建。该方法返回MappedByteBuffer 。 Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的是不可访问的内存区域,则试图访问该区域不会更改该缓冲区的内容,并且将会在访问期间或稍后的某个时间导致抛出不确定的异常。

字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其 isDirect() 方法来确定。提供此方法是为了能够在性能关键型代码中执行显式缓冲区管理。

 

 IO缓冲区 非直接缓冲区 

 

// 使用直接缓冲区完成文件的复制(内存映射文件)
    static public void test2() throws IOException {
        long start = System.currentTimeMillis();
        FileChannel inChannel = FileChannel.open(Paths.get("f://1.mp4"), StandardOpenOption.READ);
        FileChannel outChannel = FileChannel.open(Paths.get("f://2.mp4"), StandardOpenOption.WRITE,
                StandardOpenOption.READ, StandardOpenOption.CREATE);
        // 内存映射文件
        MappedByteBuffer inMappedByteBuf = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());
        MappedByteBuffer outMappedByteBuffer = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size());
        // 直接对缓冲区进行数据的读写操作
        byte[] dsf = new byte[inMappedByteBuf.limit()];
        inMappedByteBuf.get(dsf);
        outMappedByteBuffer.put(dsf);
        inChannel.close();
        outChannel.close();
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    // 1.利用通道完成文件的复制(非直接缓冲区)
    static public void test1() throws IOException { // 4400
        long start = System.currentTimeMillis();
        FileInputStream fis = new FileInputStream("f://1.mp4");
        FileOutputStream fos = new FileOutputStream("f://2.mp4");
        // ①获取通道
        FileChannel inChannel = fis.getChannel();
        FileChannel outChannel = fos.getChannel();
        // ②分配指定大小的缓冲区
        ByteBuffer buf = ByteBuffer.allocate(1024);
        while (inChannel.read(buf) != -1) {
            buf.flip();// 切换为读取数据
            // ③将缓冲区中的数据写入通道中
            outChannel.write(buf);
            buf.clear();
        }
        outChannel.close();
        inChannel.close();
        fos.close();
        fis.close();
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

 

Unity C#基础:委托与事件 在面试中,委托与事件几乎是必问的。如果面试官和面试者互不相识,面试官不问委托,那我严重怀疑这家公司的技术水平,这个可以说是C#入门与掌握的分水岭之一,非常重要。所以,这里我整理一片笔记,对委托和事件做一个全面的整理和归纳。这里重在理解,只有理解了才能真正掌握它。 目录 目录 1. 为什么C#会有委托事件? 2.观察者模式的缺陷: 3.为什么要费这么大劲? 1. 为... 阅读详情

相关推荐

C# 委托简述

使用关键字delegate声明委托除了使用delegate定义 委托以外C#提供两个定义好的泛型委托Action与Func) (当然你也可以使用delegate自定义泛型委托)这里先介绍两个C#定义的委托,相信很多人都在使用,不管你清不清楚什么是委托Action:是无返回值的泛型委托。下面action 表示无参,无返回值的委托//定义委托action();//使用方式1//使用方式2Console.WriteLine("我是传入的无参无返回值的委托方法");

qq_44217121的博客 1702

电力系统网络安全问题及解决措施.pdf

电力系统网络安全问题及解决措施.pdf

C# 委托 delegate

访问修饰默认不写 为public 在别的命名空间中也能使用private 其它命名空间就不能用了一般使用public申明了一个可以用来存储无参无返回值函数的容器这里只是定义了规则 并没有使用委托规则的申明 是不能重名(同一语句块中)表示用来装载或传递 返回值为int 有一个int参数的函数的 委托 容器规则委托是支持 泛型的 可以让返回值和参数 可变 更方便我们的使用使用系统自带委托 需要引用using System;无参无返回值action()

m0_53393728的博客 2461

文件缓冲区

引言 前段我把键盘丢了,今天我重新买了一个键盘,新键盘拿到手后,旧键盘又被我找到了!我真是……现在呢,我两个键盘它也没多大用,于是我决定把新键盘送给我在北京的好盆友foreb。我现在有两个送键盘的方案: 1.我亲自护送键盘,打车,买机票到北京,然后跑到他家,他在家的话,直接给他,不在家我再等等他,等他回来了给他。给他后我就 2.我走到操场那的韵达快递,键盘往工作人员那一递,得意洋洋地说:我要寄快递!工作人员递给我单子,我美滋滋地填好信息,然后转身回宿舍。 两个方式都可将键盘送到foreb手里(只送键盘,不存

qq_39208237的博客 1005

C# 语法进阶 委托

特性:特性是让我们的类,方法,属性,参数 之类的。在不修改源码的情况下,产生了更多功能,或者其他功能(打一个标签就生成了新的功能,本质他其实就是AOP的另一种 实现方式。【2】 在定义事件类的外部不能调用事件,另外事件就是在委托的前面增加一个event 关键字。【4】给委托传递相同的方式时, 生成的委托实列也是相同的(也就是同一个委托)【1】 在定义事件类的外部,他是不能使用=号来操作,只能使用+=委托是一个引用类型,其实他是一个类,保存方法的指针。【2】带返回值的多播委托只返回最后一个方法的值。

weixin_43847546的博客 1626

【C#】C#结构体,枚举,泛型,事件,委托

一.结构体 二.特殊的结构体(ref struct): 三.枚举 四.泛型 泛型的使用: 1.泛型类:定义一个泛型类,使用类型参数T 2.泛型方法:在方法定义中使用类型参数 3.泛型接口 五.委托及泛型委托 委托 泛型委托 六.事件 事件: 泛型事件:使用泛型委托(如EventHandler)来声明事件,可以传递更具体的事件数据。 七.事件,委托,泛型结合使用

冰茶的博客 1475

到二区

在二区呆了一天!感觉不错,就是没活力,时间长了就觉得老了

国王游舞密传 22万+

C# 简单委托实例

@TOCC# 委托 1.什么是委托 1)从数据结构来讲,委托个类一样是一种用户自定义类型 2)从设计模式来讲,委托(类)提供了方法(对象)的抽象 既然委托是一种类型,那么他存储的是什么数据? 委托是方法的抽象,他存储的就是一系列具有相同签名和返回类型的方法和地址.调用委托的时候,委托包含的所有方法将被执行. 客观解释:委托就是一个类,他定义了方法的类型,使得可以将方法当做另一个方法的参数来进行传递...

weixin_43527241的博客 3307

Java NIO 学习笔记之缓冲区及直接缓冲区和非直接缓冲区区别

一、NIO缓冲区 引言:Java NIO是jdk1.4引入的,官方给出的定义是NEW IO,是一种新的IO,也可以理解为no-block io(非阻塞io),NIO的出现和bio有相同的作用和目的,都是为了数据的输入和输出,但是方式有所不同,BIO是基于流的,而NIO是基于通道和缓冲区的,nio具有更高的效率。 Bio和Nio的对比 通道和缓冲区 Channel 负责传输...

搬砖刘疯狂 1730

浅析C#中的委托

委托是寻址方法的.NET版本。在C++中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的。而.NET委托完全不同,委托是安全类型的类,它定义了返回类型和参数的类型。 当把方法传递给其他方法时,需要使用委托。C#中使用一个类时,分两个阶段。首先需要定义这个类,即告诉编译器这个类由什么组成的。然后,实例化一个对象(除非只使用静态方法)。对于委托也是类似,也需要两个步骤。首先必须定义要使用的委

一蓑烟雨任平生 也无风雨也无晴 4483

浅谈c#委托的四种用法及lambda匿名委托

c#委托是一个类,可以定义一种方法类型,将有这种类型的函数当做参数进行传递,即他是一个可以把方法作为参数的类。 这里通过一个小功能分别说明一下c#委托(delegate、Action、Func、predicate)的用法。 如下图所示: Form1窗体里有两个进度条,点击start按钮,他们同时进行读取,这里就需要用到多线程。因为两个进度条如果在一个线程内,只能一个一个的读取。而用到多线程就要

一无所有 1万+

缓冲与非缓冲I/O、直接与非直接I/O、阻塞与非阻塞I/O、同步与异步I/O

文件读写方式的各种差异,导致I/O的分类多种多样。最常见的有缓冲与非缓冲I/O、直接与非直接I/O、阻塞与非阻塞I/O、同步与异步I/O。 根据是否利用标准库缓存,可以把文件I/O分为缓冲I/O与非缓冲I/O。 缓冲I/O,是指利用标准库缓存来加速文件的访问,而标准库内部再通过系统调度访问文件。 非缓冲I/O,是指直接通过系统调用来访问文件,不再经过标准库缓存。 这里所说的...

耿小渣的进阶之路 1189

C#编程-实现委托

委托是可以存储对方法的引用的对象。在C#中,委托允许您动态地改变类中方法的引用。考虑咖啡售货机的示例,它配置不同口味的咖啡,例如卡布奇诺咖啡和黑咖啡。在选择所需口味的咖啡时,售货机决定混合各种成分,例如奶粉、咖啡粉、热水、卡布奇诺咖啡粉。所有的材料都被放置在售货机内的不同容器中。当您选择喜欢的口味时,就会混合所需的材料,咖啡会从机器出来。假设您选择了黑咖啡,咖啡机将调用方法以仅混合和倒出热水和咖啡粉。按下配置黑咖啡所需的按钮时,就会动态确定这些方法的引用。委托是引用类型变量,它包含对方法的引用。

RZer的博客 1029

缓冲区和通道

缓冲区 java.nio包提供了对缓冲区的支持,缓冲区是一种对象,表示存储在内存中的数据流。 缓冲区常被用来提高那些读取输入和发送输出的程序的性能。它们让程序能够将大量的数据存储到内存中,这样使用和修改这些数据时速度将快很多。 对于java的每种基本数据类型,都有相应的缓冲区:ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,Lon...

kuangpeng1956的博客 4万+

C#中委托和事件的区别

事件就是委托属性啊,有个add和remove以及一个私有委托 很多人说:“总是感觉委托和事件没什么区别,调用事件不就是相当于调用多个委托么?” 不全对,事件之于委托,就相当于,集合的属性之于集合的元素,注意:事件封装了一层,事件其实就是一个特殊的多播委托 class Program { public delegate void SendHandler(string str); public e...

陈云佳的专栏 3769

C#委托的使用方法

C# 委托的使用方法1 委托的定义2 什么时候使用委托3 委托有哪些形式?4 委托的语法,使用5 委托的使用流程 1 委托的定义 C# 中的委托(Delegate)类似于 C 或 C++ 中函数的 指针 。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 Sys...

nippon1218的博客 1459

C# 委托和事件(委托)

回调(callback)函数是Windows编程的一个重要部分。C或C++编程背景,在许多Windows API中使用过回调。VB添加AddressOf关键字后,开发人员就可以利用以前一度受到限制的API。回调函数实际上是方法调用的指针也称为函数指针。.NET以委托的形式实现函数指针的概念。C中函数指针只不过是一个指向存储单元的指针,无法说出这个指针实际指向什么,像参数和返回类型等更不知晓。

钢铁男儿 733

C#委托使用

C#委托使用案例 委托的使用 假定有两个对象A和B,在A中实例化了对象B,那么A可以访问B中的方法,反过来B不能直接访问A中的方法,所以使用委托。 委托的使用步骤:条件(在A对象中实例化了B) (1)、在B中声明一个委托原型 (2)、在A中根据委托原型编写所需要的委托方法 (3)、在B中利用声明的委托原型声明一个委托变量 (4)、在A中通过委托变量和委托方法关联 投票器类的抽取 根据面向对象编程原...

小人物 3783
上一篇: make和rest用法
下一篇: 通道(Channel)的原理获取
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值